{"Id":253,"Name":null,"Description":null,"FirmwareVersion":"V04b.8601.2411.1.0.16.4411.2409.25","InProgress":false,"MessageTypes":[{"Id":7797,"Code":"WSTP","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":2,"Template":"Sentry-WSTP;<<imei>>;STATUS=<<status_data>>;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":"^Sentry-WSTP;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;GENERAL=[^;;]*;[^;]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7796,"Code":"ALA-F","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":2,"Template":"Sentry-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":"^Sentry-ALA-F;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;GENERAL=[^;;]*;[^;]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7795,"Code":"ALA-W","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":1,"Template":"Sentry-ALA-W;<<imei>>;STATUS=<<status_data>>;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":"^Sentry-ALA-W;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;GENERAL=[^;;]*;[^;]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7794,"Code":"WTS","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":2,"Template":"Sentry-WTS;<<imei>>;STATUS=<<status_data>>;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":"^Sentry-WTS;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;GENERAL=[^;;]*;[^;]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7702,"Code":"ACK-WELCHECK-SMS","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":true,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"{{welfare single<<data>>|welfare off<<data>>}}","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":true,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":false,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":{"Id":5586,"Protocol":{"Id":253,"Code":"Access PS Sentry","Version":"0.1","FirmwareVersion":"V04b.8601.2411.1.0.16.4411.2409.25","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":false},"Name":"setCheckInOutWelfare","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// setCheckInOutWelfare\r\n// Check In: AB 10 04 00 2F EC 03 00 04 02 43 01\r\n// Check Out: AB 10 04 00 0E FC 02 00 04 02 43 00\r\nvar msg = [];\r\nvar configs = [];\r\nvar configsSMS = [];\r\nvar messageBody = '04';\r\nvar key = '43';\r\nvar keyLength = '02'\r\nvar value = '';\r\nvar dataSMS = '';\r\n// second version of the logic\r\nif ((params.ReadState.Charging == 'true') && (params.Welfare.Mode == '1')) {\r\n    value += '00'; // '00' Check Out\r\n    dataSMS = 'welfareoff';\r\n} else if ((params.ReadState.Charging == 'false') && (params.Welfare.Mode == '1')) {\r\n    value += '01'; //   '01' Check In\r\n    dataSMS = 'checkin';\r\n}\r\n// manual check in and checkout\r\n/*\r\nif (params.Welfare.Check) {\r\n    value += params.Welfare.Check ; //  '00' Check Out  '01' Check In\r\n    dataSMS = 'checkin';  \r\n} else {\r\n    value += '00'; // Default Check Out\r\n    dataSMS = 'welfareoff'; \r\n} \r\n*/\r\nmessageBody += keyLength + key + value;\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar totalLength = '0400'\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":null},"CacheImei":false,"RegEx":"^(welfare single[^|]*|welfare off[^|]*)","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7701,"Code":"ACK-NEWWEL-SMS","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":true,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"{{Old welfare<<data>>|New welfare<<data>>}}","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":true,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":false,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":{"Id":5412,"Protocol":{"Id":253,"Code":"Access PS Sentry","Version":"0.1","FirmwareVersion":"V04b.8601.2411.1.0.16.4411.2409.25","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":false},"Name":"setExtraEnableControl","TemplateSMS":"<<dataSMS>>","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// SMS newwelfare0: Disable the new welfare feature and switch to the old welfare. newwelfare1: Switch to the new welfare feature.\r\nvar msg = [];\r\nvar configs = [];\r\nvar configsSMS = [];\r\nvar value = '';\r\nvar dataSMS = '';\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\n// 00000001000000000000000000001000\r\nvalue += '0000000';\r\nvalue += '1'; // Stop call sequence ON\r\nvalue += '00000000000000000000'; // other bits until 28\r\nif (params.Welfare.EnableDisableWelfare == 'false') {\r\n    value += '0000'; // Force mode to old welfare amber  \r\n    dataSMS = 'newwelfare0';\r\n} else { // depends on the selection\r\n    if (params.Welfare.Mode == '0') {\r\n        value += '0000'; // old welfare amber\r\n        dataSMS = 'newwelfare0';\r\n    } else {\r\n        value += '1000'; // new welfare  cyclic // recurrent\r\n        dataSMS = 'newwelfare1';\r\n    }\r\n}\r\nvalue = reverseString(value);\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\nvar prefix = 'AB10' + '0700' + 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 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\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":5463,"Parent":{"Id":5463,"Protocol":{"Id":253,"Code":"Access PS Sentry","Version":"0.1","FirmwareVersion":"V04b.8601.2411.1.0.16.4411.2409.25","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":false},"Name":"setWelfareCheck","TemplateSMS":"<<dataSMS>>","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// SMS version Example: Welfare1,600,120,1 Reply:  Welfarealarm.  Example: Welfare0 Reply: Welfarecheckoff.   Welfare<n>,<setuptime>,<warningtime>,<callYes/No>\r\nvar msg = [];\r\nvar configs = [];\r\nvar configsSMS = [];\r\nvar value = '';\r\nvar value2 = '';\r\nvar time;\r\nvar dataSMS = '';\r\n// [Time Out] - [Prealarm] must be >= 120 s.\r\nif (params.Welfare.EnableDisableWelfare == 'true') {\r\n    // second version of the logic\r\n    value += '1'; //Enable \r\n    dataSMS = `Welfare1,${(params.Welfare.Timeout * 60)},${(params.Welfare.Prealarm * 60)},1`;\r\n    // First version of the logic    \r\n    /*    if ((params.ReadState.Charging == 'true') && (params.Welfare.Mode == '1')) {\r\n            value += '0'; //Disable when device is charging (on the dock) and recurrent mode is selected\r\n            dataSMS = 'Welfare0';\r\n        } else {\r\n            value += '1'; //Enable in the other options\r\n            dataSMS = `Welfare1,${(params.Welfare.Timeout * 60)},${(params.Welfare.Prealarm * 60)},1`;\r\n        } */\r\n} else {\r\n    value += '0'; //Disable\r\n    dataSMS = 'Welfare0';\r\n}\r\nif (params.Welfare.Timeout) {\r\n    time = params.Welfare.Timeout * 60; //in seconds  this is value in protocol\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\n//if (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 += '1'; // Enable Dial Warning Time\r\nif (params.Welfare.Prealarm) {\r\n    if ((params.Welfare.Timeout - params.Welfare.Prealarm) >= 2) {\r\n        time = params.Welfare.Prealarm * 60; //in seconds  this is  WarningTime in protocol\r\n        value2 += ('0000000000000000000000000000000' + decimalToBinary(parseInt(time))).slice(-31);\r\n    } else { // If the difference between them is less than 2 minutes, we fix Prealarm\r\n        value2 += ('0000000000000000000000000000000' + decimalToBinary(parseInt((params.Welfare.Timeout - 2) * 60))).slice(-31);\r\n    }\r\n} else {\r\n    value2 += ('0000000000000000000000000000000' + decimalToBinary(parseInt(300))).slice(-31);\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\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\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":25},"HasAck":true,"HexString":true,"SendAttempts":2,"Order":26},"CacheImei":false,"RegEx":"^(Old welfare[^|]*|New welfare[^|]*)","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7700,"Code":"ACK-WELFARE-SMS","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":true,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Welfare<<data>>","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":true,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":false,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":{"Id":5463,"Protocol":{"Id":253,"Code":"Access PS Sentry","Version":"0.1","FirmwareVersion":"V04b.8601.2411.1.0.16.4411.2409.25","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":false},"Name":"setWelfareCheck","TemplateSMS":"<<dataSMS>>","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// SMS version Example: Welfare1,600,120,1 Reply:  Welfarealarm.  Example: Welfare0 Reply: Welfarecheckoff.   Welfare<n>,<setuptime>,<warningtime>,<callYes/No>\r\nvar msg = [];\r\nvar configs = [];\r\nvar configsSMS = [];\r\nvar value = '';\r\nvar value2 = '';\r\nvar time;\r\nvar dataSMS = '';\r\n// [Time Out] - [Prealarm] must be >= 120 s.\r\nif (params.Welfare.EnableDisableWelfare == 'true') {\r\n    // second version of the logic\r\n    value += '1'; //Enable \r\n    dataSMS = `Welfare1,${(params.Welfare.Timeout * 60)},${(params.Welfare.Prealarm * 60)},1`;\r\n    // First version of the logic    \r\n    /*    if ((params.ReadState.Charging == 'true') && (params.Welfare.Mode == '1')) {\r\n            value += '0'; //Disable when device is charging (on the dock) and recurrent mode is selected\r\n            dataSMS = 'Welfare0';\r\n        } else {\r\n            value += '1'; //Enable in the other options\r\n            dataSMS = `Welfare1,${(params.Welfare.Timeout * 60)},${(params.Welfare.Prealarm * 60)},1`;\r\n        } */\r\n} else {\r\n    value += '0'; //Disable\r\n    dataSMS = 'Welfare0';\r\n}\r\nif (params.Welfare.Timeout) {\r\n    time = params.Welfare.Timeout * 60; //in seconds  this is value in protocol\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\n//if (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 += '1'; // Enable Dial Warning Time\r\nif (params.Welfare.Prealarm) {\r\n    if ((params.Welfare.Timeout - params.Welfare.Prealarm) >= 2) {\r\n        time = params.Welfare.Prealarm * 60; //in seconds  this is  WarningTime in protocol\r\n        value2 += ('0000000000000000000000000000000' + decimalToBinary(parseInt(time))).slice(-31);\r\n    } else { // If the difference between them is less than 2 minutes, we fix Prealarm\r\n        value2 += ('0000000000000000000000000000000' + decimalToBinary(parseInt((params.Welfare.Timeout - 2) * 60))).slice(-31);\r\n    }\r\n} else {\r\n    value2 += ('0000000000000000000000000000000' + decimalToBinary(parseInt(300))).slice(-31);\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\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\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":25},"CacheImei":false,"RegEx":"^Welfare[^e]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":7700,\"Code\":\"ACK-WELFARE-SMS\",\"Name\":null,\"MessageCode\":\"ACK\",\"NeedAck\":false,\"IsAck\":true,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":0,\"Template\":\"Set Welfare check<<data>>\",\"HasTemplateGlobal\":false,\"ResponseTemplate\":null,\"TemplateGlobal\":null,\"LongConnection\":true,\"HexString\":false,\"AckFirst\":false,\"ScaipH\":false,\"DoNotSendCommands\":false,\"ProtocolsLibraryMethod\":null,\"ProtocolsLibraryMethodArgs\":null,\"Command\":{\"Id\":5463,\"Protocol\":{\"Id\":253,\"Code\":\"Access PS Sentry\",\"Version\":\"0.3\",\"FirmwareVersion\":\"V04b.8601.2411.1.0.16.4411.2409.25\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"setWelfareCheck\",\"TemplateSMS\":\"<<dataSMS>>\",\"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// SMS version Example: Welfare1,600,120,1 Reply:  Welfarealarm.  Example: Welfare0 Reply: Welfarecheckoff.   Welfare<n>,<setuptime>,<warningtime>,<callYes/No>\\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\nvar configsSMS = [];\\r\\nvar value = '';\\r\\nvar value2 = '';\\r\\nvar time;\\r\\nvar dataSMS = '';\\r\\n// [Time Out] - [Prealarm] must be >= 120 s.\\r\\nif (params.Welfare.EnableDisableWelfare == 'true') {\\r\\n    // second version of the logic\\r\\n    value += '1'; //Enable \\r\\n    dataSMS = `Welfare1,${(params.Welfare.Timeout * 60)},${(params.Welfare.Prealarm * 60)},1`;\\r\\n    // First version of the logic    \\r\\n    /*    if ((params.ReadState.Charging == 'true') && (params.Welfare.Mode == '1')) {\\r\\n            value += '0'; //Disable when device is charging (on the dock) and recurrent mode is selected\\r\\n            dataSMS = 'Welfare0';\\r\\n        } else {\\r\\n            value += '1'; //Enable in the other options\\r\\n            dataSMS = `Welfare1,${(params.Welfare.Timeout * 60)},${(params.Welfare.Prealarm * 60)},1`;\\r\\n        } */\\r\\n} else {\\r\\n    value += '0'; //Disable\\r\\n    dataSMS = 'Welfare0';\\r\\n}\\r\\nif (params.Welfare.Timeout) {\\r\\n    time = params.Welfare.Timeout * 60; //in seconds  this is value in protocol\\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\\n//if (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 += '1'; // Enable Dial Warning Time\\r\\nif (params.Welfare.Prealarm) {\\r\\n    if ((params.Welfare.Timeout - params.Welfare.Prealarm) >= 2) {\\r\\n        time = params.Welfare.Prealarm * 60; //in seconds  this is  WarningTime in protocol\\r\\n        value2 += ('0000000000000000000000000000000' + decimalToBinary(parseInt(time))).slice(-31);\\r\\n    } else { // If the difference between them is less than 2 minutes, we fix Prealarm\\r\\n        value2 += ('0000000000000000000000000000000' + decimalToBinary(parseInt((params.Welfare.Timeout - 2) * 60))).slice(-31);\\r\\n    }\\r\\n} else {\\r\\n    value2 += ('0000000000000000000000000000000' + decimalToBinary(parseInt(300))).slice(-31);\\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\\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\\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\":25},\"CacheImei\":false,\"RegEx\":\"^Set Welfare check[^k]*\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1741115731}],"Tags":[]},{"Id":7681,"Code":"ALSOS-C","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":1,"Template":"Sentry-ALSOS-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":"^Sentry-ALSOS-C;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;GENERAL=[^;;]*;[^;]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7540,"Code":"ALA-C","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":1,"Template":"Sentry-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":"^Sentry-ALA-C;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;GENERAL=[^;;]*;[^;]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":7540,\"Code\":\"ALA-C\",\"Name\":null,\"MessageCode\":\"ALA-C\",\"NeedAck\":false,\"IsAck\":false,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":0,\"Template\":\"Sentry-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\":\"^Sentry-ALA-C;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;GENERAL=[^;;]*;[^;]*\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1753258739}],"Tags":[]},{"Id":7680,"Code":"ALW","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":1,"Template":"Sentry-ALW;<<imei>>;STATUS=<<status_data>>;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":"^Sentry-ALW;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;GENERAL=[^;;]*;[^;]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7679,"Code":"WELFOK","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":1,"Template":"Sentry-WELFOK;<<imei>>;STATUS=<<status_data>>;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":"^Sentry-WELFOK;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;GENERAL=[^;;]*;[^;]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7513,"Code":"ALA","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":1,"Template":"Sentry-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":"^Sentry-ALA;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;GENERAL=[^;;]*;[^;]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7504,"Code":"F-ACK-Data Format Invalid","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":true,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Sentry-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":"^Sentry-ACK;[^;]*;AB0003004BF3[^ ]*7F0121","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7503,"Code":"ACK-Out Of Service","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":true,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Sentry-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":"^Sentry-ACK;[^;]*;AB0003005BF1[^ ]*7F0130","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":7503,\"Code\":\"F-ACK-Out Of Service\",\"Name\":null,\"MessageCode\":\"ACK\",\"NeedAck\":false,\"IsAck\":false,\"IsFailAck\":true,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":0,\"Template\":\"Sentry-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\":\"^Sentry-ACK;[^;]*;AB0003005BF1[^ ]*7F0130\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1774552097}],"Tags":[]},{"Id":7556,"Code":"ACK-NOMOTION","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":true,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Sentry;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":5480,"Protocol":{"Id":253,"Code":"Access PS Sentry","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":"^Sentry;ACK-NOMOTION;[^;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7562,"Code":"ACK-GSRV","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":true,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Sentry;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":5469,"Protocol":{"Id":253,"Code":"Access PS Sentry","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":"^Sentry;ACK-GSRV;[^;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7563,"Code":"ACK-GAPN","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":true,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Sentry;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":5465,"Protocol":{"Id":253,"Code":"Access PS Sentry","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":"^Sentry;ACK-GAPN;[^;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7560,"Code":"ACK-FIRM","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":true,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Sentry;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":5483,"Protocol":{"Id":253,"Code":"Access PS Sentry","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":"^Sentry;ACK-FIRM;[^;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7557,"Code":"ACK-CUSTID","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":true,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Sentry;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":5481,"Protocol":{"Id":253,"Code":"Access PS Sentry","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":"^Sentry;ACK-CUSTID;[^;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7582,"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":5407,"Protocol":{"Id":253,"Code":"Access PS Sentry","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":2,"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\":7582,\"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\":true,\"HexString\":false,\"AckFirst\":false,\"ScaipH\":false,\"DoNotSendCommands\":false,\"ProtocolsLibraryMethod\":null,\"ProtocolsLibraryMethodArgs\":null,\"Command\":{\"Id\":5407,\"Protocol\":{\"Id\":253,\"Code\":\"Access PS Sentry\",\"Version\":\"0.3\",\"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\":13},\"CacheImei\":false,\"RegEx\":\"^(reboot ok.|reiniciar ok.)\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1741115252}],"Tags":[]},{"Id":7581,"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":5451,"Protocol":{"Id":253,"Code":"Access PS Sentry","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":5452,"Parent":{"Id":5452,"Protocol":{"Id":253,"Code":"Access PS Sentry","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\nvar value = '47214A1A3440414243567355571F445310333075';\r\n/* \r\n47 Get device or custom id \r\n21 SpeedDial\r\n4A Wifi Network\r\n1A Firmware Long\r\n34 Contacts\r\n40 APN\r\n41 APNusername\r\n42 APNpass\r\n43 server details\r\n56 fall sensitivity\r\n73 Beacon List\r\n55 Tilt Angle Alert\r\n57 Welfare\r\n1F System language\r\n44 time interval\r\n53 No motion alert\r\n10 Ring tome vol\r\n33 allow list\r\n30 Emergency numbers\r\n75 Extra */\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar command = '02';\r\nvar keyLength = '15';\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' + '1700' + 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},"HasAck":true,"HexString":true,"SendAttempts":4,"Order":18},"CacheImei":false,"RegEx":"^Mode:[^:]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7580,"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":5462,"Protocol":{"Id":253,"Code":"Access PS Sentry","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":7579,"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":5461,"Protocol":{"Id":253,"Code":"Access PS Sentry","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":[],"Tags":[]},{"Id":7578,"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":5460,"Protocol":{"Id":253,"Code":"Access PS Sentry","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 = '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":15},"CacheImei":false,"RegEx":"^(Set ok.|reset ok.|Reiniciar ok.)","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":7578,\"Code\":\"ACK-RST\",\"Name\":null,\"MessageCode\":\"ACK\",\"NeedAck\":false,\"IsAck\":true,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":0,\"Template\":\"{{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\":5460,\"Protocol\":{\"Id\":253,\"Code\":\"Access PS Sentry\",\"Version\":\"0.3\",\"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\":15},\"CacheImei\":false,\"RegEx\":\"^(reset ok.|Reiniciar ok.)\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1741115310}],"Tags":[]},{"Id":7577,"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":5459,"Protocol":{"Id":253,"Code":"Access PS Sentry","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\":7577,\"Code\":\"ACK-FLU\",\"Name\":null,\"MessageCode\":\"ACK\",\"NeedAck\":false,\"IsAck\":true,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":0,\"Template\":\"{{flush ok.|Vaciado del cache OK!}}\",\"HasTemplateGlobal\":false,\"ResponseTemplate\":null,\"TemplateGlobal\":null,\"LongConnection\":true,\"HexString\":false,\"AckFirst\":false,\"ScaipH\":false,\"DoNotSendCommands\":false,\"ProtocolsLibraryMethod\":null,\"ProtocolsLibraryMethodArgs\":null,\"Command\":{\"Id\":5459,\"Protocol\":{\"Id\":253,\"Code\":\"Access PS Sentry\",\"Version\":\"0.3\",\"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\":9},\"CacheImei\":false,\"RegEx\":\"^(flush ok.|Vaciado del cache OK!)\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1741114901}],"Tags":[]},{"Id":7576,"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":5458,"Protocol":{"Id":253,"Code":"Access PS Sentry","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":2,"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\":7576,\"Code\":\"ACK-OFF\",\"Name\":null,\"MessageCode\":\"ACK\",\"NeedAck\":false,\"IsAck\":true,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":0,\"Template\":\"{{Power off.|Apagar.}}\",\"HasTemplateGlobal\":false,\"ResponseTemplate\":null,\"TemplateGlobal\":null,\"LongConnection\":true,\"HexString\":false,\"AckFirst\":false,\"ScaipH\":false,\"DoNotSendCommands\":false,\"ProtocolsLibraryMethod\":null,\"ProtocolsLibraryMethodArgs\":null,\"Command\":{\"Id\":5458,\"Protocol\":{\"Id\":253,\"Code\":\"Access PS Sentry\",\"Version\":\"0.3\",\"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\":14},\"CacheImei\":false,\"RegEx\":\"^(Power off.|Apagar.)\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1741115215}],"Tags":[]},{"Id":7575,"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":5457,"Protocol":{"Id":253,"Code":"Access PS Sentry","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":[],"Tags":[]},{"Id":7574,"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":5466,"Protocol":{"Id":253,"Code":"Access PS Sentry","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":2,"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\":7574,\"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 ubicaci?n recibida!}}\",\"HasTemplateGlobal\":false,\"ResponseTemplate\":null,\"TemplateGlobal\":null,\"LongConnection\":true,\"HexString\":false,\"AckFirst\":false,\"ScaipH\":false,\"DoNotSendCommands\":false,\"ProtocolsLibraryMethod\":null,\"ProtocolsLibraryMethodArgs\":null,\"Command\":{\"Id\":5466,\"Protocol\":{\"Id\":253,\"Code\":\"Access PS Sentry\",\"Version\":\"0.3\",\"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\":10},\"CacheImei\":false,\"RegEx\":\"^(Device location request have received!|Solicitud de ubicaci?n recibida!)\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1741115546}],"Tags":[]},{"Id":7573,"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":5464,"Protocol":{"Id":253,"Code":"Access PS Sentry","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\":7573,\"Code\":\"ACK-APN\",\"Name\":null,\"MessageCode\":\"ACK\",\"NeedAck\":false,\"IsAck\":true,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":0,\"Template\":\"{{Set APN ok.|Configuraci?n APN OK.}}\",\"HasTemplateGlobal\":false,\"ResponseTemplate\":\"ok1\",\"TemplateGlobal\":null,\"LongConnection\":true,\"HexString\":false,\"AckFirst\":false,\"ScaipH\":false,\"DoNotSendCommands\":false,\"ProtocolsLibraryMethod\":null,\"ProtocolsLibraryMethodArgs\":null,\"Command\":{\"Id\":5464,\"Protocol\":{\"Id\":253,\"Code\":\"Access PS Sentry\",\"Version\":\"0.3\",\"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\":0},\"CacheImei\":false,\"RegEx\":\"^(Set APN ok.|Configuraci?n APN OK.)\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1741113861},{"Type":1,"NewValue":"{\"Id\":7573,\"Code\":\"ACK-APN\",\"Name\":null,\"MessageCode\":\"ACK\",\"NeedAck\":false,\"IsAck\":true,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":0,\"Template\":\"{{Set APN ok.|Configuración APN OK.}}\",\"HasTemplateGlobal\":false,\"ResponseTemplate\":\"ok1\",\"TemplateGlobal\":null,\"LongConnection\":true,\"HexString\":false,\"AckFirst\":false,\"ScaipH\":false,\"DoNotSendCommands\":false,\"ProtocolsLibraryMethod\":null,\"ProtocolsLibraryMethodArgs\":null,\"Command\":{\"Id\":5464,\"Protocol\":{\"Id\":253,\"Code\":\"Access PS Sentry\",\"Version\":\"0.5\",\"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\":0},\"CacheImei\":false,\"RegEx\":\"^(Set APN ok.|Configuración APN OK.)\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1743511494},{"Type":1,"NewValue":"{\"Id\":7573,\"Code\":\"ACK-APN\",\"Name\":null,\"MessageCode\":\"ACK\",\"NeedAck\":false,\"IsAck\":true,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":0,\"Template\":\"{{Set APN ok.|Configuraci?n APN OK.}}\",\"HasTemplateGlobal\":false,\"ResponseTemplate\":\"ok1\",\"TemplateGlobal\":null,\"LongConnection\":true,\"HexString\":false,\"AckFirst\":false,\"ScaipH\":false,\"DoNotSendCommands\":false,\"ProtocolsLibraryMethod\":null,\"ProtocolsLibraryMethodArgs\":null,\"Command\":{\"Id\":5464,\"Protocol\":{\"Id\":253,\"Code\":\"Access PS Sentry\",\"Version\":\"0.5\",\"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\":0},\"CacheImei\":false,\"RegEx\":\"^(Set APN ok.|Configuraci?n APN OK.)\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1744058671},{"Type":1,"NewValue":"{\"Id\":7573,\"Code\":\"ACK-APN\",\"Name\":null,\"MessageCode\":\"ACK\",\"NeedAck\":false,\"IsAck\":true,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":0,\"Template\":\"{{Set APN ok.|Configuraci?n APN OK.}}\",\"HasTemplateGlobal\":false,\"ResponseTemplate\":\"ok1\",\"TemplateGlobal\":null,\"LongConnection\":false,\"HexString\":false,\"AckFirst\":false,\"ScaipH\":false,\"DoNotSendCommands\":true,\"ProtocolsLibraryMethod\":null,\"ProtocolsLibraryMethodArgs\":null,\"Command\":{\"Id\":5464,\"Protocol\":{\"Id\":253,\"Code\":\"Access PS Sentry\",\"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.|Configuraci?n APN OK.)\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1781714493}],"Tags":[]},{"Id":7572,"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":5456,"Protocol":{"Id":253,"Code":"Access PS Sentry","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)  Man Down Settings Sensitivity\r\n//var messageBody = '02';\r\nvar sensitivity = '';\r\nvar dataSMS = '';\r\nvar value = '';\r\nif (params.ManDownSettings.EnableDisableManDownSettings == 'true') {\r\n    value += '1';\r\n    value += '100'; //Dial\r\n    //}\r\n    if (params.ManDownSettings.Sensitivity) {\r\n        var sensiString = params.ManDownSettings.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\":7572,\"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!|Configuraci?n 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\":5456,\"Protocol\":{\"Id\":253,\"Code\":\"Access PS Sentry\",\"Version\":\"0.3\",\"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)  Man Down Settings Sensitivity\\r\\n//var messageBody = '02';\\r\\nvar sensitivity = '';\\r\\nvar dataSMS = '';\\r\\nvar value = '';\\r\\nif (params.ManDownSettings.EnableDisableManDownSettings == 'true') {\\r\\n    value += '1';\\r\\n    value += '100'; //Dial\\r\\n    //}\\r\\n    if (params.ManDownSettings.Sensitivity) {\\r\\n        var sensiString = params.ManDownSettings.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!|Configuraci?n alarma caida ok!)\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1741114415}],"Tags":[]},{"Id":7571,"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":5454,"Protocol":{"Id":253,"Code":"Access PS Sentry","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 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},"CacheImei":false,"RegEx":"^(Set contact number 10 ok.|Configuracin numero contacto 10 ok.)","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":7571,\"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.|Configuraci?n del n?mero de 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\":5454,\"Protocol\":{\"Id\":253,\"Code\":\"Access PS Sentry\",\"Version\":\"0.3\",\"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},\"CacheImei\":false,\"RegEx\":\"^(Set contact number 10 ok.|Configuraci?n del n?mero de contacto 10 OK.)\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1741114956}],"Tags":[]},{"Id":7570,"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":5453,"Protocol":{"Id":253,"Code":"Access PS Sentry","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\":7570,\"Code\":\"ACK-SRV\",\"Name\":null,\"MessageCode\":\"ACK\",\"NeedAck\":false,\"IsAck\":true,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":0,\"Template\":\"{{Set IP ok.|Configuraci?n 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\":5453,\"Protocol\":{\"Id\":253,\"Code\":\"Access PS Sentry\",\"Version\":\"0.3\",\"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},\"CacheImei\":false,\"RegEx\":\"^(Set IP ok.|Configuraci?n de IP OK)\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1741115582}],"Tags":[]},{"Id":7569,"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":5452,"Protocol":{"Id":253,"Code":"Access PS Sentry","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\nvar value = '47214A1A3440414243567355571F445310333075';\r\n/* \r\n47 Get device or custom id \r\n21 SpeedDial\r\n4A Wifi Network\r\n1A Firmware Long\r\n34 Contacts\r\n40 APN\r\n41 APNusername\r\n42 APNpass\r\n43 server details\r\n56 fall sensitivity\r\n73 Beacon List\r\n55 Tilt Angle Alert\r\n57 Welfare\r\n1F System language\r\n44 time interval\r\n53 No motion alert\r\n10 Ring tome vol\r\n33 allow list\r\n30 Emergency numbers\r\n75 Extra */\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar command = '02';\r\nvar keyLength = '15';\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' + '1700' + 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":[]},{"Id":7568,"Code":"ACK-GDATA","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":true,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Sentry;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":5452,"Protocol":{"Id":253,"Code":"Access PS Sentry","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\nvar value = '47214A1A3440414243567355571F445310333075';\r\n/* \r\n47 Get device or custom id \r\n21 SpeedDial\r\n4A Wifi Network\r\n1A Firmware Long\r\n34 Contacts\r\n40 APN\r\n41 APNusername\r\n42 APNpass\r\n43 server details\r\n56 fall sensitivity\r\n73 Beacon List\r\n55 Tilt Angle Alert\r\n57 Welfare\r\n1F System language\r\n44 time interval\r\n53 No motion alert\r\n10 Ring tome vol\r\n33 allow list\r\n30 Emergency numbers\r\n75 Extra */\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar command = '02';\r\nvar keyLength = '15';\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' + '1700' + 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":"^Sentry;ACK-GDATA;[^;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7567,"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":5450,"Protocol":{"Id":253,"Code":"Access PS Sentry","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":5452,"Parent":{"Id":5452,"Protocol":{"Id":253,"Code":"Access PS Sentry","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\nvar value = '47214A1A3440414243567355571F445310333075';\r\n/* \r\n47 Get device or custom id \r\n21 SpeedDial\r\n4A Wifi Network\r\n1A Firmware Long\r\n34 Contacts\r\n40 APN\r\n41 APNusername\r\n42 APNpass\r\n43 server details\r\n56 fall sensitivity\r\n73 Beacon List\r\n55 Tilt Angle Alert\r\n57 Welfare\r\n1F System language\r\n44 time interval\r\n53 No motion alert\r\n10 Ring tome vol\r\n33 allow list\r\n30 Emergency numbers\r\n75 Extra */\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar command = '02';\r\nvar keyLength = '15';\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' + '1700' + 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},"HasAck":true,"HexString":true,"SendAttempts":4,"Order":19},"CacheImei":false,"RegEx":"^1,[^,]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7566,"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":5449,"Protocol":{"Id":253,"Code":"Access PS Sentry","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":5452,"Parent":{"Id":5452,"Protocol":{"Id":253,"Code":"Access PS Sentry","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\nvar value = '47214A1A3440414243567355571F445310333075';\r\n/* \r\n47 Get device or custom id \r\n21 SpeedDial\r\n4A Wifi Network\r\n1A Firmware Long\r\n34 Contacts\r\n40 APN\r\n41 APNusername\r\n42 APNpass\r\n43 server details\r\n56 fall sensitivity\r\n73 Beacon List\r\n55 Tilt Angle Alert\r\n57 Welfare\r\n1F System language\r\n44 time interval\r\n53 No motion alert\r\n10 Ring tome vol\r\n33 allow list\r\n30 Emergency numbers\r\n75 Extra */\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar command = '02';\r\nvar keyLength = '15';\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' + '1700' + 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},"HasAck":true,"HexString":true,"SendAttempts":4,"Order":20},"CacheImei":false,"RegEx":"^A1:[^:]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7565,"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":5448,"Protocol":{"Id":253,"Code":"Access PS Sentry","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":5452,"Parent":{"Id":5452,"Protocol":{"Id":253,"Code":"Access PS Sentry","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\nvar value = '47214A1A3440414243567355571F445310333075';\r\n/* \r\n47 Get device or custom id \r\n21 SpeedDial\r\n4A Wifi Network\r\n1A Firmware Long\r\n34 Contacts\r\n40 APN\r\n41 APNusername\r\n42 APNpass\r\n43 server details\r\n56 fall sensitivity\r\n73 Beacon List\r\n55 Tilt Angle Alert\r\n57 Welfare\r\n1F System language\r\n44 time interval\r\n53 No motion alert\r\n10 Ring tome vol\r\n33 allow list\r\n30 Emergency numbers\r\n75 Extra */\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar command = '02';\r\nvar keyLength = '15';\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' + '1700' + 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},"HasAck":true,"HexString":true,"SendAttempts":4,"Order":21},"CacheImei":false,"RegEx":"^GRPS:[^:]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7564,"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":5455,"Protocol":{"Id":253,"Code":"Access PS Sentry","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 = '10'; // Enable, no SMS,\r\nif (params.AlertSettings.ReportMode) { //  Toggle Call\r\n    confSOS += params.AlertSettings.ReportMode;\r\n}\r\nconfSOS += '00000'; //   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,';\r\n    dataSMS += params.AlertSettings.ReportMode; //  Toggle Call\r\n    dataSMS += `,${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\":7564,\"Code\":\"ACK-EPHONE-SMS\",\"Name\":null,\"MessageCode\":\"ACK\",\"NeedAck\":false,\"IsAck\":true,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":0,\"Template\":\"{{Set contact number 1 ok.|Configuraci?n del n?mero de 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\":5455,\"Protocol\":{\"Id\":253,\"Code\":\"Access PS Sentry\",\"Version\":\"0.3\",\"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 = '10'; // Enable, no SMS,\\r\\nif (params.AlertSettings.ReportMode) { //  Toggle Call\\r\\n    confSOS += params.AlertSettings.ReportMode;\\r\\n}\\r\\nconfSOS += '00000'; //   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,';\\r\\n    dataSMS += params.AlertSettings.ReportMode; //  Toggle Call\\r\\n    dataSMS += `,${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.|Configuraci?n del n?mero de contacto 1 OK.)\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1741114263}],"Tags":[]},{"Id":7561,"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":5467,"Protocol":{"Id":253,"Code":"Access PS Sentry","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 = `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":[{"Type":1,"NewValue":"{\"Id\":7561,\"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>>|Configuraci?n de control de conexi?n<<data>>}}\",\"HasTemplateGlobal\":false,\"ResponseTemplate\":null,\"TemplateGlobal\":null,\"LongConnection\":true,\"HexString\":false,\"AckFirst\":false,\"ScaipH\":false,\"DoNotSendCommands\":false,\"ProtocolsLibraryMethod\":null,\"ProtocolsLibraryMethodArgs\":null,\"Command\":{\"Id\":5467,\"Protocol\":{\"Id\":253,\"Code\":\"Access PS Sentry\",\"Version\":\"0.3\",\"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[^|]*|Configuraci?n de control de conexi?n[^|]*)\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1741115094}],"Tags":[]},{"Id":7559,"Code":"ACK-LANG","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":true,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Sentry;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":5485,"Protocol":{"Id":253,"Code":"Access PS Sentry","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":"^Sentry;ACK-LANG;[^;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7558,"Code":"ACK-MODE","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":true,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Sentry;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":5482,"Protocol":{"Id":253,"Code":"Access PS Sentry","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":"^Sentry;ACK-MODE;[^;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7555,"Code":"ACK-FALLALERT","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":true,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Sentry;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":5479,"Protocol":{"Id":253,"Code":"Access PS Sentry","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":"^Sentry;ACK-FALLALERT;[^;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7554,"Code":"ACK-VOL","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":true,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Sentry;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":5478,"Protocol":{"Id":253,"Code":"Access PS Sentry","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":"^Sentry;ACK-VOL;[^;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7553,"Code":"PWRN","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Sentry-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":"^Sentry-PWRN;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;GENERAL=[^;;]*;[^;]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7552,"Code":"ALF","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":1,"Template":"Sentry-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":"^Sentry-ALF;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;GENERAL=[^;;]*;[^;]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7551,"Code":"ACK-SPEED","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Sentry;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":"^Sentry;ACK-SPEED;[^;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7550,"Code":"ACK-WIFI","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Sentry;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":"^Sentry;ACK-WIFI;[^;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7549,"Code":"BATCF","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Sentry-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":"^Sentry-BATCF;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;GENERAL=[^;;]*;[^;]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7548,"Code":"BATCN","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Sentry-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":"^Sentry-BATCN;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;GENERAL=[^;;]*;[^;]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7547,"Code":"COMM-SMS","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Sentry-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":"^Sentry-SMS;[^;]*;[^;]*","RegExGlobal":"^esendex[^e]*esendex[^x]*","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7546,"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":7545,"Code":"ALA-O","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":1,"Template":"Sentry-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":"^Sentry-ALA-O;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;GENERAL=[^;;]*;[^;]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":7545,\"Code\":\"ALA-O\",\"Name\":null,\"MessageCode\":\"ALA-O\",\"NeedAck\":false,\"IsAck\":false,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":0,\"Template\":\"Sentry-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\":\"^Sentry-ALA-O;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;GENERAL=[^;;]*;[^;]*\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1753258722}],"Tags":[]},{"Id":7544,"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":7543,"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":7542,"Code":"HRT","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Sentry-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":"^Sentry-HRT;[^;]*;STATUS=[^;;]*;ETIME=[^;;]*;GENERAL=[^;;]*;[^;;]*;HRT=[^;;]*;TLEVEL=[^;;]*;LABEL=[^=]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7541,"Code":"PWRF","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Sentry-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":"^Sentry-PWRF;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;GENERAL=[^;;]*;[^;]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7539,"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":7538,"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":7537,"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":7536,"Code":"F-ACK-Version Invalid","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":true,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Sentry-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":"^Sentry-ACK;[^;]*;AB00030018C5[^ ]*7F0111","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7535,"Code":"F-ACK-Key Invalid","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":true,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Sentry-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":"^Sentry-ACK;[^;]*;AB000300FFB5[^ ]*7F0116","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7534,"Code":"F-ACK-Encryption Invalid","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":true,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Sentry-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":"^Sentry-ACK;[^;]*;AB0003007BF5[^ ]*7F0112","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7533,"Code":"F-ACK-Checksum Error","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":true,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Sentry-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":"^Sentry-ACK;[^;]*;AB000300BD95[^ ]*7F0114","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7532,"Code":"F-ACK-BLE Password","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":true,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Sentry-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":"^Sentry-ACK;[^;]*;AB000300CC8F[^7;]*7F0140","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7531,"Code":"F-ACK-Address Resp","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":true,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Sentry-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":"^Sentry-ACK;[^;]*;AB0003006262[^ ]*7F0128","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7530,"Code":"ACK-global","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":true,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Sentry-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":"^Sentry-ACK;[^;]*;AB00030008C7[^ ]*7F0100","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7529,"Code":"F-ACK-Invalid Parameter","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":true,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Sentry-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":"^Sentry-ACK;[^;]*;AB000300EEA3[^ ]*7F0124","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7528,"Code":"F-ACK-Length Error","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":true,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Sentry-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":"^Sentry-ACK;[^;]*;AB0003005AE5[^ ]*7F0113","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7527,"Code":"ALF-C","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":1,"Template":"Sentry-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":"^Sentry-ALF-C;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;GENERAL=[^;;]*;[^;]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7526,"Code":"ALNM","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":1,"Template":"Sentry-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":"^Sentry-ALNM;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;GENERAL=[^;;]*;[^;]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7525,"Code":"ALSP","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":1,"Template":"Sentry-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":"^Sentry-ALSP;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;GENERAL=[^;;]*;[^;]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7524,"Code":"RTL","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Sentry-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":"^Sentry-RTL;[^;]*;[^;;]*;[^;;]*;[^;;]*;[^;;]*;[^;;]*;[^;;]*;[^;;]*;[^;;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7523,"Code":"ALA-S","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":1,"Template":"Sentry-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":"^Sentry-ALA-S;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;GENERAL=[^;;]*;[^;]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7522,"Code":"STP","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Sentry-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":"^Sentry-STP;[^;]*;STATUS=[^;;]*;ETIME=[^;;]*;GENERAL=[^;;]*;[^;;]*;STP=[^;;]*;LABEL=[^=]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7521,"Code":"BATL","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":1,"Template":"Sentry-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":"^Sentry-BATL;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;GENERAL=[^;;]*;[^;]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7520,"Code":"BATF","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Sentry-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":"^Sentry-BATF;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;GENERAL=[^;;]*;[^;]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7519,"Code":"ALMOV","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":1,"Template":"Sentry-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":"^Sentry-ALMOV;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;GENERAL=[^;;]*;[^;]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7518,"Code":"ALSOS","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":1,"Template":"Sentry-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":"^Sentry-ALSOS;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;GENERAL=[^;;]*;[^;]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7517,"Code":"F-ACK-No Memory","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":true,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Sentry-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":"^Sentry-ACK;[^;]*;AB000300CFB3[^ ]*7F0125","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7516,"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\":7516,\"Code\":\"CHK\",\"Name\":null,\"MessageCode\":\"CHK\",\"NeedAck\":false,\"IsAck\":false,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":0,\"Template\":\"Sentry-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\":\"^Sentry-HTB;[^;]*;STATUS=[^;;]*;TIME=[^;;]*;BATP=[^;;]*;SIGNAL=[^;;]*;WM=[^;;]*;GENERAL=[^=]*\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1744387798}],"Tags":[]},{"Id":7515,"Code":"CYC","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Sentry-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":"^Sentry-CYC;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;SIGNAL=[^;;]*;WM=[^;;]*;GENERAL=[^=]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7514,"Code":"Alert Finalized","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Sentry-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":"^Sentry-SOSEnding;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;GENERAL=[^;;]*;[^;]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7512,"Code":"F-ACK-Invalid State","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":true,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Sentry-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":"^Sentry-ACK;[^;]*;AB00030009D3[^ ]*7F0123","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7511,"Code":"F-ACK-SubFunction Not Supported","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":true,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Sentry-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":"^Sentry-ACK;[^;]*;AB000300AC83[^ ]*7F0126","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7510,"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\":7510,\"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":1749056548}],"Tags":[]},{"Id":7509,"Code":"F-ACK-Data Size Error","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":true,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Sentry-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":"^Sentry-ACK;[^;]*;AB00030028C3[^ ]*7F0122","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7508,"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":7507,"Code":"F-ACK-GPS Is Not Ready","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":true,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Sentry-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":"^Sentry-ACK;[^;]*;AB0003008D93[^ ]*7F0127","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7506,"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":7505,"Code":"F-ACK-Key Length Error","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":true,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Sentry-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":"^Sentry-ACK;[^;]*;AB000300DEA5[^ ]*7F0117","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7502,"Code":"F-ACK-Command Invalid","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":true,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Sentry-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":"^Sentry-ACK;[^;]*;AB0003009C85[^ ]*7F0115","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7897,"Code":"TLT","Name":null,"MessageCode":"TLT","NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":1,"Template":"Sentry-TLT;<<imei>>;STATUS=<<status_data>>;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":"^Sentry-TLT;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;GENERAL=[^;;]*;[^;]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[{"Type":0,"NewValue":"{\"Id\":7897,\"Code\":\"TLT\",\"Name\":null,\"MessageCode\":\"TLT\",\"NeedAck\":false,\"IsAck\":false,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":1,\"Template\":\"Sentry-TLT;<<imei>>;STATUS=<<status_data>>;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\":\"^Sentry-TLT;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;GENERAL=[^;;]*;[^;]*\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1741952941}],"Tags":[]},{"Id":8092,"Code":"F-ACK-Battery Power Low","Name":null,"MessageCode":"ACK","NeedAck":false,"IsAck":false,"IsFailAck":true,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Sentry-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":"^Sentry-ACK;[^;]*;AB0003001728[^ ]*7F01F0","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[{"Type":0,"NewValue":"{\"Id\":8092,\"Code\":\"F-ACK-Battery Power Low\",\"Name\":null,\"MessageCode\":\"ACK\",\"NeedAck\":false,\"IsAck\":false,\"IsFailAck\":true,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":0,\"Template\":\"Sentry-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\":\"^Sentry-ACK;[^;]*;AB0003001728[^ ]*7F01F0\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1774555058},{"Type":1,"NewValue":"{\"Id\":8092,\"Code\":\"F-ACK-Battery Power Low\",\"Name\":null,\"MessageCode\":\"ACK\",\"NeedAck\":false,\"IsAck\":false,\"IsFailAck\":true,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":2,\"Template\":\"Sentry-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\":\"^Sentry-ACK;[^;]*;AB0003001728[^ ]*7F01F0\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1775040491},{"Type":1,"NewValue":"{\"Id\":8092,\"Code\":\"F-ACK-Battery Power Low\",\"Name\":null,\"MessageCode\":\"ACK\",\"NeedAck\":false,\"IsAck\":false,\"IsFailAck\":true,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":1,\"Template\":\"Sentry-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\":\"^Sentry-ACK;[^;]*;AB0003001728[^ ]*7F01F0\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1775040664},{"Type":1,"NewValue":"{\"Id\":8092,\"Code\":\"F-ACK-Battery Power Low\",\"Name\":null,\"MessageCode\":\"BATL\",\"NeedAck\":false,\"IsAck\":false,\"IsFailAck\":true,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":1,\"Template\":\"Sentry-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\":\"^Sentry-ACK;[^;]*;AB0003001728[^ ]*7F01F0\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1775041321},{"Type":1,"NewValue":"{\"Id\":8092,\"Code\":\"F-ACK-Battery Power Low\",\"Name\":null,\"MessageCode\":\"BATL\",\"NeedAck\":false,\"IsAck\":false,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":1,\"Template\":\"Sentry-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\":\"^Sentry-ACK;[^;]*;AB0003001728[^ ]*7F01F0\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1775041496},{"Type":2,"NewValue":"{\"Id\":8092,\"Code\":\"F-ACK-Battery Power Low\",\"Name\":null,\"MessageCode\":\"BATL\",\"NeedAck\":false,\"IsAck\":false,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":1,\"Template\":\"Sentry-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\":\"^Sentry-ACK;[^;]*;AB0003001728[^ ]*7F01F0\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1780340247}],"Tags":[]},{"Id":8093,"Code":"F-ACK-Device not registered","Name":null,"MessageCode":"ACK","NeedAck":false,"IsAck":false,"IsFailAck":true,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Sentry-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":"^Sentry-ACK;[^;]*;AB0003007AE1[^ ]*7F0131","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[{"Type":0,"NewValue":"{\"Id\":8093,\"Code\":\"F-ACK-Device not registered\",\"Name\":null,\"MessageCode\":\"ACK\",\"NeedAck\":false,\"IsAck\":false,\"IsFailAck\":true,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":0,\"Template\":\"Sentry-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\":\"^Sentry-ACK;[^;]*;AB0003007AE1[^ ]*7F0131\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1774555251}],"Tags":[]},{"Id":8303,"Code":"F-ACK-Battery Power Low","Name":null,"MessageCode":"OBTL","NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Sentry-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":"^Sentry-ACK;[^;]*;AB0003001728[^ ]*7F01F0","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[{"Type":0,"NewValue":"{\"Id\":8303,\"Code\":\"F-ACK-Battery Power Low\",\"Name\":null,\"MessageCode\":\"OBTL\",\"NeedAck\":false,\"IsAck\":false,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":0,\"Template\":\"Sentry-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\":\"^Sentry-ACK;[^;]*;AB0003001728[^ ]*7F01F0\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1778535835},{"Type":1,"NewValue":"{\"Id\":8303,\"Code\":\"F-ACK-Battery Power Low\",\"Name\":null,\"MessageCode\":\"ACK\",\"NeedAck\":false,\"IsAck\":true,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":0,\"Template\":\"Sentry-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\":5817,\"Protocol\":{\"Id\":253,\"Code\":\"Access PS Sentry\",\"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\":\"^Sentry-ACK;[^;]*;AB0003001728[^ ]*7F01F0\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1780340148}],"Tags":[]},{"Id":8304,"Code":"F-ACK-Not Registered","Name":null,"MessageCode":"ACK","NeedAck":false,"IsAck":false,"IsFailAck":true,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Sentry-ACK;<<imei>>;AB0003007AE1<<sequenceNumber>>7F0131","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":"^Sentry-ACK;[^;]*;AB0003007AE1[^ ]*7F0131","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[{"Type":0,"NewValue":"{\"Id\":8304,\"Code\":\"F-ACK-Not Registered\",\"Name\":null,\"MessageCode\":\"ACK\",\"NeedAck\":false,\"IsAck\":false,\"IsFailAck\":true,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":0,\"Template\":\"Sentry-ACK;<<imei>>;AB0003007AE1<<sequenceNumber>>7F0131\",\"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\":\"^Sentry-ACK;[^;]*;AB0003007AE1[^ ]*7F0131\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1778535942}],"Tags":[]},{"Id":8306,"Code":"OBTL","Name":null,"MessageCode":"OBTL","NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Sentry-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":"^Sentry-OBTL;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;GENERAL=[^;;]*;[^;]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[{"Type":0,"NewValue":"{\"Id\":8306,\"Code\":\"OBTL\",\"Name\":null,\"MessageCode\":\"OBTL\",\"NeedAck\":false,\"IsAck\":false,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":0,\"Template\":\"Sentry-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\":\"^Sentry-OBTL;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;GENERAL=[^;;]*;[^;]*\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1780340408},{"Type":1,"NewValue":"{\"Id\":8306,\"Code\":\"OBTL\",\"Name\":null,\"MessageCode\":\"OBTL\",\"NeedAck\":false,\"IsAck\":false,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":1,\"Template\":\"Sentry-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\":\"^Sentry-OBTL;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;GENERAL=[^;;]*;[^;]*\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1780560670},{"Type":1,"NewValue":"{\"Id\":8306,\"Code\":\"OBTL\",\"Name\":null,\"MessageCode\":\"OBTL\",\"NeedAck\":false,\"IsAck\":false,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":2,\"Template\":\"Sentry-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\":\"^Sentry-OBTL;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;GENERAL=[^;;]*;[^;]*\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1780561819}],"Tags":[]}],"Commands":[{"Id":5467,"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":[]},{"Id":5412,"Name":"setExtraEnableControl","TemplateSMS":"<<dataSMS>>","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// SMS newwelfare0: Disable the new welfare feature and switch to the old welfare. newwelfare1: Switch to the new welfare feature.\r\nvar msg = [];\r\nvar configs = [];\r\nvar configsSMS = [];\r\nvar value = '';\r\nvar dataSMS = '';\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\n// 00000001000000000000000000001000\r\nvalue += '0000000';\r\nvalue += '1'; // Stop call sequence ON\r\nvalue += '00000000000000000000'; // other bits until 28\r\nif (params.Welfare.EnableDisableWelfare == 'false') {\r\n    value += '0000'; // Force mode to old welfare amber  \r\n    dataSMS = 'newwelfare0';\r\n} else { // depends on the selection\r\n    if (params.Welfare.Mode == '0') {\r\n        value += '0000'; // old welfare amber\r\n        dataSMS = 'newwelfare0';\r\n    } else {\r\n        value += '1000'; // new welfare  cyclic // recurrent\r\n        dataSMS = 'newwelfare1';\r\n    }\r\n}\r\nvalue = reverseString(value);\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\nvar prefix = 'AB10' + '0700' + 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 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\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":5463,"Protocol":{"Id":253,"Code":"Access PS Sentry","Version":"0.1","FirmwareVersion":"V04b.8601.2411.1.0.16.4411.2409.25","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":false},"Name":"setWelfareCheck","TemplateSMS":"<<dataSMS>>","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// SMS version Example: Welfare1,600,120,1 Reply:  Welfarealarm.  Example: Welfare0 Reply: Welfarecheckoff.   Welfare<n>,<setuptime>,<warningtime>,<callYes/No>\r\nvar msg = [];\r\nvar configs = [];\r\nvar configsSMS = [];\r\nvar value = '';\r\nvar value2 = '';\r\nvar time;\r\nvar dataSMS = '';\r\n// [Time Out] - [Prealarm] must be >= 120 s.\r\nif (params.Welfare.EnableDisableWelfare == 'true') {\r\n    // second version of the logic\r\n    value += '1'; //Enable \r\n    dataSMS = `Welfare1,${(params.Welfare.Timeout * 60)},${(params.Welfare.Prealarm * 60)},1`;\r\n    // First version of the logic    \r\n    /*    if ((params.ReadState.Charging == 'true') && (params.Welfare.Mode == '1')) {\r\n            value += '0'; //Disable when device is charging (on the dock) and recurrent mode is selected\r\n            dataSMS = 'Welfare0';\r\n        } else {\r\n            value += '1'; //Enable in the other options\r\n            dataSMS = `Welfare1,${(params.Welfare.Timeout * 60)},${(params.Welfare.Prealarm * 60)},1`;\r\n        } */\r\n} else {\r\n    value += '0'; //Disable\r\n    dataSMS = 'Welfare0';\r\n}\r\nif (params.Welfare.Timeout) {\r\n    time = params.Welfare.Timeout * 60; //in seconds  this is value in protocol\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\n//if (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 += '1'; // Enable Dial Warning Time\r\nif (params.Welfare.Prealarm) {\r\n    if ((params.Welfare.Timeout - params.Welfare.Prealarm) >= 2) {\r\n        time = params.Welfare.Prealarm * 60; //in seconds  this is  WarningTime in protocol\r\n        value2 += ('0000000000000000000000000000000' + decimalToBinary(parseInt(time))).slice(-31);\r\n    } else { // If the difference between them is less than 2 minutes, we fix Prealarm\r\n        value2 += ('0000000000000000000000000000000' + decimalToBinary(parseInt((params.Welfare.Timeout - 2) * 60))).slice(-31);\r\n    }\r\n} else {\r\n    value2 += ('0000000000000000000000000000000' + decimalToBinary(parseInt(300))).slice(-31);\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\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\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":25},"AvoidResending":false,"FollowParentSentType":true,"SendingType":0,"HasAck":true,"HexString":true,"Order":26,"SendAttempts":2,"ProtocolActionObjects":[],"Tags":[]},{"Id":5586,"Name":"setCheckInOutWelfare","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// setCheckInOutWelfare\r\n// Check In: AB 10 04 00 2F EC 03 00 04 02 43 01\r\n// Check Out: AB 10 04 00 0E FC 02 00 04 02 43 00\r\nvar msg = [];\r\nvar configs = [];\r\nvar configsSMS = [];\r\nvar messageBody = '04';\r\nvar key = '43';\r\nvar keyLength = '02'\r\nvar value = '';\r\nvar dataSMS = '';\r\n// second version of the logic\r\nif ((params.ReadState.Charging == 'true') && (params.Welfare.Mode == '1')) {\r\n    value += '00'; // '00' Check Out\r\n    dataSMS = 'welfareoff';\r\n} else if ((params.ReadState.Charging == 'false') && (params.Welfare.Mode == '1')) {\r\n    value += '01'; //   '01' Check In\r\n    dataSMS = 'checkin';\r\n}\r\n// manual check in and checkout\r\n/*\r\nif (params.Welfare.Check) {\r\n    value += params.Welfare.Check ; //  '00' Check Out  '01' Check In\r\n    dataSMS = 'checkin';  \r\n} else {\r\n    value += '00'; // Default Check Out\r\n    dataSMS = 'welfareoff'; \r\n} \r\n*/\r\nmessageBody += keyLength + key + value;\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar totalLength = '0400'\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":null,"SendAttempts":2,"ProtocolActionObjects":[],"Tags":[]},{"Id":5485,"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\":5485,\"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":1761072176}],"Tags":[]},{"Id":5429,"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\":5429,\"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\\nif (params.Profiles.SilentCallMode == 'true') { // Enable LT Silent Call Mode\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '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\":[],\"Tags\":[]}","Timestamp":1746726047},{"Type":1,"NewValue":"{\"Id\":5429,\"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 Sentry\\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":1761072834},{"Type":1,"NewValue":"{\"Id\":5429,\"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 Sentry\\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';  USED 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":1771526365},{"Type":1,"NewValue":"{\"Id\":5429,\"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 Sentry\\r\\n// silent mode OFF\\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// silent mode ON\\r\\n// [Length]:05 [Key]:33 [Value]:0A 07 01 00\\r\\n// {\\\"phoneOption\\\":{\\\"flag_value\\\":67338,\\\"s3\\\":1,\\\"s4\\\":1,\\\"s5\\\":0,\\\"s6\\\":0,\\\"callIncoming\\\":1,\\\"rings\\\":10,\\\"s7\\\":0,\\\"toneID\\\":0,\\\"s1\\\":0,\\\"s2\\\":1}}\\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\\nif (params.Profiles.SilentCallMode == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '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":1773602655},{"Type":1,"NewValue":"{\"Id\":5429,\"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// ============================================================================\\r\\n// Phone Switches (0x33) - Flag: 4 bytes = 8 hex chars = 32 bits\\r\\n// ============================================================================\\r\\n// Default value: 0A 03 01 00\\r\\n//   BYTE 0 = 0x0A: rings=10, autoAnswer=OFF\\r\\n//   BYTE 1 = 0x03: callWhiteList=ON, buttonHangUp=ON\\r\\n//   BYTE 2 = 0x01: ringTone=ON\\r\\n//   BYTE 3 = 0x00\\r\\n//\\r\\n// Configurable params:\\r\\n//   AllowList      → bit 8 (Call In White List) + bit 11 (SMS White List)\\r\\n//   SilentCallMode → bit 10\\r\\n//   AutoAnswer     → bit 7 (enable) + bits 0-6 (rings, default 3)\\r\\n// ============================================================================\\r\\n// Start with default values: 0A 02 01 00\\r\\n// (bit 8 callWL is OFF by default, controlled by AllowList)\\r\\nvar byte0 = 0x0A; // bits 0-6: rings=10, bit 7: autoAnswer=OFF\\r\\nvar byte1 = 0x02; // bit1(9): btnHU=ON\\r\\nvar byte2 = 0x01; // bit0(16): ringTone=ON\\r\\nvar byte3 = 0x00;\\r\\n// AllowList → bit 8 (Call In White List) + bit 11 (SMS White List)\\r\\nif (params.SystemSettings.AllowList == 'true') {\\r\\n    byte1 |= (1 << 0); // set bit 8: Enable Call In White List\\r\\n    byte1 |= (1 << 3); // set bit 11: Enable SMS White List\\r\\n}\\r\\n// SilentCallMode → bit 10 (byte1 bit2)\\r\\nif (params.Profiles.SilentCallMode == 'true') {\\r\\n    byte1 |= (1 << 2); // set bit 10\\r\\n}\\r\\n// AutoAnswer → bit 7 (byte0 bit7) + bits 0-6 (rings)\\r\\nif (params.SystemSettings.AutoAnswer == 'true') {\\r\\n    byte0 |= (1 << 7); // bit 7: auto answer enable\\r\\n    byte0 = (byte0 & 0x80) | (3 & 0x7F); // rings = 3 (default)\\r\\n}\\r\\n// Build the 4-byte value as hex string\\r\\nvar value = byte0.toString(16).toUpperCase().padStart(2, '0') + byte1.toString(16).toUpperCase().padStart(2, '0') + byte2.toString(16).toUpperCase().padStart(2, '0') + byte3.toString(16).toUpperCase().padStart(2, '0');\\r\\n// Build the message\\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\\n// CRC over message body\\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// Body length (little-endian 16-bit)\\r\\nvar bodyLength = messageBody.length / 2;\\r\\nvar lengthHex = bodyLength.toString(16).toUpperCase().padStart(4, '0');\\r\\nlengthHex = changeEndianness(lengthHex);\\r\\nvar prefix = 'AB10' + lengthHex + 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\\n// Helper functions\\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 crc16byte(s) {\\r\\n    var crc = 0x0000;\\r\\n    var j, i;\\r\\n    for (i = 0; i < s.length; i++) {\\r\\n        var 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 (var 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 (var 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    var hexString = str.toString(16);\\r\\n    return hexString;\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n    var result = [];\\r\\n    var 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":1773687421}],"Tags":[]},{"Id":5456,"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)  Man Down Settings Sensitivity\r\n//var messageBody = '02';\r\nvar sensitivity = '';\r\nvar dataSMS = '';\r\nvar value = '';\r\nif (params.ManDownSettings.EnableDisableManDownSettings == 'true') {\r\n    value += '1';\r\n    value += '100'; //Dial\r\n    //}\r\n    if (params.ManDownSettings.Sensitivity) {\r\n        var sensiString = params.ManDownSettings.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\":5456,\"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)  Man Down Settings Sensitivity\\r\\n//var messageBody = '02';\\r\\nvar sensitivity = '';\\r\\nvar dataSMS = '';\\r\\nvar value = '';\\r\\nif (params.ManDownSettings.EnableDisableManDownSettings == 'true') {\\r\\n    value += '1';\\r\\n    value += '100'; //Dial\\r\\n    //}\\r\\n    if (params.ManDownSettings.Sensitivity) {\\r\\n        var sensiString = params.ManDownSettings.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":1761072603}],"Tags":[]},{"Id":5452,"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\nvar value = '47214A1A3440414243567355571F445310333075';\r\n/* \r\n47 Get device or custom id \r\n21 SpeedDial\r\n4A Wifi Network\r\n1A Firmware Long\r\n34 Contacts\r\n40 APN\r\n41 APNusername\r\n42 APNpass\r\n43 server details\r\n56 fall sensitivity\r\n73 Beacon List\r\n55 Tilt Angle Alert\r\n57 Welfare\r\n1F System language\r\n44 time interval\r\n53 No motion alert\r\n10 Ring tome vol\r\n33 allow list\r\n30 Emergency numbers\r\n75 Extra */\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar command = '02';\r\nvar keyLength = '15';\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' + '1700' + 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":[{"Type":1,"NewValue":"{\"Id\":5452,\"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\\nvar value = '47214A1A3440414243567355571F445310333075';\\r\\n/* \\r\\n47 Get device or custom id \\r\\n21 SpeedDial\\r\\n4A Wifi Network\\r\\n1A Firmware Long\\r\\n34 Contacts\\r\\n40 APN\\r\\n41 APNusername\\r\\n42 APNpass\\r\\n43 server details\\r\\n56 fall sensitivity\\r\\n73 Beacon List\\r\\n55 Tilt Angle Alert\\r\\n57 Welfare\\r\\n1F System language\\r\\n44 time interval\\r\\n53 No motion alert\\r\\n10 Ring tome vol\\r\\n33 allow list\\r\\n30 Emergency numbers\\r\\n75 Extra */\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\nvar command = '02';\\r\\nvar keyLength = '15';\\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' + '1700' + 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\":2,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1740738964},{"Type":1,"NewValue":"{\"Id\":5452,\"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\\nvar value = '2047214A1A3440414243567355571F445310333075';\\r\\n/* \\r\\n20 SOS Button Settings\\r\\n47 Get device or custom id \\r\\n21 SpeedDial (Call 1 Button Settings)\\r\\n4A Wifi Network\\r\\n1A Firmware Long\\r\\n34 Contacts\\r\\n40 APN\\r\\n41 APNusername\\r\\n42 APNpass\\r\\n43 server details\\r\\n56 fall sensitivity\\r\\n73 Beacon List\\r\\n55 Tilt Angle Alert\\r\\n57 Welfare\\r\\n1F System language\\r\\n44 time interval\\r\\n53 No motion alert\\r\\n10 Ring tome vol\\r\\n33 allow list\\r\\n30 Emergency numbers\\r\\n75 Extra */\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\nvar command = '02';\\r\\nvar keyLength = '17';\\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' + '1900' + 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\":2,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1747656839},{"Type":1,"NewValue":"{\"Id\":5452,\"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\\nvar value = '2047214A1A3440414243567355571F445310333075';\\r\\n/* \\r\\n20 SOS Button Settings\\r\\n47 Get device or custom id \\r\\n21 SpeedDial (Call 1 Button Settings)\\r\\n4A Wifi Network\\r\\n1A Firmware Long\\r\\n34 Contacts\\r\\n40 APN\\r\\n41 APNusername\\r\\n42 APNpass\\r\\n43 server details\\r\\n56 fall sensitivity\\r\\n73 Beacon List\\r\\n55 Tilt Angle Alert\\r\\n57 Welfare\\r\\n1F System language\\r\\n44 time interval\\r\\n53 No motion alert\\r\\n10 Ring tome vol\\r\\n33 allow list\\r\\n30 Emergency numbers\\r\\n75 Extra */\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\nvar command = '02';\\r\\nvar keyLength = '16';\\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' + '1800' + 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\":2,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1747658759},{"Type":1,"NewValue":"{\"Id\":5452,\"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\\nvar value = '2047214A1A3440414243567355571F445310333075121C';\\r\\n/* \\r\\n20 SOS Button Settings\\r\\n47 Get device or custom id \\r\\n21 SpeedDial (Call 1 Button Settings)\\r\\n4A Wifi Network\\r\\n1A Firmware Long\\r\\n34 Contacts\\r\\n40 APN\\r\\n41 APNusername\\r\\n42 APNpass\\r\\n43 server details\\r\\n56 fall sensitivity\\r\\n73 Beacon List\\r\\n55 Tilt Angle Alert\\r\\n57 Welfare\\r\\n1F System language\\r\\n44 time interval\\r\\n53 No motion alert\\r\\n10 Ring tome vol\\r\\n33 allow list\\r\\n30 Emergency numbers\\r\\n75 Extra \\r\\n12 Speaker volume\\r\\n1C Voice prompt volume\\r\\n*/\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\nvar command = '02';\\r\\nvar keyLength = '18'; //+1 of value \\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' + '1A00' + 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\":2,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1750182701}],"Tags":[]},{"Id":5477,"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":5437,"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":[{"Type":1,"NewValue":"{\"Id\":5437,\"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":1761072677}],"Tags":[]},{"Id":5455,"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 = '10'; // Enable, no SMS,\r\nif (params.AlertSettings.ReportMode) { //  Toggle Call\r\n    confSOS += params.AlertSettings.ReportMode;\r\n}\r\nconfSOS += '00000'; //   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,';\r\n    dataSMS += params.AlertSettings.ReportMode; //  Toggle Call\r\n    dataSMS += `,${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\":5455,\"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 = '10'; // Enable, no SMS,\\r\\nif (params.AlertSettings.ReportMode) { //  Toggle Call\\r\\n    confSOS += params.AlertSettings.ReportMode;\\r\\n}\\r\\nconfSOS += '00000'; //   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,';\\r\\n    dataSMS += params.AlertSettings.ReportMode; //  Toggle Call\\r\\n    dataSMS += `,${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\":4,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1761072483}],"Tags":[]},{"Id":5488,"Name":"setTiltAngle","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//var params = {ManDownSettings:{'EnableDisableManDownSettings':'false','TiltAngle':'50'}}\r\nvar msg = [];\r\nvar configs = [];\r\nvar configsSMS = []; //tilt1,45,30s,1\r\n// configuration command (0X02)  Tilt Alert\r\n//var angle = ('00000000' + decimalToBinary(parseInt(45))).slice(-8).toUpperCase(); // 45 degrees default\r\n//var time = ('0000000000000000' + decimalToBinary(parseInt(30))).slice(-16).toUpperCase(); // 30 seconds default\r\nvar angle = '';\r\nvar time = '';\r\nvar value = '';\r\nvar dataSMS = '';\r\nif (params.ManDownSettings.EnableDisableManDownSettings == 'true') { //man down alert on\r\n    if (params.ManDownSettings.TiltAngle != '0') { // Angle is not OFF\r\n        if (params.ManDownSettings.TiltTimeout) {\r\n            time = ('0000' + decimalToHex(parseInt(params.ManDownSettings.TiltTimeout))).slice(-4).toUpperCase();\r\n            time = changeEndianness(time);\r\n        }\r\n        if (params.ManDownSettings.TiltAngle) {\r\n            angle = ('00000000' + decimalToBinary(parseInt(params.ManDownSettings.TiltAngle))).slice(-8).toUpperCase();\r\n            angle += '11'; //Enable an Dial\r\n            angle += '000000'; //reserved\r\n            angle = ('0000' + binaryToHex(angle)).slice(-4).toUpperCase();\r\n        }\r\n        // For GPRS\r\n        value += time + angle;\r\n        // For SMS\r\n        dataSMS = `tilt1,${parseInt(params.ManDownSettings.TiltAngle)},${parseInt(params.ManDownSettings.TiltTimeout)}s,1`; // {\"angle\":angle,\"time\":30,\"status\":1,\"dial\":1}\r\n    } else { // Angle is OFF\r\n        if (params.ManDownSettings.TiltTimeout) {\r\n            time = ('0000' + decimalToHex(parseInt(params.ManDownSettings.TiltTimeout))).slice(-4).toUpperCase();\r\n            time = changeEndianness(time);\r\n        }\r\n        value += time + '1E00'; // {\"angle\":30,\"time\":time,\"status\":0,\"dial\":0}\r\n        dataSMS = `tilt0,30,${parseInt(params.ManDownSettings.TiltTimeout)}s,0`; //ACK is Set tilt alarm 30 degrees ok.\r\n    }\r\n    // mandown alert off\r\n} else {\r\n    if (params.ManDownSettings.TiltTimeout) {\r\n        time = ('0000' + decimalToHex(parseInt(params.ManDownSettings.TiltTimeout))).slice(-4).toUpperCase();\r\n        time = changeEndianness(time);\r\n    }\r\n    value += time + '1E00'; // {\"angle\":30,\"time\":time,\"status\":0,\"dial\":0}\r\n    dataSMS = `tilt0,30,${parseInt(params.ManDownSettings.TiltTimeout)}s,0`; //ACK is Set tilt alarm 30 degrees ok.\r\n}\r\n// create HEADER\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar command = '02';\r\nvar keyLength = '05';\r\nvar key = '55';\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' + '0700' + 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":5434,"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":5435,"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":5468,"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":5469,"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":5470,"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":5471,"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\":5471,\"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":1761678911}],"Tags":[]},{"Id":5472,"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":5473,"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\":5473,\"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":1761072222}],"Tags":[]},{"Id":5474,"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\":5474,\"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":1761071997}],"Tags":[]},{"Id":5475,"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":5476,"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":5478,"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\":5478,\"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":1761072198}],"Tags":[]},{"Id":5479,"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\":5479,\"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":1761072102}],"Tags":[]},{"Id":5432,"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":5480,"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\":5480,\"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":1761072132}],"Tags":[]},{"Id":5481,"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\":5481,\"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":1761072086}],"Tags":[]},{"Id":5407,"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":[{"Type":1,"NewValue":"{\"Id\":5407,\"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":1761071899}],"Tags":[]},{"Id":5408,"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\":5408,\"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":1761072761}],"Tags":[]},{"Id":5409,"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":[{"Type":1,"NewValue":"{\"Id\":5409,\"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 = '';\\n//if (params.SpeedDial.EnableDisableSpeedDial == 'true') {\\nvalue += '10'; //Enable\\n//value += '0'; //Long Press\\nif (params.InterfaceOptions.SpeedActivationDialButton == '0') {\\n    value += '0';\\n} else {\\n    value += '1';\\n}\\nvalue += '0010'; //Auth2 number\\nvar time = 30; // 30 seconds \\nvalue += ('0000000' + decimalToBinary(parseInt(time))).slice(-7);\\nvalue += '10'; //feedback voice warning\\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\":[]}","Timestamp":1747327130},{"Type":1,"NewValue":"{\"Id\":5409,\"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 = '';\\n//if (params.SpeedDial.EnableDisableSpeedDial == 'true') {\\nvalue += '10'; //Enable\\n//value += '0'; //Long Press\\nif (params.InterfaceOptions.SpeedActivationDialButton == '0') {\\n    value += '0';\\n} else {\\n    value += '1';\\n}\\nvalue += '0010'; //Auth2 number\\nvar time = 30; // 30 seconds \\nvalue += ('0000000' + decimalToBinary(parseInt(time))).slice(-7);\\nvalue += '11'; // Feedback: vibrate and voice prompt (default)\\n//value += '10'; //feedback voice warning\\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\":[]}","Timestamp":1752164021}],"Tags":[]},{"Id":5410,"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":5411,"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":5413,"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":5414,"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":5415,"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":[{"Type":1,"NewValue":"{\"Id\":5415,\"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 = '';\\n//if (params.SOSButtonSettings.EnableDisableSOSButtonSettings == 'true') {\\nvalue += '10'; // Enable and reserve\\nif (params.InterfaceOptions.SOSActivationButton == '0') {\\n    value += '0';\\n} else {\\n    value += '1';\\n}\\nvalue += '1111'; //SOS task (Default)  Standard\\nvar time = 30; // 30 seconds default\\nvalue += ('0000000' + decimalToBinary(parseInt(time))).slice(-7);\\nvalue += '11'; // Feedback: vibrate and voice prompt (default)\\n/*\\nif (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\":[]}","Timestamp":1747326439}],"Tags":[]},{"Id":5416,"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\":5416,\"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 = '';\\n// LED , off for silent mode\\nif (params.Profiles.SilentCallMode == 'true') {\\n    value += '0'; // LED//Beep Off\\n} else {\\n    value += '1'; // LED//Beep On\\n}\\n// Voice Warning, off for silent mode\\nif (params.Profiles.SilentCallMode == 'true') {\\n    value += '0'; // Voice Warning Off\\n} else {\\n    value += '1'; // Voice Warning On\\n}\\n// Vibration, always on\\nvalue += '1';\\n// CellTower always on\\nvalue += '1';\\n// Wifi Positioning always on\\nvalue += '1';\\n// Speaker SOS talking, off for silent mode\\nif (params.Profiles.SilentCallMode == 'true') {\\n    value += '0'; //off\\n} else {\\n    value += '1'; //on\\n}\\n// Call1 Side Call, off for silent mode\\nif (params.Profiles.SilentCallMode == 'true') {\\n    value += '0'; // off\\n} else {\\n    value += '1'; // on\\n}\\n// BLE always connected to charging base, always off\\nvalue += '1';\\n// BLE Locating, always on\\nvalue += '1';\\n// SOS call voice, always on ¿?¿?¿\\nvalue += '1';\\n// BLE always on, always on \\nvalue += '1';\\n// GPS loc, always on ?¿?¿?\\nvalue += '1';\\n// TCP fast, always on\\nvalue += '1';\\n//watch only  Raise wrist to awake (EV05only), off for EV04\\nvalue += '0';\\n// Home beacon location, always on\\nvalue += '1';\\n// activity fuction, \\nvalue += '0';\\n//step counting, off\\nvalue += '0';\\n//home-wifi location, data-saver, NLprovider, power control,\\n// sos cancel switch, Long SMS,  plus 7 more without functions\\nvalue += '0000';\\n// Stop call sequence, always on\\nvalue += '1';\\nvalue += '00000000';\\n// Autoupdate firmware, always on\\nvalue += '1';\\n// AGPS, always on\\nvalue += '1';\\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\":[],\"Tags\":[]}","Timestamp":1746729326},{"Type":1,"NewValue":"{\"Id\":5416,\"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 Sentry\\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\":4,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1761072538},{"Type":1,"NewValue":"{\"Id\":5416,\"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 Sentry\\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\\n// https://loop.cloud.microsoft/p/eyJ1IjoiaHR0cHM6Ly9hY2Nlc3N1a2x0ZC5zaGFyZXBvaW50LmNvbS9jb250ZW50c3RvcmFnZS9DU1BfYTA5NDMzMjItM2UyNi00ZGQ2LTg1MjQtN2M4OThlZjQ1ODJhP25hdj1jejBsTWtaamIyNTBaVzUwYzNSdmNtRm5aU1V5UmtOVFVGOWhNRGswTXpNeU1pMHpaVEkyTFRSa1pEWXRPRFV5TkMwM1l6ZzVPR1ZtTkRVNE1tRW1aRDFpSlRJeFNXcFBWVzlEV1MweGF6SkdTa2g1U21wMlVsbExkR3BsYmxoQ2MyaFhWa3RzWVZsNGVuSkJSVzVXTlRoelpXMXBhVlpDUzFSd01ESkNha3BNY2pKU2RTWm1QVEF4V1VzM1EwYzFTMHhKV1V3eU0wWTBUVkkxUlRJMVYwaGFSa05JU3pkUVUwVW1ZejBsTWtZbVlUMU1iMjl3UVhCd0puQTlKVFF3Wm14MWFXUjRKVEpHYkc5dmNDMXdZV2RsTFdOdmJuUmhhVzVsY2laNFBTVTNRaVV5TW5jbE1qSWxNMEVsTWpKVU1GSlVWVWg0YUZreVRteGpNMDR4WVRKNE1GcEROWHBoUjBaNVdsaENkbUZYTlRCTWJVNTJZbGg0YVVsVmJIRlVNVloyVVRGcmRFMVhjM2xTYTNCSlpWVndjV1JzU2xwVE0xSnhXbGMxV1ZGdVRtOVdNVnBNWWtkR1dtVkljSGxSVlZaMVZtcFZOR015Vm5SaFYyeFhVV3QwVldORVFYbFJiWEJMVkVoSmVWVnVWamhOUkVaYVUzcGtSRko2Vmt0VFJXUllVa1ZPUzFOc1NreFViRXBIVXpCR1lWTnJVWHBUVlZaVlVWUktSRmRSSlRORUpUTkVKVEl5SlRKREpUSXlhU1V5TWlVelFTVXlNbUV5WlRSa1lUWTJMV0prT0dFdE5HVmxZaTFoTVRCaUxXTmhNall6TldJNE5UUXdaU1V5TWlVM1JBPT0ifQ%3D%3D\\nif (params.Profile.SilentMode == 'true') {\\n    value += '9C5B00C0';\\n} else {\\n    value += '7F5B00C0';\\n}\\n//var 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\":4,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1773338127},{"Type":1,"NewValue":"{\"Id\":5416,\"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 Sentry\\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\\n// https://loop.cloud.microsoft/p/eyJ1IjoiaHR0cHM6Ly9hY2Nlc3N1a2x0ZC5zaGFyZXBvaW50LmNvbS9jb250ZW50c3RvcmFnZS9DU1BfYTA5NDMzMjItM2UyNi00ZGQ2LTg1MjQtN2M4OThlZjQ1ODJhP25hdj1jejBsTWtaamIyNTBaVzUwYzNSdmNtRm5aU1V5UmtOVFVGOWhNRGswTXpNeU1pMHpaVEkyTFRSa1pEWXRPRFV5TkMwM1l6ZzVPR1ZtTkRVNE1tRW1aRDFpSlRJeFNXcFBWVzlEV1MweGF6SkdTa2g1U21wMlVsbExkR3BsYmxoQ2MyaFhWa3RzWVZsNGVuSkJSVzVXTlRoelpXMXBhVlpDUzFSd01ESkNha3BNY2pKU2RTWm1QVEF4V1VzM1EwYzFTMHhKV1V3eU0wWTBUVkkxUlRJMVYwaGFSa05JU3pkUVUwVW1ZejBsTWtZbVlUMU1iMjl3UVhCd0puQTlKVFF3Wm14MWFXUjRKVEpHYkc5dmNDMXdZV2RsTFdOdmJuUmhhVzVsY2laNFBTVTNRaVV5TW5jbE1qSWxNMEVsTWpKVU1GSlVWVWg0YUZreVRteGpNMDR4WVRKNE1GcEROWHBoUjBaNVdsaENkbUZYTlRCTWJVNTJZbGg0YVVsVmJIRlVNVloyVVRGcmRFMVhjM2xTYTNCSlpWVndjV1JzU2xwVE0xSnhXbGMxV1ZGdVRtOVdNVnBNWWtkR1dtVkljSGxSVlZaMVZtcFZOR015Vm5SaFYyeFhVV3QwVldORVFYbFJiWEJMVkVoSmVWVnVWamhOUkVaYVUzcGtSRko2Vmt0VFJXUllVa1ZPUzFOc1NreFViRXBIVXpCR1lWTnJVWHBUVlZaVlVWUktSRmRSSlRORUpUTkVKVEl5SlRKREpUSXlhU1V5TWlVelFTVXlNbUV5WlRSa1lUWTJMV0prT0dFdE5HVmxZaTFoTVRCaUxXTmhNall6TldJNE5UUXdaU1V5TWlVM1JBPT0ifQ%3D%3D\\nif (params.Profiles.SilentCallMode == 'true') {\\n    value += '9C5B00C0';\\n} else {\\n    value += '7F5B00C0';\\n}\\n//var 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\":4,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1773405370},{"Type":1,"NewValue":"{\"Id\":5416,\"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 Sentry\\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\\n// https://loop.cloud.microsoft/p/eyJ1IjoiaHR0cHM6Ly9hY2Nlc3N1a2x0ZC5zaGFyZXBvaW50LmNvbS9jb250ZW50c3RvcmFnZS9DU1BfYTA5NDMzMjItM2UyNi00ZGQ2LTg1MjQtN2M4OThlZjQ1ODJhP25hdj1jejBsTWtaamIyNTBaVzUwYzNSdmNtRm5aU1V5UmtOVFVGOWhNRGswTXpNeU1pMHpaVEkyTFRSa1pEWXRPRFV5TkMwM1l6ZzVPR1ZtTkRVNE1tRW1aRDFpSlRJeFNXcFBWVzlEV1MweGF6SkdTa2g1U21wMlVsbExkR3BsYmxoQ2MyaFhWa3RzWVZsNGVuSkJSVzVXTlRoelpXMXBhVlpDUzFSd01ESkNha3BNY2pKU2RTWm1QVEF4V1VzM1EwYzFTMHhKV1V3eU0wWTBUVkkxUlRJMVYwaGFSa05JU3pkUVUwVW1ZejBsTWtZbVlUMU1iMjl3UVhCd0puQTlKVFF3Wm14MWFXUjRKVEpHYkc5dmNDMXdZV2RsTFdOdmJuUmhhVzVsY2laNFBTVTNRaVV5TW5jbE1qSWxNMEVsTWpKVU1GSlVWVWg0YUZreVRteGpNMDR4WVRKNE1GcEROWHBoUjBaNVdsaENkbUZYTlRCTWJVNTJZbGg0YVVsVmJIRlVNVloyVVRGcmRFMVhjM2xTYTNCSlpWVndjV1JzU2xwVE0xSnhXbGMxV1ZGdVRtOVdNVnBNWWtkR1dtVkljSGxSVlZaMVZtcFZOR015Vm5SaFYyeFhVV3QwVldORVFYbFJiWEJMVkVoSmVWVnVWamhOUkVaYVUzcGtSRko2Vmt0VFJXUllVa1ZPUzFOc1NreFViRXBIVXpCR1lWTnJVWHBUVlZaVlVWUktSRmRSSlRORUpUTkVKVEl5SlRKREpUSXlhU1V5TWlVelFTVXlNbUV5WlRSa1lUWTJMV0prT0dFdE5HVmxZaTFoTVRCaUxXTmhNall6TldJNE5UUXdaU1V5TWlVM1JBPT0ifQ%3D%3D\\nif (params.Profiles.SilentCallMode == 'true') {\\n    var value = '9C5B00C0';\\n} else {\\n    var value = '7F5B00C0';\\n}\\n//var 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\":4,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1773405890},{"Type":1,"NewValue":"{\"Id\":5416,\"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 Sentry\\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\\n// https://loop.cloud.microsoft/p/eyJ1IjoiaHR0cHM6Ly9hY2Nlc3N1a2x0ZC5zaGFyZXBvaW50LmNvbS9jb250ZW50c3RvcmFnZS9DU1BfYTA5NDMzMjItM2UyNi00ZGQ2LTg1MjQtN2M4OThlZjQ1ODJhP25hdj1jejBsTWtaamIyNTBaVzUwYzNSdmNtRm5aU1V5UmtOVFVGOWhNRGswTXpNeU1pMHpaVEkyTFRSa1pEWXRPRFV5TkMwM1l6ZzVPR1ZtTkRVNE1tRW1aRDFpSlRJeFNXcFBWVzlEV1MweGF6SkdTa2g1U21wMlVsbExkR3BsYmxoQ2MyaFhWa3RzWVZsNGVuSkJSVzVXTlRoelpXMXBhVlpDUzFSd01ESkNha3BNY2pKU2RTWm1QVEF4V1VzM1EwYzFTMHhKV1V3eU0wWTBUVkkxUlRJMVYwaGFSa05JU3pkUVUwVW1ZejBsTWtZbVlUMU1iMjl3UVhCd0puQTlKVFF3Wm14MWFXUjRKVEpHYkc5dmNDMXdZV2RsTFdOdmJuUmhhVzVsY2laNFBTVTNRaVV5TW5jbE1qSWxNMEVsTWpKVU1GSlVWVWg0YUZreVRteGpNMDR4WVRKNE1GcEROWHBoUjBaNVdsaENkbUZYTlRCTWJVNTJZbGg0YVVsVmJIRlVNVloyVVRGcmRFMVhjM2xTYTNCSlpWVndjV1JzU2xwVE0xSnhXbGMxV1ZGdVRtOVdNVnBNWWtkR1dtVkljSGxSVlZaMVZtcFZOR015Vm5SaFYyeFhVV3QwVldORVFYbFJiWEJMVkVoSmVWVnVWamhOUkVaYVUzcGtSRko2Vmt0VFJXUllVa1ZPUzFOc1NreFViRXBIVXpCR1lWTnJVWHBUVlZaVlVWUktSRmRSSlRORUpUTkVKVEl5SlRKREpUSXlhU1V5TWlVelFTVXlNbUV5WlRSa1lUWTJMV0prT0dFdE5HVmxZaTFoTVRCaUxXTmhNall6TldJNE5UUXdaU1V5TWlVM1JBPT0ifQ%3D%3D\\nif (params.Profiles.SilentCallMode == 'true') {\\n    var value = '1C5B00C0';\\n} else {\\n    var value = '7F5B00C0';\\n}\\n//var 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\":4,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1773601436}],"Tags":[]},{"Id":5417,"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":[{"Type":1,"NewValue":"{\"Id\":5417,\"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.NotificationsandAlerts) {\\n    var volume = parseInt(params.SystemSettings.NotificationsandAlerts)\\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\":[]}","Timestamp":1750182076}],"Tags":[]},{"Id":5418,"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":5419,"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":5420,"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":5421,"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\":5421,\"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\":3,\"SendAttempts\":2,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1761072304},{"Type":1,"NewValue":"{\"Id\":5421,\"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 = '64'; // Sentry\\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":1761241456}],"Tags":[]},{"Id":5422,"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\":5422,\"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":1761072637}],"Tags":[]},{"Id":5423,"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":5424,"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":5425,"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\":5425,\"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":1761072399}],"Tags":[]},{"Id":5426,"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":5427,"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":5428,"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":5430,"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":5431,"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":5482,"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\":5482,\"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":1761072150}],"Tags":[]},{"Id":5483,"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\":5483,\"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":1761072117}],"Tags":[]},{"Id":5436,"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":5438,"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":5439,"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":[{"Type":1,"NewValue":"{\"Id\":5439,\"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.In - CallSpeakerVolume) {\\n    var volume = parseInt(params.SystemSettings.In - CallSpeakerVolume)\\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\":[]}","Timestamp":1750181499},{"Type":1,"NewValue":"{\"Id\":5439,\"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.InCallSpeakerVolume) {\\n    var volume = parseInt(params.SystemSettings.InCallSpeakerVolume)\\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\":[]}","Timestamp":1750181703}],"Tags":[]},{"Id":5440,"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":5441,"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":5442,"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":5443,"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":5444,"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":5445,"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":5446,"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":[{"Type":1,"NewValue":"{\"Id\":5446,\"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.IncomingCallRingtoneVolume) {\\n    var volume = parseInt(params.SystemSettings.IncomingCallRingtoneVolume);\\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);\\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\":[]}","Timestamp":1750181939}],"Tags":[]},{"Id":5447,"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":5453,"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\":5453,\"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":1761674790}],"Tags":[]},{"Id":5454,"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":[{"Type":1,"NewValue":"{\"Id\":5454,\"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":1761242895}],"Tags":[]},{"Id":5457,"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\":5457,\"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":1761072051}],"Tags":[]},{"Id":5458,"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":[{"Type":1,"NewValue":"{\"Id\":5458,\"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":1761072018}],"Tags":[]},{"Id":5459,"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\":5459,\"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":1761071883}],"Tags":[]},{"Id":5460,"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":[{"Type":1,"NewValue":"{\"Id\":5460,\"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":1761071914}],"Tags":[]},{"Id":5461,"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":5462,"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":5463,"Name":"setWelfareCheck","TemplateSMS":"<<dataSMS>>","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// SMS version Example: Welfare1,600,120,1 Reply:  Welfarealarm.  Example: Welfare0 Reply: Welfarecheckoff.   Welfare<n>,<setuptime>,<warningtime>,<callYes/No>\r\nvar msg = [];\r\nvar configs = [];\r\nvar configsSMS = [];\r\nvar value = '';\r\nvar value2 = '';\r\nvar time;\r\nvar dataSMS = '';\r\n// [Time Out] - [Prealarm] must be >= 120 s.\r\nif (params.Welfare.EnableDisableWelfare == 'true') {\r\n    // second version of the logic\r\n    value += '1'; //Enable \r\n    dataSMS = `Welfare1,${(params.Welfare.Timeout * 60)},${(params.Welfare.Prealarm * 60)},1`;\r\n    // First version of the logic    \r\n    /*    if ((params.ReadState.Charging == 'true') && (params.Welfare.Mode == '1')) {\r\n            value += '0'; //Disable when device is charging (on the dock) and recurrent mode is selected\r\n            dataSMS = 'Welfare0';\r\n        } else {\r\n            value += '1'; //Enable in the other options\r\n            dataSMS = `Welfare1,${(params.Welfare.Timeout * 60)},${(params.Welfare.Prealarm * 60)},1`;\r\n        } */\r\n} else {\r\n    value += '0'; //Disable\r\n    dataSMS = 'Welfare0';\r\n}\r\nif (params.Welfare.Timeout) {\r\n    time = params.Welfare.Timeout * 60; //in seconds  this is value in protocol\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\n//if (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 += '1'; // Enable Dial Warning Time\r\nif (params.Welfare.Prealarm) {\r\n    if ((params.Welfare.Timeout - params.Welfare.Prealarm) >= 2) {\r\n        time = params.Welfare.Prealarm * 60; //in seconds  this is  WarningTime in protocol\r\n        value2 += ('0000000000000000000000000000000' + decimalToBinary(parseInt(time))).slice(-31);\r\n    } else { // If the difference between them is less than 2 minutes, we fix Prealarm\r\n        value2 += ('0000000000000000000000000000000' + decimalToBinary(parseInt((params.Welfare.Timeout - 2) * 60))).slice(-31);\r\n    }\r\n} else {\r\n    value2 += ('0000000000000000000000000000000' + decimalToBinary(parseInt(300))).slice(-31);\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\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\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":25,"SendAttempts":2,"ProtocolActionObjects":[],"Tags":[]},{"Id":5464,"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\":5464,\"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":1761674821}],"Tags":[]},{"Id":5465,"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":5466,"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":[{"Type":1,"NewValue":"{\"Id\":5466,\"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":1761072033}],"Tags":[]},{"Id":5484,"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":5433,"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":5451,"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":5452,"Protocol":{"Id":253,"Code":"Access PS Sentry","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\nvar value = '47214A1A3440414243567355571F445310333075';\r\n/* \r\n47 Get device or custom id \r\n21 SpeedDial\r\n4A Wifi Network\r\n1A Firmware Long\r\n34 Contacts\r\n40 APN\r\n41 APNusername\r\n42 APNpass\r\n43 server details\r\n56 fall sensitivity\r\n73 Beacon List\r\n55 Tilt Angle Alert\r\n57 Welfare\r\n1F System language\r\n44 time interval\r\n53 No motion alert\r\n10 Ring tome vol\r\n33 allow list\r\n30 Emergency numbers\r\n75 Extra */\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar command = '02';\r\nvar keyLength = '15';\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' + '1700' + 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":[{"Type":1,"NewValue":"{\"Id\":5451,\"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\":5452,\"Protocol\":{\"Id\":253,\"Code\":\"Access PS Sentry\",\"Version\":\"0.3\",\"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\\nvar value = '47214A1A3440414243567355571F445310333075';\\r\\n/* \\r\\n47 Get device or custom id \\r\\n21 SpeedDial\\r\\n4A Wifi Network\\r\\n1A Firmware Long\\r\\n34 Contacts\\r\\n40 APN\\r\\n41 APNusername\\r\\n42 APNpass\\r\\n43 server details\\r\\n56 fall sensitivity\\r\\n73 Beacon List\\r\\n55 Tilt Angle Alert\\r\\n57 Welfare\\r\\n1F System language\\r\\n44 time interval\\r\\n53 No motion alert\\r\\n10 Ring tome vol\\r\\n33 allow list\\r\\n30 Emergency numbers\\r\\n75 Extra */\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\nvar command = '02';\\r\\nvar keyLength = '15';\\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' + '1700' + 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\":2,\"Order\":17},\"AvoidResending\":false,\"FollowParentSentType\":true,\"SendingType\":0,\"HasAck\":true,\"HexString\":true,\"Order\":18,\"SendAttempts\":1,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1740738983}],"Tags":[]},{"Id":5450,"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":5452,"Protocol":{"Id":253,"Code":"Access PS Sentry","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\nvar value = '47214A1A3440414243567355571F445310333075';\r\n/* \r\n47 Get device or custom id \r\n21 SpeedDial\r\n4A Wifi Network\r\n1A Firmware Long\r\n34 Contacts\r\n40 APN\r\n41 APNusername\r\n42 APNpass\r\n43 server details\r\n56 fall sensitivity\r\n73 Beacon List\r\n55 Tilt Angle Alert\r\n57 Welfare\r\n1F System language\r\n44 time interval\r\n53 No motion alert\r\n10 Ring tome vol\r\n33 allow list\r\n30 Emergency numbers\r\n75 Extra */\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar command = '02';\r\nvar keyLength = '15';\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' + '1700' + 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":[{"Type":1,"NewValue":"{\"Id\":5450,\"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\":5452,\"Protocol\":{\"Id\":253,\"Code\":\"Access PS Sentry\",\"Version\":\"0.3\",\"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\\nvar value = '47214A1A3440414243567355571F445310333075';\\r\\n/* \\r\\n47 Get device or custom id \\r\\n21 SpeedDial\\r\\n4A Wifi Network\\r\\n1A Firmware Long\\r\\n34 Contacts\\r\\n40 APN\\r\\n41 APNusername\\r\\n42 APNpass\\r\\n43 server details\\r\\n56 fall sensitivity\\r\\n73 Beacon List\\r\\n55 Tilt Angle Alert\\r\\n57 Welfare\\r\\n1F System language\\r\\n44 time interval\\r\\n53 No motion alert\\r\\n10 Ring tome vol\\r\\n33 allow list\\r\\n30 Emergency numbers\\r\\n75 Extra */\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\nvar command = '02';\\r\\nvar keyLength = '15';\\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' + '1700' + 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\":2,\"Order\":17},\"AvoidResending\":false,\"FollowParentSentType\":true,\"SendingType\":0,\"HasAck\":true,\"HexString\":true,\"Order\":19,\"SendAttempts\":1,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1740738998}],"Tags":[]},{"Id":5449,"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":5452,"Protocol":{"Id":253,"Code":"Access PS Sentry","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\nvar value = '47214A1A3440414243567355571F445310333075';\r\n/* \r\n47 Get device or custom id \r\n21 SpeedDial\r\n4A Wifi Network\r\n1A Firmware Long\r\n34 Contacts\r\n40 APN\r\n41 APNusername\r\n42 APNpass\r\n43 server details\r\n56 fall sensitivity\r\n73 Beacon List\r\n55 Tilt Angle Alert\r\n57 Welfare\r\n1F System language\r\n44 time interval\r\n53 No motion alert\r\n10 Ring tome vol\r\n33 allow list\r\n30 Emergency numbers\r\n75 Extra */\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar command = '02';\r\nvar keyLength = '15';\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' + '1700' + 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":[{"Type":1,"NewValue":"{\"Id\":5449,\"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\":5452,\"Protocol\":{\"Id\":253,\"Code\":\"Access PS Sentry\",\"Version\":\"0.3\",\"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\\nvar value = '47214A1A3440414243567355571F445310333075';\\r\\n/* \\r\\n47 Get device or custom id \\r\\n21 SpeedDial\\r\\n4A Wifi Network\\r\\n1A Firmware Long\\r\\n34 Contacts\\r\\n40 APN\\r\\n41 APNusername\\r\\n42 APNpass\\r\\n43 server details\\r\\n56 fall sensitivity\\r\\n73 Beacon List\\r\\n55 Tilt Angle Alert\\r\\n57 Welfare\\r\\n1F System language\\r\\n44 time interval\\r\\n53 No motion alert\\r\\n10 Ring tome vol\\r\\n33 allow list\\r\\n30 Emergency numbers\\r\\n75 Extra */\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\nvar command = '02';\\r\\nvar keyLength = '15';\\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' + '1700' + 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\":2,\"Order\":17},\"AvoidResending\":false,\"FollowParentSentType\":true,\"SendingType\":0,\"HasAck\":true,\"HexString\":true,\"Order\":20,\"SendAttempts\":1,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1740739088}],"Tags":[]},{"Id":5448,"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":5452,"Protocol":{"Id":253,"Code":"Access PS Sentry","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\nvar value = '47214A1A3440414243567355571F445310333075';\r\n/* \r\n47 Get device or custom id \r\n21 SpeedDial\r\n4A Wifi Network\r\n1A Firmware Long\r\n34 Contacts\r\n40 APN\r\n41 APNusername\r\n42 APNpass\r\n43 server details\r\n56 fall sensitivity\r\n73 Beacon List\r\n55 Tilt Angle Alert\r\n57 Welfare\r\n1F System language\r\n44 time interval\r\n53 No motion alert\r\n10 Ring tome vol\r\n33 allow list\r\n30 Emergency numbers\r\n75 Extra */\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar command = '02';\r\nvar keyLength = '15';\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' + '1700' + 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":[{"Type":1,"NewValue":"{\"Id\":5448,\"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\":5452,\"Protocol\":{\"Id\":253,\"Code\":\"Access PS Sentry\",\"Version\":\"0.3\",\"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\\nvar value = '47214A1A3440414243567355571F445310333075';\\r\\n/* \\r\\n47 Get device or custom id \\r\\n21 SpeedDial\\r\\n4A Wifi Network\\r\\n1A Firmware Long\\r\\n34 Contacts\\r\\n40 APN\\r\\n41 APNusername\\r\\n42 APNpass\\r\\n43 server details\\r\\n56 fall sensitivity\\r\\n73 Beacon List\\r\\n55 Tilt Angle Alert\\r\\n57 Welfare\\r\\n1F System language\\r\\n44 time interval\\r\\n53 No motion alert\\r\\n10 Ring tome vol\\r\\n33 allow list\\r\\n30 Emergency numbers\\r\\n75 Extra */\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\nvar command = '02';\\r\\nvar keyLength = '15';\\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' + '1700' + 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\":2,\"Order\":17},\"AvoidResending\":false,\"FollowParentSentType\":true,\"SendingType\":0,\"HasAck\":true,\"HexString\":true,\"Order\":21,\"SendAttempts\":1,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1740739139}],"Tags":[]},{"Id":5815,"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\":5815,\"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":1761072961}],"Tags":[]},{"Id":5817,"Name":"setTriggerOTA","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":[{"Type":0,"NewValue":"{\"Id\":5817,\"Name\":\"setTriggerOTA\",\"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":1761683174},{"Type":1,"NewValue":"{\"Id\":5817,\"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":1761683529}],"Tags":[]}],"Operations":[{"Id":362,"Name":"Access PS Sentry","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    // Sentry protocol - please see variables and typical values in order below\r\n    // Sentry-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    // Sentry-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 N.\r\n    // Created: 01/01/2025\r\n    // Last modified: 14/02/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', 'Sentry');\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 = (`Sentry-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 Sentry-')) {\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 = (`Sentry-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 = (`Sentry;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 = (`Sentry;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 = (`Sentry-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    // 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 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\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  ¿qué es fall OFF?\r\n                            if ((alarmCodeExtInt & 1) == 1) {\r\n                                var alarm = 'ALF-C'; // Fall-DownAlertending\r\n                            }\r\n                            // Welfare Check-out\r\n                            else if ((alarmCodeExtInt & 2) == 2) {\r\n                                var alarm = 'WSTP';\r\n                                if (configs.Welfare.Mode == '1') {\r\n                                    info = 'Recurrent';\r\n                                } else info = 'Amber';\r\n                            }\r\n                            //Geo 5 in\r\n                            //else if ((alarmCodeInt & 16) == 16) {\r\n                            //    var alarm = 'BATL';\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 Alert\r\n                            else if ((alarmCodeInt & 8) == 8) {\r\n                                var alarm = 'Tilt';\r\n                            }\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 Alert\r\n                            else if ((alarmCodeInt & 256) == 256) {\r\n                                var alarm = 'PWRF';\r\n                            }\r\n                            //Power On Alert\r\n                            else if ((alarmCodeInt & 512) == 512) {\r\n                                var alarm = 'PWRN';\r\n                            }\r\n                            //Motion Alert\r\n                            else if ((alarmCodeInt & 1024) == 1024) {\r\n                                var alarm = 'ALMOV';\r\n                            }\r\n                            //No Motion Alert\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                            }\r\n                            // Side call button 1\r\n                            else if ((alarmCodeInt & 8192) == 8192) {\r\n                                var alarm = 'Side1';\r\n                            }\r\n                            // Side call button 2\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                                AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\r\n                                configsToAck.push(configIds.ReadState.Charging);\r\n                                //configs.AlertSettings.Welfare.Mode\r\n                                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\r\n                                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'false');\r\n                                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'true');\r\n                                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'false');\r\n                                    configsToAck.push(configIds.ReadState.Welfare);\r\n                                }\r\n                            }\r\n                            //Battery no charging\r\n                            else if ((alarmCodeInt & 65536) == 65536) {\r\n                                var alarm = 'BATCF';\r\n                                AddValue(configsToUpdate, configIds.ReadState.Charging, 'false');\r\n                                configsToAck.push(configIds.ReadState.Charging);\r\n                                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\r\n                                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'true');\r\n                                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'false');\r\n                                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'true');\r\n                                    configsToAck.push(configIds.ReadState.Welfare);\r\n                                }\r\n                            }\r\n                            //Alert End\r\n                            else if ((alarmCodeInt & 131072) == 131072) {\r\n                                var alarm = 'ALA-F';\r\n                                if (configs.Welfare.Mode == '1') {\r\n                                    info = 'Recurrent';\r\n                                } else info = 'Amber';\r\n                            }\r\n                            //Amber Alert ON    Don`t know the dfference between ALA and ALA-O\r\n                            else if ((alarmCodeInt & 262144) == 262144) {\r\n                                var alarm = 'ALA';\r\n                            }\r\n                            // welfare check in\r\n                            else if ((alarmCodeInt & 524288) == 524288) {\r\n                                var alarm = 'WTS';\r\n                                if (configs.Welfare.Mode == '1') {\r\n                                    info = 'Recurrent';\r\n                                } else info = 'Amber';\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\r\n                            else if ((alarmCodeInt & 4194304) == 4194304) {\r\n                                var alarm = 'ALA-W';\r\n                                if (configs.Welfare.Mode == '1') {\r\n                                    info = 'Recurrent';\r\n                                } else info = 'Amber';\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 != '64') {\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 != '64') {\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 = (`Sentry-${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 = (`Sentry-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                            if ((statusInt & 16) == 16) {\r\n                                statusDevice += 'Charging,';\r\n                                // AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\r\n                                // configsToAck.push(configIds.ReadState.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 != '64') {\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 = (`Sentry-${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 != '64') {\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 = (`Sentry-${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 = (`Sentry-${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 = (`Sentry-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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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                            var report;\r\n                            switch (contactNumber) {\r\n                                // Emergency Number\r\n                                // [Value]:80 2B 33 34 36 33 35 36 30 37 39 33 30\r\n                                //{\"number\":{\"call\":0,\"noCard\":0,\"number\":\"+34635607930\",\"enable\":1,\"sms\":0,\"index\":0}}\r\n                                case '0':\r\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\r\n                                    report = hex2bin(value.substring(0, 2)); // To find report mode Call &data or DAta only\r\n                                    AddValue(codeValues, \"EmergencyNumber\", tel);\r\n                                    AddValue(codeValues, \"ReportMode\", report.substring(2, 3));\r\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\r\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.ReportMode, report.substring(2, 3));\r\n                                    configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\r\n                                    configsToAck.push(configIds.ReadAlertSettings.ReportMode);\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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 '55': // Tilt Angle Alert\r\n                            //[Value]:0A 00 1E 00\r\n                            //{\"tiltAlert\":{\"angle\":30,\"time\":10,\"status\":0,\"dial\":0}}\r\n                            var angle = hexToDecimal(value.substring(4, 6));\r\n                            var timeout = hexToDecimal(value.substring(0, 2));\r\n                            var status = hexToDecimal(value.substring(6, 8));\r\n                            if (status == 0) angle = 0;\r\n                            //var alertSetting = angle;\r\n                            //imei = serverParams.Imei;\r\n                            //messageForReceiver = (`Sentry;ACK-TILTANG;${imei};`);\r\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\r\n                            AddValue(codeValues, \"tiltangle\", angle);\r\n                            AddValue(codeValues, \"tiltimeout\", timeout);\r\n                            AddValue(codeValues, \"tiltstatus\", status);\r\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\r\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltTimeout, timeout);\r\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltAngle, angle);\r\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\r\n                            configsToAck.push(configIds.ReadManDownSettings.TiltTimeout);\r\n                            configsToAck.push(configIds.ReadManDownSettings.TiltAngle);\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 = (`Sentry;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.ManDownSettings, sensibility);\r\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.EnableDisableManDownSettings, enalbleDisable);\r\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.Sensitivity, sesibityOptionValue);\r\n                            //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\r\n                            configsToAck.push(configIds.ReadManDownSettings.EnableDisableManDownSettings);\r\n                            configsToAck.push(configIds.ReadManDownSettings.Sensitivity);\r\n                            break;\r\n                        case '57': // Welfare\r\n                            // [Value]:10 0E 00 80 58 02 00 80\r\n                            //{\"welfareAlert\":{\"time\":600,\"value\":3600,\"status\":1,\"dial\":1}}\r\n                            var welfareStatus = hex2bin(value.substring(6, 8)); // check status\r\n                            var welfareValue = hexToDecimal(changeEndianness(value.substring(0, 6)));\r\n                            var welfareTime = hexToDecimal(changeEndianness(value.substring(8, 14)));\r\n                            var enalbleDisable = '';\r\n                            if ((configs.ReadState.Charging == 'true') && (configs.Welfare.Mode == '1') && (configs.Welfare.EnableDisableWelfare == 'true')) { // Force Read to enable welfare when device is charging in recurrent mode\r\n                                var sensibility = 'Enable, '\r\n                                enalbleDisable = '1'\r\n                            } else {\r\n                                if (welfareStatus.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                            };\r\n                            //var imei = serverParams.Imei;\r\n                            //messageForReceiver = (`Sentry;ACK-WELFALERT;${imei};`);\r\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\r\n                            sensibility += ', ' + welfareValue / 60;\r\n                            sensibility += ', ' + welfareTime / 60;\r\n                            AddValue(codeValues, \"welfare\", sensibility);\r\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.EnableDisableReadWelfare, enalbleDisable);\r\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Prealarm, welfareTime / 60);\r\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Timeout, welfareValue / 60);\r\n                            configsToAck.push(configIds.ReadWelfareSettings.EnableDisableReadWelfare);\r\n                            configsToAck.push(configIds.ReadWelfareSettings.Prealarm);\r\n                            configsToAck.push(configIds.ReadWelfareSettings.Timeout);\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 = (`Sentry;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 '75': // Extra Enable control   Welfare Mode\r\n                            //[Value]:80 00 00 10  last two digit for new/old welfare\r\n                            //{\"extraControl\":{\"bit29\":0,\"bit27\":0,\"bit28\":1,\"bit25\":0,\"bit26\":0,\"flagValue\":268435584,\"bit23\":0,\"bit24\":0,\"bit21\":0,\"bit22\":0,\"bit20\":0,\"bit9\":0,\"bit18\":0,\"bit19\":0,\"bit7\":1,\"bit16\":0,\"bit8\":0,\"bit17\":0,\"bit5\":0,\"bit14\":0,\"bit6\":0,\"bit15\":0,\"bit3\":0,\"bit4\":0,\"bit1\":0,\"bit2\":0,\"bit0\":0,\"bit12\":0,\"bit13\":0,\"bit10\":0,\"bit11\":0,\"bit30\":0,\"bit31\":0}}\r\n                            var extraStatus = hex2bin(value.substring(6, 7)).substring(7, 8);\r\n                            //if (extraStatus.substring(7, 8) == '1') {\r\n                            //    extra += ' Enable, '\r\n                            //} else {\r\n                            //    extra += ' 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, \"welfare Mode\", extraStatus);\r\n                            // messageForReceiver = (`Sentry;ACK-EXTRA;${imei};`);\r\n                            // sendMessageToLocalhostNoWait(messageForReceiver);\r\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Mode, extraStatus);\r\n                            configsToAck.push(configIds.ReadWelfareSettings.Mode);\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 = (`Sentry;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 = (`Sentry;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 = (`Sentry-${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 = (`Sentry-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 = (`Sentry-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 = (`Sentry-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\":362,\"Name\":\"Access PS Sentry\",\"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    // Sentry protocol - please see variables and typical values in order below\\r\\n    // Sentry-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    // Sentry-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 N.\\r\\n    // Created: 01/01/2025\\r\\n    // Last modified: 14/02/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', 'Sentry');\\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 = (`Sentry-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 Sentry-')) {\\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 = (`Sentry-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 = (`Sentry;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 = (`Sentry;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 = (`Sentry-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    // 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 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\\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  ¿qué es fall OFF?\\r\\n                            if ((alarmCodeExtInt & 1) == 1) {\\r\\n                                var alarm = 'ALF-C'; // Fall-DownAlertending\\r\\n                            }\\r\\n                            // Welfare Check-out\\r\\n                            else if ((alarmCodeExtInt & 2) == 2) {\\r\\n                                var alarm = 'WSTP';\\r\\n                                if (configs.Welfare.Mode == '1') {\\r\\n                                    info = 'Recurrent';\\r\\n                                } else info = 'Amber';\\r\\n                            }\\r\\n                            //Geo 5 in\\r\\n                            //else if ((alarmCodeInt & 16) == 16) {\\r\\n                            //    var alarm = 'BATL';\\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 Alert\\r\\n                            else if ((alarmCodeInt & 8) == 8) {\\r\\n                                var alarm = 'Tilt';\\r\\n                            }\\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 Alert\\r\\n                            else if ((alarmCodeInt & 256) == 256) {\\r\\n                                var alarm = 'PWRF';\\r\\n                            }\\r\\n                            //Power On Alert\\r\\n                            else if ((alarmCodeInt & 512) == 512) {\\r\\n                                var alarm = 'PWRN';\\r\\n                            }\\r\\n                            //Motion Alert\\r\\n                            else if ((alarmCodeInt & 1024) == 1024) {\\r\\n                                var alarm = 'ALMOV';\\r\\n                            }\\r\\n                            //No Motion Alert\\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                            }\\r\\n                            // Side call button 1\\r\\n                            else if ((alarmCodeInt & 8192) == 8192) {\\r\\n                                var alarm = 'Side1';\\r\\n                            }\\r\\n                            // Side call button 2\\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                                AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                                configsToAck.push(configIds.ReadState.Charging);\\r\\n                                //configs.AlertSettings.Welfare.Mode\\r\\n                                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'false');\\r\\n                                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'true');\\r\\n                                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'false');\\r\\n                                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                                }\\r\\n                            }\\r\\n                            //Battery no charging\\r\\n                            else if ((alarmCodeInt & 65536) == 65536) {\\r\\n                                var alarm = 'BATCF';\\r\\n                                AddValue(configsToUpdate, configIds.ReadState.Charging, 'false');\\r\\n                                configsToAck.push(configIds.ReadState.Charging);\\r\\n                                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'true');\\r\\n                                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'false');\\r\\n                                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'true');\\r\\n                                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                                }\\r\\n                            }\\r\\n                            //Alert End\\r\\n                            else if ((alarmCodeInt & 131072) == 131072) {\\r\\n                                var alarm = 'ALA-F';\\r\\n                                if (configs.Welfare.Mode == '1') {\\r\\n                                    info = 'Recurrent';\\r\\n                                } else info = 'Amber';\\r\\n                            }\\r\\n                            //Amber Alert ON    Don`t know the dfference between ALA and ALA-O\\r\\n                            else if ((alarmCodeInt & 262144) == 262144) {\\r\\n                                var alarm = 'ALA';\\r\\n                            }\\r\\n                            // welfare check in\\r\\n                            else if ((alarmCodeInt & 524288) == 524288) {\\r\\n                                var alarm = 'WTS';\\r\\n                                if (configs.Welfare.Mode == '1') {\\r\\n                                    info = 'Recurrent';\\r\\n                                } else info = 'Amber';\\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\\r\\n                            else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n                                var alarm = 'ALA-W';\\r\\n                                if (configs.Welfare.Mode == '1') {\\r\\n                                    info = 'Recurrent';\\r\\n                                } else info = 'Amber';\\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 != '64') {\\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 != '64') {\\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 = (`Sentry-${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 = (`Sentry-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                            if ((statusInt & 16) == 16) {\\r\\n                                statusDevice += 'Charging,';\\r\\n                                // AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                                // configsToAck.push(configIds.ReadState.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 != '64') {\\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 = (`Sentry-${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 != '64') {\\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 = (`Sentry-${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 = (`Sentry-${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 = (`Sentry-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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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                            var report;\\r\\n                            switch (contactNumber) {\\r\\n                                // Emergency Number\\r\\n                                // [Value]:80 2B 33 34 36 33 35 36 30 37 39 33 30\\r\\n                                //{\\\"number\\\":{\\\"call\\\":0,\\\"noCard\\\":0,\\\"number\\\":\\\"+34635607930\\\",\\\"enable\\\":1,\\\"sms\\\":0,\\\"index\\\":0}}\\r\\n                                case '0':\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    report = hex2bin(value.substring(0, 2)); // To find report mode Call &data or DAta only\\r\\n                                    AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                                    AddValue(codeValues, \\\"ReportMode\\\", report.substring(2, 3));\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.ReportMode, report.substring(2, 3));\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.ReportMode);\\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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 '55': // Tilt Angle Alert\\r\\n                            //[Value]:0A 00 1E 00\\r\\n                            //{\\\"tiltAlert\\\":{\\\"angle\\\":30,\\\"time\\\":10,\\\"status\\\":0,\\\"dial\\\":0}}\\r\\n                            var angle = hexToDecimal(value.substring(4, 6));\\r\\n                            var timeout = hexToDecimal(value.substring(0, 2));\\r\\n                            var status = hexToDecimal(value.substring(6, 8));\\r\\n                            if (status == 0) angle = 0;\\r\\n                            //var alertSetting = angle;\\r\\n                            //imei = serverParams.Imei;\\r\\n                            //messageForReceiver = (`Sentry;ACK-TILTANG;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"tiltangle\\\", angle);\\r\\n                            AddValue(codeValues, \\\"tiltimeout\\\", timeout);\\r\\n                            AddValue(codeValues, \\\"tiltstatus\\\", status);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltTimeout, timeout);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltAngle, angle);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltTimeout);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltAngle);\\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 = (`Sentry;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.ManDownSettings, sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.EnableDisableManDownSettings, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.Sensitivity, sesibityOptionValue);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.EnableDisableManDownSettings);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.Sensitivity);\\r\\n                            break;\\r\\n                        case '57': // Welfare\\r\\n                            // [Value]:10 0E 00 80 58 02 00 80\\r\\n                            //{\\\"welfareAlert\\\":{\\\"time\\\":600,\\\"value\\\":3600,\\\"status\\\":1,\\\"dial\\\":1}}\\r\\n                            var welfareStatus = hex2bin(value.substring(6, 8)); // check status\\r\\n                            var welfareValue = hexToDecimal(changeEndianness(value.substring(0, 6)));\\r\\n                            var welfareTime = hexToDecimal(changeEndianness(value.substring(8, 14)));\\r\\n                            var enalbleDisable = '';\\r\\n                            if ((configs.ReadState.Charging == 'true') && (configs.Welfare.Mode == '1') && (configs.Welfare.EnableDisableWelfare == 'true')) { // Force Read to enable welfare when device is charging in recurrent mode\\r\\n                                var sensibility = 'Enable, '\\r\\n                                enalbleDisable = '1'\\r\\n                            } else {\\r\\n                                if (welfareStatus.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                            };\\r\\n                            //var imei = serverParams.Imei;\\r\\n                            //messageForReceiver = (`Sentry;ACK-WELFALERT;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            sensibility += ', ' + welfareValue / 60;\\r\\n                            sensibility += ', ' + welfareTime / 60;\\r\\n                            AddValue(codeValues, \\\"welfare\\\", sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.EnableDisableReadWelfare, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Prealarm, welfareTime / 60);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Timeout, welfareValue / 60);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.EnableDisableReadWelfare);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Prealarm);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Timeout);\\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 = (`Sentry;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 '75': // Extra Enable control   Welfare Mode\\r\\n                            //[Value]:80 00 00 10  last two digit for new/old welfare\\r\\n                            //{\\\"extraControl\\\":{\\\"bit29\\\":0,\\\"bit27\\\":0,\\\"bit28\\\":1,\\\"bit25\\\":0,\\\"bit26\\\":0,\\\"flagValue\\\":268435584,\\\"bit23\\\":0,\\\"bit24\\\":0,\\\"bit21\\\":0,\\\"bit22\\\":0,\\\"bit20\\\":0,\\\"bit9\\\":0,\\\"bit18\\\":0,\\\"bit19\\\":0,\\\"bit7\\\":1,\\\"bit16\\\":0,\\\"bit8\\\":0,\\\"bit17\\\":0,\\\"bit5\\\":0,\\\"bit14\\\":0,\\\"bit6\\\":0,\\\"bit15\\\":0,\\\"bit3\\\":0,\\\"bit4\\\":0,\\\"bit1\\\":0,\\\"bit2\\\":0,\\\"bit0\\\":0,\\\"bit12\\\":0,\\\"bit13\\\":0,\\\"bit10\\\":0,\\\"bit11\\\":0,\\\"bit30\\\":0,\\\"bit31\\\":0}}\\r\\n                            var extraStatus = hex2bin(value.substring(6, 7)).substring(7, 8);\\r\\n                            //if (extraStatus.substring(7, 8) == '1') {\\r\\n                            //    extra += ' Enable, '\\r\\n                            //} else {\\r\\n                            //    extra += ' 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, \\\"welfare Mode\\\", extraStatus);\\r\\n                            // messageForReceiver = (`Sentry;ACK-EXTRA;${imei};`);\\r\\n                            // sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Mode, extraStatus);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Mode);\\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 = value.substring(1, 2);\\r\\n                            //var wifiStatus = hexToDecimal(value.substring(0, 1));\\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') || (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 = (`Sentry;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 = (`Sentry;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 = (`Sentry-${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 = (`Sentry-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 = (`Sentry-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 = (`Sentry-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":1740071496},{"Type":1,"NewValue":"{\"Id\":362,\"Name\":\"Access PS Sentry\",\"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    // Sentry protocol - please see variables and typical values in order below\\r\\n    // Sentry-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    // Sentry-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 N.\\r\\n    // Created: 01/01/2025\\r\\n    // Last modified: 14/02/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', 'Sentry');\\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 = (`Sentry-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 Sentry-')) {\\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 = (`Sentry-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 = (`Sentry;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 = (`Sentry;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 = (`Sentry-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    // 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 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\\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  ¿qué es fall OFF?\\r\\n                            if ((alarmCodeExtInt & 1) == 1) {\\r\\n                                var alarm = 'ALF-C'; // Fall-DownAlertending\\r\\n                            }\\r\\n                            // Welfare Check-out\\r\\n                            else if ((alarmCodeExtInt & 2) == 2) {\\r\\n                                var alarm = 'WSTP';\\r\\n                                if (configs.Welfare.Mode == '1') {\\r\\n                                    info = 'Recurrent';\\r\\n                                } else info = 'Amber';\\r\\n                            }\\r\\n                            //Geo 5 in\\r\\n                            //else if ((alarmCodeInt & 16) == 16) {\\r\\n                            //    var alarm = 'BATL';\\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 Alert\\r\\n                            else if ((alarmCodeInt & 8) == 8) {\\r\\n                                var alarm = 'Tilt';\\r\\n                            }\\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 Alert\\r\\n                            else if ((alarmCodeInt & 256) == 256) {\\r\\n                                var alarm = 'PWRF';\\r\\n                            }\\r\\n                            //Power On Alert\\r\\n                            else if ((alarmCodeInt & 512) == 512) {\\r\\n                                var alarm = 'PWRN';\\r\\n                            }\\r\\n                            //Motion Alert\\r\\n                            else if ((alarmCodeInt & 1024) == 1024) {\\r\\n                                var alarm = 'ALMOV';\\r\\n                            }\\r\\n                            //No Motion Alert\\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                            }\\r\\n                            // Side call button 1\\r\\n                            else if ((alarmCodeInt & 8192) == 8192) {\\r\\n                                var alarm = 'Side1';\\r\\n                            }\\r\\n                            // Side call button 2\\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                                AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                                configsToAck.push(configIds.ReadState.Charging);\\r\\n                                //configs.AlertSettings.Welfare.Mode\\r\\n                                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'false');\\r\\n                                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'true');\\r\\n                                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'false');\\r\\n                                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                                }\\r\\n                            }\\r\\n                            //Battery no charging\\r\\n                            else if ((alarmCodeInt & 65536) == 65536) {\\r\\n                                var alarm = 'BATCF';\\r\\n                                AddValue(configsToUpdate, configIds.ReadState.Charging, 'false');\\r\\n                                configsToAck.push(configIds.ReadState.Charging);\\r\\n                                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'true');\\r\\n                                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'false');\\r\\n                                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'true');\\r\\n                                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                                }\\r\\n                            }\\r\\n                            //Alert End\\r\\n                            else if ((alarmCodeInt & 131072) == 131072) {\\r\\n                                var alarm = 'ALA-F';\\r\\n                                if (configs.Welfare.Mode == '1') {\\r\\n                                    info = 'Recurrent';\\r\\n                                } else info = 'Amber';\\r\\n                            }\\r\\n                            //Amber Alert ON    Don`t know the dfference between ALA and ALA-O\\r\\n                            else if ((alarmCodeInt & 262144) == 262144) {\\r\\n                                var alarm = 'ALA';\\r\\n                            }\\r\\n                            // welfare check in\\r\\n                            else if ((alarmCodeInt & 524288) == 524288) {\\r\\n                                var alarm = 'WTS';\\r\\n                                if (configs.Welfare.Mode == '1') {\\r\\n                                    info = 'Recurrent';\\r\\n                                } else info = 'Amber';\\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\\r\\n                            else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n                                var alarm = 'ALA-W';\\r\\n                                if (configs.Welfare.Mode == '1') {\\r\\n                                    info = 'Recurrent';\\r\\n                                } else info = 'Amber';\\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 != '64') {\\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 != '64') {\\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 = (`Sentry-${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 = (`Sentry-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                            if ((statusInt & 16) == 16) {\\r\\n                                statusDevice += 'Charging,';\\r\\n                                // AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                                // configsToAck.push(configIds.ReadState.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 != '64') {\\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 = (`Sentry-${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 != '64') {\\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 = (`Sentry-${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 = (`Sentry-${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 = (`Sentry-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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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                            var report;\\r\\n                            switch (contactNumber) {\\r\\n                                // Emergency Number\\r\\n                                // [Value]:80 2B 33 34 36 33 35 36 30 37 39 33 30\\r\\n                                //{\\\"number\\\":{\\\"call\\\":0,\\\"noCard\\\":0,\\\"number\\\":\\\"+34635607930\\\",\\\"enable\\\":1,\\\"sms\\\":0,\\\"index\\\":0}}\\r\\n                                case '0':\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    report = hex2bin(value.substring(0, 2)); // To find report mode Call &data or DAta only\\r\\n                                    AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                                    AddValue(codeValues, \\\"ReportMode\\\", report.substring(2, 3));\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.ReportMode, report.substring(2, 3));\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.ReportMode);\\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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 '55': // Tilt Angle Alert\\r\\n                            //[Value]:0A 00 1E 00\\r\\n                            //{\\\"tiltAlert\\\":{\\\"angle\\\":30,\\\"time\\\":10,\\\"status\\\":0,\\\"dial\\\":0}}\\r\\n                            var angle = hexToDecimal(value.substring(4, 6));\\r\\n                            var timeout = hexToDecimal(value.substring(0, 2));\\r\\n                            var status = hexToDecimal(value.substring(6, 8));\\r\\n                            if (status == 0) angle = 0;\\r\\n                            //var alertSetting = angle;\\r\\n                            //imei = serverParams.Imei;\\r\\n                            //messageForReceiver = (`Sentry;ACK-TILTANG;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"tiltangle\\\", angle);\\r\\n                            AddValue(codeValues, \\\"tiltimeout\\\", timeout);\\r\\n                            AddValue(codeValues, \\\"tiltstatus\\\", status);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltTimeout, timeout);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltAngle, angle);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltTimeout);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltAngle);\\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 = (`Sentry;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.ManDownSettings, sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.EnableDisableManDownSettings, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.Sensitivity, sesibityOptionValue);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.EnableDisableManDownSettings);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.Sensitivity);\\r\\n                            break;\\r\\n                        case '57': // Welfare\\r\\n                            // [Value]:10 0E 00 80 58 02 00 80\\r\\n                            //{\\\"welfareAlert\\\":{\\\"time\\\":600,\\\"value\\\":3600,\\\"status\\\":1,\\\"dial\\\":1}}\\r\\n                            var welfareStatus = hex2bin(value.substring(6, 8)); // check status\\r\\n                            var welfareValue = hexToDecimal(changeEndianness(value.substring(0, 6)));\\r\\n                            var welfareTime = hexToDecimal(changeEndianness(value.substring(8, 14)));\\r\\n                            var enalbleDisable = '';\\r\\n                            if ((configs.ReadState.Charging == 'true') && (configs.Welfare.Mode == '1') && (configs.Welfare.EnableDisableWelfare == 'true')) { // Force Read to enable welfare when device is charging in recurrent mode\\r\\n                                var sensibility = 'Enable, '\\r\\n                                enalbleDisable = '1'\\r\\n                            } else {\\r\\n                                if (welfareStatus.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                            };\\r\\n                            //var imei = serverParams.Imei;\\r\\n                            //messageForReceiver = (`Sentry;ACK-WELFALERT;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            sensibility += ', ' + welfareValue / 60;\\r\\n                            sensibility += ', ' + welfareTime / 60;\\r\\n                            AddValue(codeValues, \\\"welfare\\\", sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.EnableDisableReadWelfare, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Prealarm, welfareTime / 60);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Timeout, welfareValue / 60);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.EnableDisableReadWelfare);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Prealarm);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Timeout);\\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 = (`Sentry;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 '75': // Extra Enable control   Welfare Mode\\r\\n                            //[Value]:80 00 00 10  last two digit for new/old welfare\\r\\n                            //{\\\"extraControl\\\":{\\\"bit29\\\":0,\\\"bit27\\\":0,\\\"bit28\\\":1,\\\"bit25\\\":0,\\\"bit26\\\":0,\\\"flagValue\\\":268435584,\\\"bit23\\\":0,\\\"bit24\\\":0,\\\"bit21\\\":0,\\\"bit22\\\":0,\\\"bit20\\\":0,\\\"bit9\\\":0,\\\"bit18\\\":0,\\\"bit19\\\":0,\\\"bit7\\\":1,\\\"bit16\\\":0,\\\"bit8\\\":0,\\\"bit17\\\":0,\\\"bit5\\\":0,\\\"bit14\\\":0,\\\"bit6\\\":0,\\\"bit15\\\":0,\\\"bit3\\\":0,\\\"bit4\\\":0,\\\"bit1\\\":0,\\\"bit2\\\":0,\\\"bit0\\\":0,\\\"bit12\\\":0,\\\"bit13\\\":0,\\\"bit10\\\":0,\\\"bit11\\\":0,\\\"bit30\\\":0,\\\"bit31\\\":0}}\\r\\n                            var extraStatus = hex2bin(value.substring(6, 7)).substring(7, 8);\\r\\n                            //if (extraStatus.substring(7, 8) == '1') {\\r\\n                            //    extra += ' Enable, '\\r\\n                            //} else {\\r\\n                            //    extra += ' 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, \\\"welfare Mode\\\", extraStatus);\\r\\n                            // messageForReceiver = (`Sentry;ACK-EXTRA;${imei};`);\\r\\n                            // sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Mode, extraStatus);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Mode);\\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 = (`Sentry;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 = (`Sentry;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 = (`Sentry-${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 = (`Sentry-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 = (`Sentry-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 = (`Sentry-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":1740072152},{"Type":1,"NewValue":"{\"Id\":362,\"Name\":\"Access PS Sentry\",\"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    // Sentry protocol - please see variables and typical values in order below\\r\\n    // Sentry-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    // Sentry-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 N.\\r\\n    // Created: 01/01/2025\\r\\n    // Last modified: 14/02/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', 'Sentry');\\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 = (`Sentry-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 Sentry-')) {\\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 = (`Sentry-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 = (`Sentry;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 = (`Sentry;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 = (`Sentry-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    // 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 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\\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  ¿qué es fall OFF?\\r\\n                            if ((alarmCodeExtInt & 1) == 1) {\\r\\n                                var alarm = 'ALF-C'; // Fall-DownAlertending\\r\\n                            }\\r\\n                            // Welfare Check-out\\r\\n                            else if ((alarmCodeExtInt & 2) == 2) {\\r\\n                                var alarm = 'WSTP';\\r\\n                                if (configs.Welfare.Mode == '1') {\\r\\n                                    info = 'Recurrent';\\r\\n                                } else info = 'Amber';\\r\\n                            }\\r\\n                            //Geo 5 in\\r\\n                            //else if ((alarmCodeInt & 16) == 16) {\\r\\n                            //    var alarm = 'BATL';\\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 Alert\\r\\n                            else if ((alarmCodeInt & 8) == 8) {\\r\\n                                var alarm = 'Tilt';\\r\\n                            }\\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 Alert\\r\\n                            else if ((alarmCodeInt & 256) == 256) {\\r\\n                                var alarm = 'PWRF';\\r\\n                            }\\r\\n                            //Power On Alert\\r\\n                            else if ((alarmCodeInt & 512) == 512) {\\r\\n                                var alarm = 'PWRN';\\r\\n                            }\\r\\n                            //Motion Alert\\r\\n                            else if ((alarmCodeInt & 1024) == 1024) {\\r\\n                                var alarm = 'ALMOV';\\r\\n                            }\\r\\n                            //No Motion Alert\\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                            }\\r\\n                            // Side call button 1\\r\\n                            else if ((alarmCodeInt & 8192) == 8192) {\\r\\n                                var alarm = 'Side1';\\r\\n                            }\\r\\n                            // Side call button 2\\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                                AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                                configsToAck.push(configIds.ReadState.Charging);\\r\\n                                //configs.AlertSettings.Welfare.Mode\\r\\n                                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'false');\\r\\n                                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'true');\\r\\n                                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'false');\\r\\n                                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                                }\\r\\n                            }\\r\\n                            //Battery no charging\\r\\n                            else if ((alarmCodeInt & 65536) == 65536) {\\r\\n                                var alarm = 'BATCF';\\r\\n                                AddValue(configsToUpdate, configIds.ReadState.Charging, 'false');\\r\\n                                configsToAck.push(configIds.ReadState.Charging);\\r\\n                                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'true');\\r\\n                                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'false');\\r\\n                                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'true');\\r\\n                                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                                }\\r\\n                            }\\r\\n                            //Alert End\\r\\n                            else if ((alarmCodeInt & 131072) == 131072) {\\r\\n                                var alarm = 'ALA-F';\\r\\n                                if (configs.Welfare.Mode == '1') {\\r\\n                                    info = 'Recurrent';\\r\\n                                } else info = 'Amber';\\r\\n                            }\\r\\n                            //Amber Alert ON    Don`t know the dfference between ALA and ALA-O\\r\\n                            else if ((alarmCodeInt & 262144) == 262144) {\\r\\n                                var alarm = 'ALA';\\r\\n                            }\\r\\n                            // welfare check in\\r\\n                            else if ((alarmCodeInt & 524288) == 524288) {\\r\\n                                var alarm = 'WTS';\\r\\n                                if (configs.Welfare.Mode == '1') {\\r\\n                                    info = 'Recurrent';\\r\\n                                } else info = 'Amber';\\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\\r\\n                            else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n                                var alarm = 'ALA-W';\\r\\n                                if (configs.Welfare.Mode == '1') {\\r\\n                                    info = 'Recurrent';\\r\\n                                } else info = 'Amber';\\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 != '64') {\\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 != '64') {\\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 = (`Sentry-${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 = (`Sentry-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                            if ((statusInt & 16) == 16) {\\r\\n                                statusDevice += 'Charging,';\\r\\n                                // AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                                // configsToAck.push(configIds.ReadState.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 != '64') {\\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 = (`Sentry-${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 != '64') {\\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 = (`Sentry-${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 = (`Sentry-${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 = (`Sentry-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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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                            var report;\\r\\n                            switch (contactNumber) {\\r\\n                                // Emergency Number\\r\\n                                // [Value]:80 2B 33 34 36 33 35 36 30 37 39 33 30\\r\\n                                //{\\\"number\\\":{\\\"call\\\":0,\\\"noCard\\\":0,\\\"number\\\":\\\"+34635607930\\\",\\\"enable\\\":1,\\\"sms\\\":0,\\\"index\\\":0}}\\r\\n                                case '0':\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    report = hex2bin(value.substring(0, 2)); // To find report mode Call &data or DAta only\\r\\n                                    AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                                    AddValue(codeValues, \\\"ReportMode\\\", report.substring(2, 3));\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.ReportMode, report.substring(2, 3));\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.ReportMode);\\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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 '55': // Tilt Angle Alert\\r\\n                            //[Value]:0A 00 1E 00\\r\\n                            //{\\\"tiltAlert\\\":{\\\"angle\\\":30,\\\"time\\\":10,\\\"status\\\":0,\\\"dial\\\":0}}\\r\\n                            var angle = hexToDecimal(value.substring(4, 6));\\r\\n                            var timeout = hexToDecimal(value.substring(0, 2));\\r\\n                            var status = hexToDecimal(value.substring(6, 8));\\r\\n                            if (status == 0) angle = 0;\\r\\n                            //var alertSetting = angle;\\r\\n                            //imei = serverParams.Imei;\\r\\n                            //messageForReceiver = (`Sentry;ACK-TILTANG;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"tiltangle\\\", angle);\\r\\n                            AddValue(codeValues, \\\"tiltimeout\\\", timeout);\\r\\n                            AddValue(codeValues, \\\"tiltstatus\\\", status);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltTimeout, timeout);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltAngle, angle);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltTimeout);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltAngle);\\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 = (`Sentry;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.ManDownSettings, sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.EnableDisableManDownSettings, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.Sensitivity, sesibityOptionValue);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.EnableDisableManDownSettings);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.Sensitivity);\\r\\n                            break;\\r\\n                        case '57': // Welfare\\r\\n                            // [Value]:10 0E 00 80 58 02 00 80\\r\\n                            //{\\\"welfareAlert\\\":{\\\"time\\\":600,\\\"value\\\":3600,\\\"status\\\":1,\\\"dial\\\":1}}\\r\\n                            var welfareStatus = hex2bin(value.substring(6, 8)); // check status\\r\\n                            var welfareValue = hexToDecimal(changeEndianness(value.substring(0, 6)));\\r\\n                            var welfareTime = hexToDecimal(changeEndianness(value.substring(8, 14)));\\r\\n                            var enalbleDisable = '';\\r\\n                            if ((configs.ReadState.Charging == 'true') && (configs.Welfare.Mode == '1') && (configs.Welfare.EnableDisableWelfare == 'true')) { // Force Read to enable welfare when device is charging in recurrent mode\\r\\n                                var sensibility = 'Enable, '\\r\\n                                enalbleDisable = '1'\\r\\n                            } else {\\r\\n                                if (welfareStatus.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                            };\\r\\n                            //var imei = serverParams.Imei;\\r\\n                            //messageForReceiver = (`Sentry;ACK-WELFALERT;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            sensibility += ', ' + welfareValue / 60;\\r\\n                            sensibility += ', ' + welfareTime / 60;\\r\\n                            AddValue(codeValues, \\\"welfare\\\", sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.EnableDisableReadWelfare, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Prealarm, welfareTime / 60);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Timeout, welfareValue / 60);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.EnableDisableReadWelfare);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Prealarm);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Timeout);\\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 = (`Sentry;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 '75': // Extra Enable control   Welfare Mode\\r\\n                            //[Value]:80 00 00 10  last two digit for new/old welfare\\r\\n                            //{\\\"extraControl\\\":{\\\"bit29\\\":0,\\\"bit27\\\":0,\\\"bit28\\\":1,\\\"bit25\\\":0,\\\"bit26\\\":0,\\\"flagValue\\\":268435584,\\\"bit23\\\":0,\\\"bit24\\\":0,\\\"bit21\\\":0,\\\"bit22\\\":0,\\\"bit20\\\":0,\\\"bit9\\\":0,\\\"bit18\\\":0,\\\"bit19\\\":0,\\\"bit7\\\":1,\\\"bit16\\\":0,\\\"bit8\\\":0,\\\"bit17\\\":0,\\\"bit5\\\":0,\\\"bit14\\\":0,\\\"bit6\\\":0,\\\"bit15\\\":0,\\\"bit3\\\":0,\\\"bit4\\\":0,\\\"bit1\\\":0,\\\"bit2\\\":0,\\\"bit0\\\":0,\\\"bit12\\\":0,\\\"bit13\\\":0,\\\"bit10\\\":0,\\\"bit11\\\":0,\\\"bit30\\\":0,\\\"bit31\\\":0}}\\r\\n                            var extraStatus = hex2bin(value.substring(6, 7)).substring(7, 8);\\r\\n                            //if (extraStatus.substring(7, 8) == '1') {\\r\\n                            //    extra += ' Enable, '\\r\\n                            //} else {\\r\\n                            //    extra += ' 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, \\\"welfare Mode\\\", extraStatus);\\r\\n                            // messageForReceiver = (`Sentry;ACK-EXTRA;${imei};`);\\r\\n                            // sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Mode, extraStatus);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Mode);\\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 = (`Sentry;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 = (`Sentry;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 = (`Sentry-${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 = (`Sentry-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 = (`Sentry-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 = (`Sentry-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":1740505836},{"Type":1,"NewValue":"{\"Id\":362,\"Name\":\"Access PS Sentry\",\"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    // Sentry protocol - please see variables and typical values in order below\\r\\n    // Sentry-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    // Sentry-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 N.\\r\\n    // Created: 01/01/2025\\r\\n    // Last modified: 14/02/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', 'Sentry');\\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 = (`Sentry-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 Sentry-')) {\\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 = (`Sentry-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 = (`Sentry;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 = (`Sentry;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 = (`Sentry-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    // 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 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\\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  ¿qué es fall OFF?\\r\\n                            if ((alarmCodeExtInt & 1) == 1) {\\r\\n                                var alarm = 'ALF-C'; // Fall-DownAlertending\\r\\n                            }\\r\\n                            // Welfare Check-out\\r\\n                            else if ((alarmCodeExtInt & 2) == 2) {\\r\\n                                var alarm = 'WSTP';\\r\\n                                if (configs.Welfare.Mode == '1') {\\r\\n                                    info = 'Recurrent';\\r\\n                                } else info = 'Amber';\\r\\n                            }\\r\\n                            //Geo 5 in\\r\\n                            //else if ((alarmCodeInt & 16) == 16) {\\r\\n                            //    var alarm = 'BATL';\\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 Alert\\r\\n                            else if ((alarmCodeInt & 8) == 8) {\\r\\n                                var alarm = 'Tilt';\\r\\n                            }\\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 Alert\\r\\n                            else if ((alarmCodeInt & 256) == 256) {\\r\\n                                var alarm = 'PWRF';\\r\\n                            }\\r\\n                            //Power On Alert\\r\\n                            else if ((alarmCodeInt & 512) == 512) {\\r\\n                                var alarm = 'PWRN';\\r\\n                            }\\r\\n                            //Motion Alert\\r\\n                            else if ((alarmCodeInt & 1024) == 1024) {\\r\\n                                var alarm = 'ALMOV';\\r\\n                            }\\r\\n                            //No Motion Alert\\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                            }\\r\\n                            // Side call button 1\\r\\n                            else if ((alarmCodeInt & 8192) == 8192) {\\r\\n                                var alarm = 'Side1';\\r\\n                            }\\r\\n                            // Side call button 2\\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                                AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                                configsToAck.push(configIds.ReadState.Charging);\\r\\n                                //configs.AlertSettings.Welfare.Mode\\r\\n                                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'false');\\r\\n                                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'true');\\r\\n                                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'false');\\r\\n                                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                                }\\r\\n                            }\\r\\n                            //Battery no charging\\r\\n                            else if ((alarmCodeInt & 65536) == 65536) {\\r\\n                                var alarm = 'BATCF';\\r\\n                                AddValue(configsToUpdate, configIds.ReadState.Charging, 'false');\\r\\n                                configsToAck.push(configIds.ReadState.Charging);\\r\\n                                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'true');\\r\\n                                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'false');\\r\\n                                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'true');\\r\\n                                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                                }\\r\\n                            }\\r\\n                            //Alert End\\r\\n                            else if ((alarmCodeInt & 131072) == 131072) {\\r\\n                                var alarm = 'ALA-F';\\r\\n                                if (configs.Welfare.Mode == '1') {\\r\\n                                    info = 'Recurrent';\\r\\n                                } else info = 'Amber';\\r\\n                            }\\r\\n                            //Amber Alert ON    Don`t know the dfference between ALA and ALA-O\\r\\n                            else if ((alarmCodeInt & 262144) == 262144) {\\r\\n                                var alarm = 'ALA';\\r\\n                            }\\r\\n                            // welfare check in\\r\\n                            else if ((alarmCodeInt & 524288) == 524288) {\\r\\n                                var alarm = 'WTS';\\r\\n                                if (configs.Welfare.Mode == '1') {\\r\\n                                    info = 'Recurrent';\\r\\n                                } else info = 'Amber';\\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\\r\\n                            else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n                                var alarm = 'ALA-W';\\r\\n                                if (configs.Welfare.Mode == '1') {\\r\\n                                    info = 'Recurrent';\\r\\n                                } else info = 'Amber';\\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 != '64') {\\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 != '64') {\\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 = (`Sentry-${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 = (`Sentry-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                            if ((statusInt & 16) == 16) {\\r\\n                                statusDevice += 'Charging,';\\r\\n                                // AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                                // configsToAck.push(configIds.ReadState.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 != '64') {\\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 = (`Sentry-${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 != '64') {\\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 = (`Sentry-${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 = (`Sentry-${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 = (`Sentry-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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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                            var report;\\r\\n                            switch (contactNumber) {\\r\\n                                // Emergency Number\\r\\n                                // [Value]:80 2B 33 34 36 33 35 36 30 37 39 33 30\\r\\n                                //{\\\"number\\\":{\\\"call\\\":0,\\\"noCard\\\":0,\\\"number\\\":\\\"+34635607930\\\",\\\"enable\\\":1,\\\"sms\\\":0,\\\"index\\\":0}}\\r\\n                                case '0':\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (telLength < 6) { //if no telephone defined\\r\\n                                        tel = '';\\r\\n                                    }\\r\\n                                    report = hex2bin(value.substring(0, 2)); // To find report mode Call &data or DAta only\\r\\n                                    AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                                    AddValue(codeValues, \\\"ReportMode\\\", report.substring(2, 3));\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.ReportMode, report.substring(2, 3));\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.ReportMode);\\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                                    if (telLength < 6) { //if no telephone defined\\r\\n                                        tel = '';\\r\\n                                    }\\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 (telLength < 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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 '55': // Tilt Angle Alert\\r\\n                            //[Value]:0A 00 1E 00\\r\\n                            //{\\\"tiltAlert\\\":{\\\"angle\\\":30,\\\"time\\\":10,\\\"status\\\":0,\\\"dial\\\":0}}\\r\\n                            var angle = hexToDecimal(value.substring(4, 6));\\r\\n                            var timeout = hexToDecimal(value.substring(0, 2));\\r\\n                            var status = hexToDecimal(value.substring(6, 8));\\r\\n                            if (status == 0) angle = 0;\\r\\n                            //var alertSetting = angle;\\r\\n                            //imei = serverParams.Imei;\\r\\n                            //messageForReceiver = (`Sentry;ACK-TILTANG;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"tiltangle\\\", angle);\\r\\n                            AddValue(codeValues, \\\"tiltimeout\\\", timeout);\\r\\n                            AddValue(codeValues, \\\"tiltstatus\\\", status);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltTimeout, timeout);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltAngle, angle);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltTimeout);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltAngle);\\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 = (`Sentry;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.ManDownSettings, sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.EnableDisableManDownSettings, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.Sensitivity, sesibityOptionValue);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.EnableDisableManDownSettings);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.Sensitivity);\\r\\n                            break;\\r\\n                        case '57': // Welfare\\r\\n                            // [Value]:10 0E 00 80 58 02 00 80\\r\\n                            //{\\\"welfareAlert\\\":{\\\"time\\\":600,\\\"value\\\":3600,\\\"status\\\":1,\\\"dial\\\":1}}\\r\\n                            var welfareStatus = hex2bin(value.substring(6, 8)); // check status\\r\\n                            var welfareValue = hexToDecimal(changeEndianness(value.substring(0, 6)));\\r\\n                            var welfareTime = hexToDecimal(changeEndianness(value.substring(8, 14)));\\r\\n                            var enalbleDisable = '';\\r\\n                            if ((configs.ReadState.Charging == 'true') && (configs.Welfare.Mode == '1') && (configs.Welfare.EnableDisableWelfare == 'true')) { // Force Read to enable welfare when device is charging in recurrent mode\\r\\n                                var sensibility = 'Enable, '\\r\\n                                enalbleDisable = '1'\\r\\n                            } else {\\r\\n                                if (welfareStatus.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                            };\\r\\n                            //var imei = serverParams.Imei;\\r\\n                            //messageForReceiver = (`Sentry;ACK-WELFALERT;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            sensibility += ', ' + welfareValue / 60;\\r\\n                            sensibility += ', ' + welfareTime / 60;\\r\\n                            AddValue(codeValues, \\\"welfare\\\", sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.EnableDisableReadWelfare, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Prealarm, welfareTime / 60);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Timeout, welfareValue / 60);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.EnableDisableReadWelfare);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Prealarm);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Timeout);\\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 = (`Sentry;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 '75': // Extra Enable control   Welfare Mode\\r\\n                            //[Value]:80 00 00 10  last two digit for new/old welfare\\r\\n                            //{\\\"extraControl\\\":{\\\"bit29\\\":0,\\\"bit27\\\":0,\\\"bit28\\\":1,\\\"bit25\\\":0,\\\"bit26\\\":0,\\\"flagValue\\\":268435584,\\\"bit23\\\":0,\\\"bit24\\\":0,\\\"bit21\\\":0,\\\"bit22\\\":0,\\\"bit20\\\":0,\\\"bit9\\\":0,\\\"bit18\\\":0,\\\"bit19\\\":0,\\\"bit7\\\":1,\\\"bit16\\\":0,\\\"bit8\\\":0,\\\"bit17\\\":0,\\\"bit5\\\":0,\\\"bit14\\\":0,\\\"bit6\\\":0,\\\"bit15\\\":0,\\\"bit3\\\":0,\\\"bit4\\\":0,\\\"bit1\\\":0,\\\"bit2\\\":0,\\\"bit0\\\":0,\\\"bit12\\\":0,\\\"bit13\\\":0,\\\"bit10\\\":0,\\\"bit11\\\":0,\\\"bit30\\\":0,\\\"bit31\\\":0}}\\r\\n                            var extraStatus = hex2bin(value.substring(6, 7)).substring(7, 8);\\r\\n                            //if (extraStatus.substring(7, 8) == '1') {\\r\\n                            //    extra += ' Enable, '\\r\\n                            //} else {\\r\\n                            //    extra += ' 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, \\\"welfare Mode\\\", extraStatus);\\r\\n                            // messageForReceiver = (`Sentry;ACK-EXTRA;${imei};`);\\r\\n                            // sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Mode, extraStatus);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Mode);\\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 = (`Sentry;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 = (`Sentry;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 = (`Sentry-${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 = (`Sentry-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 = (`Sentry-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 = (`Sentry-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":1740508267},{"Type":1,"NewValue":"{\"Id\":362,\"Name\":\"Access PS Sentry\",\"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    // Sentry protocol - please see variables and typical values in order below\\r\\n    // Sentry-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    // Sentry-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 N.\\r\\n    // Created: 01/01/2025\\r\\n    // Last modified: 14/02/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', 'Sentry');\\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 = (`Sentry-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 Sentry-')) {\\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 = (`Sentry-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 = (`Sentry;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 = (`Sentry;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 = (`Sentry-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    // 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 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\\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  ¿qué es fall OFF?\\r\\n                            if ((alarmCodeExtInt & 1) == 1) {\\r\\n                                var alarm = 'ALF-C'; // Fall-DownAlertending\\r\\n                            }\\r\\n                            // Welfare Check-out\\r\\n                            else if ((alarmCodeExtInt & 2) == 2) {\\r\\n                                var alarm = 'WSTP';\\r\\n                                if (configs.Welfare.Mode == '1') {\\r\\n                                    info = 'Recurrent';\\r\\n                                } else info = 'Amber';\\r\\n                            }\\r\\n                            //Geo 5 in\\r\\n                            //else if ((alarmCodeInt & 16) == 16) {\\r\\n                            //    var alarm = 'BATL';\\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 Alert\\r\\n                            else if ((alarmCodeInt & 8) == 8) {\\r\\n                                var alarm = 'Tilt';\\r\\n                            }\\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 Alert\\r\\n                            else if ((alarmCodeInt & 256) == 256) {\\r\\n                                var alarm = 'PWRF';\\r\\n                            }\\r\\n                            //Power On Alert\\r\\n                            else if ((alarmCodeInt & 512) == 512) {\\r\\n                                var alarm = 'PWRN';\\r\\n                            }\\r\\n                            //Motion Alert\\r\\n                            else if ((alarmCodeInt & 1024) == 1024) {\\r\\n                                var alarm = 'ALMOV';\\r\\n                            }\\r\\n                            //No Motion Alert\\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                            }\\r\\n                            // Side call button 1\\r\\n                            else if ((alarmCodeInt & 8192) == 8192) {\\r\\n                                var alarm = 'Side1';\\r\\n                            }\\r\\n                            // Side call button 2\\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                                AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                                configsToAck.push(configIds.ReadState.Charging);\\r\\n                                //configs.AlertSettings.Welfare.Mode\\r\\n                                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'false');\\r\\n                                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'true');\\r\\n                                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'false');\\r\\n                                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                                }\\r\\n                            }\\r\\n                            //Battery no charging\\r\\n                            else if ((alarmCodeInt & 65536) == 65536) {\\r\\n                                var alarm = 'BATCF';\\r\\n                                AddValue(configsToUpdate, configIds.ReadState.Charging, 'false');\\r\\n                                configsToAck.push(configIds.ReadState.Charging);\\r\\n                                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'true');\\r\\n                                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'false');\\r\\n                                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'true');\\r\\n                                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                                }\\r\\n                            }\\r\\n                            //Alert End\\r\\n                            else if ((alarmCodeInt & 131072) == 131072) {\\r\\n                                var alarm = 'ALA-F';\\r\\n                                if (configs.Welfare.Mode == '1') {\\r\\n                                    info = 'Recurrent';\\r\\n                                } else info = 'Amber';\\r\\n                            }\\r\\n                            //Amber Alert ON    Don`t know the dfference between ALA and ALA-O\\r\\n                            else if ((alarmCodeInt & 262144) == 262144) {\\r\\n                                var alarm = 'ALA';\\r\\n                            }\\r\\n                            // welfare check in\\r\\n                            else if ((alarmCodeInt & 524288) == 524288) {\\r\\n                                var alarm = 'WTS';\\r\\n                                if (configs.Welfare.Mode == '1') {\\r\\n                                    info = 'Recurrent';\\r\\n                                } else info = 'Amber';\\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\\r\\n                            else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n                                var alarm = 'ALA-W';\\r\\n                                if (configs.Welfare.Mode == '1') {\\r\\n                                    info = 'Recurrent';\\r\\n                                } else info = 'Amber';\\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 != '64') {\\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 != '64') {\\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 = (`Sentry-${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 = (`Sentry-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                            if ((statusInt & 16) == 16) {\\r\\n                                statusDevice += 'Charging,';\\r\\n                                // AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                                // configsToAck.push(configIds.ReadState.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 != '64') {\\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 = (`Sentry-${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 != '64') {\\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 = (`Sentry-${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 = (`Sentry-${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 = (`Sentry-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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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                            var report;\\r\\n                            switch (contactNumber) {\\r\\n                                // Emergency Number\\r\\n                                // [Value]:80 2B 33 34 36 33 35 36 30 37 39 33 30\\r\\n                                //{\\\"number\\\":{\\\"call\\\":0,\\\"noCard\\\":0,\\\"number\\\":\\\"+34635607930\\\",\\\"enable\\\":1,\\\"sms\\\":0,\\\"index\\\":0}}\\r\\n                                case '0':\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.length < 6) { //if no telephone defined\\r\\n                                        tel = '';\\r\\n                                    }\\r\\n                                    report = hex2bin(value.substring(0, 2)); // To find report mode Call &data or DAta only\\r\\n                                    AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                                    AddValue(codeValues, \\\"ReportMode\\\", report.substring(2, 3));\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.ReportMode, report.substring(2, 3));\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.ReportMode);\\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                                    if (tel.length < 6) { //if no telephone defined\\r\\n                                        tel = '';\\r\\n                                    }\\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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 '55': // Tilt Angle Alert\\r\\n                            //[Value]:0A 00 1E 00\\r\\n                            //{\\\"tiltAlert\\\":{\\\"angle\\\":30,\\\"time\\\":10,\\\"status\\\":0,\\\"dial\\\":0}}\\r\\n                            var angle = hexToDecimal(value.substring(4, 6));\\r\\n                            var timeout = hexToDecimal(value.substring(0, 2));\\r\\n                            var status = hexToDecimal(value.substring(6, 8));\\r\\n                            if (status == 0) angle = 0;\\r\\n                            //var alertSetting = angle;\\r\\n                            //imei = serverParams.Imei;\\r\\n                            //messageForReceiver = (`Sentry;ACK-TILTANG;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"tiltangle\\\", angle);\\r\\n                            AddValue(codeValues, \\\"tiltimeout\\\", timeout);\\r\\n                            AddValue(codeValues, \\\"tiltstatus\\\", status);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltTimeout, timeout);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltAngle, angle);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltTimeout);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltAngle);\\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 = (`Sentry;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.ManDownSettings, sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.EnableDisableManDownSettings, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.Sensitivity, sesibityOptionValue);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.EnableDisableManDownSettings);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.Sensitivity);\\r\\n                            break;\\r\\n                        case '57': // Welfare\\r\\n                            // [Value]:10 0E 00 80 58 02 00 80\\r\\n                            //{\\\"welfareAlert\\\":{\\\"time\\\":600,\\\"value\\\":3600,\\\"status\\\":1,\\\"dial\\\":1}}\\r\\n                            var welfareStatus = hex2bin(value.substring(6, 8)); // check status\\r\\n                            var welfareValue = hexToDecimal(changeEndianness(value.substring(0, 6)));\\r\\n                            var welfareTime = hexToDecimal(changeEndianness(value.substring(8, 14)));\\r\\n                            var enalbleDisable = '';\\r\\n                            if ((configs.ReadState.Charging == 'true') && (configs.Welfare.Mode == '1') && (configs.Welfare.EnableDisableWelfare == 'true')) { // Force Read to enable welfare when device is charging in recurrent mode\\r\\n                                var sensibility = 'Enable, '\\r\\n                                enalbleDisable = '1'\\r\\n                            } else {\\r\\n                                if (welfareStatus.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                            };\\r\\n                            //var imei = serverParams.Imei;\\r\\n                            //messageForReceiver = (`Sentry;ACK-WELFALERT;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            sensibility += ', ' + welfareValue / 60;\\r\\n                            sensibility += ', ' + welfareTime / 60;\\r\\n                            AddValue(codeValues, \\\"welfare\\\", sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.EnableDisableReadWelfare, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Prealarm, welfareTime / 60);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Timeout, welfareValue / 60);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.EnableDisableReadWelfare);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Prealarm);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Timeout);\\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 = (`Sentry;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 '75': // Extra Enable control   Welfare Mode\\r\\n                            //[Value]:80 00 00 10  last two digit for new/old welfare\\r\\n                            //{\\\"extraControl\\\":{\\\"bit29\\\":0,\\\"bit27\\\":0,\\\"bit28\\\":1,\\\"bit25\\\":0,\\\"bit26\\\":0,\\\"flagValue\\\":268435584,\\\"bit23\\\":0,\\\"bit24\\\":0,\\\"bit21\\\":0,\\\"bit22\\\":0,\\\"bit20\\\":0,\\\"bit9\\\":0,\\\"bit18\\\":0,\\\"bit19\\\":0,\\\"bit7\\\":1,\\\"bit16\\\":0,\\\"bit8\\\":0,\\\"bit17\\\":0,\\\"bit5\\\":0,\\\"bit14\\\":0,\\\"bit6\\\":0,\\\"bit15\\\":0,\\\"bit3\\\":0,\\\"bit4\\\":0,\\\"bit1\\\":0,\\\"bit2\\\":0,\\\"bit0\\\":0,\\\"bit12\\\":0,\\\"bit13\\\":0,\\\"bit10\\\":0,\\\"bit11\\\":0,\\\"bit30\\\":0,\\\"bit31\\\":0}}\\r\\n                            var extraStatus = hex2bin(value.substring(6, 7)).substring(7, 8);\\r\\n                            //if (extraStatus.substring(7, 8) == '1') {\\r\\n                            //    extra += ' Enable, '\\r\\n                            //} else {\\r\\n                            //    extra += ' 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, \\\"welfare Mode\\\", extraStatus);\\r\\n                            // messageForReceiver = (`Sentry;ACK-EXTRA;${imei};`);\\r\\n                            // sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Mode, extraStatus);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Mode);\\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 = (`Sentry;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 = (`Sentry;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 = (`Sentry-${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 = (`Sentry-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 = (`Sentry-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 = (`Sentry-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":1740508776},{"Type":1,"NewValue":"{\"Id\":362,\"Name\":\"Access PS Sentry\",\"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    // Sentry protocol - please see variables and typical values in order below\\r\\n    // Sentry-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    // Sentry-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 N.\\r\\n    // Created: 01/01/2025\\r\\n    // Last modified: 14/02/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', 'Sentry');\\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 = (`Sentry-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 Sentry-')) {\\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 = (`Sentry-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 = (`Sentry;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 = (`Sentry;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 = (`Sentry-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    // 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 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\\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  ¿qué es fall OFF?\\r\\n                            if ((alarmCodeExtInt & 1) == 1) {\\r\\n                                var alarm = 'ALF-C'; // Fall-DownAlertending\\r\\n                            }\\r\\n                            // Welfare Check-out\\r\\n                            else if ((alarmCodeExtInt & 2) == 2) {\\r\\n                                var alarm = 'WSTP';\\r\\n                                if (configs.Welfare.Mode == '1') {\\r\\n                                    info = 'Recurrent';\\r\\n                                } else info = 'Amber';\\r\\n                            }\\r\\n                            //Geo 5 in\\r\\n                            //else if ((alarmCodeInt & 16) == 16) {\\r\\n                            //    var alarm = 'BATL';\\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 Alert\\r\\n                            else if ((alarmCodeInt & 8) == 8) {\\r\\n                                var alarm = 'Tilt';\\r\\n                            }\\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 Alert\\r\\n                            else if ((alarmCodeInt & 256) == 256) {\\r\\n                                var alarm = 'PWRF';\\r\\n                            }\\r\\n                            //Power On Alert\\r\\n                            else if ((alarmCodeInt & 512) == 512) {\\r\\n                                var alarm = 'PWRN';\\r\\n                            }\\r\\n                            //Motion Alert\\r\\n                            else if ((alarmCodeInt & 1024) == 1024) {\\r\\n                                var alarm = 'ALMOV';\\r\\n                            }\\r\\n                            //No Motion Alert\\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                            }\\r\\n                            // Side call button 1\\r\\n                            else if ((alarmCodeInt & 8192) == 8192) {\\r\\n                                var alarm = 'Side1';\\r\\n                            }\\r\\n                            // Side call button 2\\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                                AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                                configsToAck.push(configIds.ReadState.Charging);\\r\\n                                //configs.AlertSettings.Welfare.Mode\\r\\n                                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'false');\\r\\n                                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'true');\\r\\n                                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'false');\\r\\n                                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                                }\\r\\n                            }\\r\\n                            //Battery no charging\\r\\n                            else if ((alarmCodeInt & 65536) == 65536) {\\r\\n                                var alarm = 'BATCF';\\r\\n                                AddValue(configsToUpdate, configIds.ReadState.Charging, 'false');\\r\\n                                configsToAck.push(configIds.ReadState.Charging);\\r\\n                                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'true');\\r\\n                                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'false');\\r\\n                                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'true');\\r\\n                                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                                }\\r\\n                            }\\r\\n                            //Alert End\\r\\n                            else if ((alarmCodeInt & 131072) == 131072) {\\r\\n                                var alarm = 'ALA-F';\\r\\n                                if (configs.Welfare.Mode == '1') {\\r\\n                                    info = 'Recurrent';\\r\\n                                } else info = 'Amber';\\r\\n                            }\\r\\n                            //Amber Alert ON    Don`t know the dfference between ALA and ALA-O\\r\\n                            else if ((alarmCodeInt & 262144) == 262144) {\\r\\n                                var alarm = 'ALA';\\r\\n                            }\\r\\n                            // welfare check in\\r\\n                            else if ((alarmCodeInt & 524288) == 524288) {\\r\\n                                var alarm = 'WTS';\\r\\n                                if (configs.Welfare.Mode == '1') {\\r\\n                                    info = 'Recurrent';\\r\\n                                } else info = 'Amber';\\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\\r\\n                            else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n                                var alarm = 'ALA-W';\\r\\n                                if (configs.Welfare.Mode == '1') {\\r\\n                                    info = 'Recurrent';\\r\\n                                } else info = 'Amber';\\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 != '64') {\\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 != '64') {\\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 = (`Sentry-${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 = (`Sentry-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                            if ((statusInt & 16) == 16) {\\r\\n                                statusDevice += 'Charging,';\\r\\n                                // AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                                // configsToAck.push(configIds.ReadState.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 != '64') {\\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 = (`Sentry-${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 != '64') {\\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 = (`Sentry-${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 = (`Sentry-${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 = (`Sentry-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                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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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                            var report;\\r\\n                            switch (contactNumber) {\\r\\n                                // Emergency Number\\r\\n                                // [Value]:80 2B 33 34 36 33 35 36 30 37 39 33 30\\r\\n                                //{\\\"number\\\":{\\\"call\\\":0,\\\"noCard\\\":0,\\\"number\\\":\\\"+34635607930\\\",\\\"enable\\\":1,\\\"sms\\\":0,\\\"index\\\":0}}\\r\\n                                case '0':\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.length < 6) { //if no telephone defined\\r\\n                                        tel = '';\\r\\n                                    }\\r\\n                                    report = hex2bin(value.substring(0, 2)); // To find report mode Call &data or DAta only\\r\\n                                    AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                                    AddValue(codeValues, \\\"ReportMode\\\", report.substring(2, 3));\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.ReportMode, report.substring(2, 3));\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.ReportMode);\\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                                    if (tel.length < 6) { //if no telephone defined\\r\\n                                        tel = '';\\r\\n                                    }\\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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 '55': // Tilt Angle Alert\\r\\n                            //[Value]:0A 00 1E 00\\r\\n                            //{\\\"tiltAlert\\\":{\\\"angle\\\":30,\\\"time\\\":10,\\\"status\\\":0,\\\"dial\\\":0}}\\r\\n                            var angle = hexToDecimal(value.substring(4, 6));\\r\\n                            var timeout = hexToDecimal(value.substring(0, 2));\\r\\n                            var status = hexToDecimal(value.substring(6, 8));\\r\\n                            if (status == 0) angle = 0;\\r\\n                            //var alertSetting = angle;\\r\\n                            //imei = serverParams.Imei;\\r\\n                            //messageForReceiver = (`Sentry;ACK-TILTANG;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"tiltangle\\\", angle);\\r\\n                            AddValue(codeValues, \\\"tiltimeout\\\", timeout);\\r\\n                            AddValue(codeValues, \\\"tiltstatus\\\", status);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltTimeout, timeout);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltAngle, angle);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltTimeout);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltAngle);\\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 = (`Sentry;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.ManDownSettings, sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.EnableDisableManDownSettings, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.Sensitivity, sesibityOptionValue);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.EnableDisableManDownSettings);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.Sensitivity);\\r\\n                            break;\\r\\n                        case '57': // Welfare\\r\\n                            // [Value]:10 0E 00 80 58 02 00 80\\r\\n                            //{\\\"welfareAlert\\\":{\\\"time\\\":600,\\\"value\\\":3600,\\\"status\\\":1,\\\"dial\\\":1}}\\r\\n                            var welfareStatus = hex2bin(value.substring(6, 8)); // check status\\r\\n                            var welfareValue = hexToDecimal(changeEndianness(value.substring(0, 6)));\\r\\n                            var welfareTime = hexToDecimal(changeEndianness(value.substring(8, 14)));\\r\\n                            var enalbleDisable = '';\\r\\n                            if ((configs.ReadState.Charging == 'true') && (configs.Welfare.Mode == '1') && (configs.Welfare.EnableDisableWelfare == 'true')) { // Force Read to enable welfare when device is charging in recurrent mode\\r\\n                                var sensibility = 'Enable, '\\r\\n                                enalbleDisable = '1'\\r\\n                            } else {\\r\\n                                if (welfareStatus.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                            };\\r\\n                            //var imei = serverParams.Imei;\\r\\n                            //messageForReceiver = (`Sentry;ACK-WELFALERT;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            sensibility += ', ' + welfareValue / 60;\\r\\n                            sensibility += ', ' + welfareTime / 60;\\r\\n                            AddValue(codeValues, \\\"welfare\\\", sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.EnableDisableReadWelfare, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Prealarm, welfareTime / 60);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Timeout, welfareValue / 60);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.EnableDisableReadWelfare);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Prealarm);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Timeout);\\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 = (`Sentry;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 '75': // Extra Enable control   Welfare Mode\\r\\n                            //[Value]:80 00 00 10  last two digit for new/old welfare\\r\\n                            //{\\\"extraControl\\\":{\\\"bit29\\\":0,\\\"bit27\\\":0,\\\"bit28\\\":1,\\\"bit25\\\":0,\\\"bit26\\\":0,\\\"flagValue\\\":268435584,\\\"bit23\\\":0,\\\"bit24\\\":0,\\\"bit21\\\":0,\\\"bit22\\\":0,\\\"bit20\\\":0,\\\"bit9\\\":0,\\\"bit18\\\":0,\\\"bit19\\\":0,\\\"bit7\\\":1,\\\"bit16\\\":0,\\\"bit8\\\":0,\\\"bit17\\\":0,\\\"bit5\\\":0,\\\"bit14\\\":0,\\\"bit6\\\":0,\\\"bit15\\\":0,\\\"bit3\\\":0,\\\"bit4\\\":0,\\\"bit1\\\":0,\\\"bit2\\\":0,\\\"bit0\\\":0,\\\"bit12\\\":0,\\\"bit13\\\":0,\\\"bit10\\\":0,\\\"bit11\\\":0,\\\"bit30\\\":0,\\\"bit31\\\":0}}\\r\\n                            var extraStatus = hex2bin(value.substring(6, 7)).substring(7, 8);\\r\\n                            //if (extraStatus.substring(7, 8) == '1') {\\r\\n                            //    extra += ' Enable, '\\r\\n                            //} else {\\r\\n                            //    extra += ' 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, \\\"welfare Mode\\\", extraStatus);\\r\\n                            // messageForReceiver = (`Sentry;ACK-EXTRA;${imei};`);\\r\\n                            // sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Mode, extraStatus);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Mode);\\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 = (`Sentry;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 = (`Sentry;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 = (`Sentry-${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 = (`Sentry-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 = (`Sentry-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 = (`Sentry-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":1740509697},{"Type":1,"NewValue":"{\"Id\":362,\"Name\":\"Access PS Sentry\",\"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    // Sentry protocol - please see variables and typical values in order below\\r\\n    // Sentry-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    // Sentry-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 N.\\r\\n    // Created: 01/01/2025\\r\\n    // Last modified: 14/02/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', 'Sentry');\\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 = (`Sentry-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 Sentry-')) {\\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 = (`Sentry-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 = (`Sentry;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 = (`Sentry;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 = (`Sentry-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    // 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 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\\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  ¿qué es fall OFF?\\r\\n                            if ((alarmCodeExtInt & 1) == 1) {\\r\\n                                var alarm = 'ALF-C'; // Fall-DownAlertending\\r\\n                            }\\r\\n                            // Welfare Check-out\\r\\n                            else if ((alarmCodeExtInt & 2) == 2) {\\r\\n                                var alarm = 'WSTP';\\r\\n                                if (configs.Welfare.Mode == '1') {\\r\\n                                    info = 'Recurrent';\\r\\n                                } else info = 'Amber';\\r\\n                            }\\r\\n                            //Geo 5 in\\r\\n                            //else if ((alarmCodeInt & 16) == 16) {\\r\\n                            //    var alarm = 'BATL';\\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 Alert\\r\\n                            else if ((alarmCodeInt & 8) == 8) {\\r\\n                                var alarm = 'Tilt';\\r\\n                            }\\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 Alert\\r\\n                            else if ((alarmCodeInt & 256) == 256) {\\r\\n                                var alarm = 'PWRF';\\r\\n                            }\\r\\n                            //Power On Alert\\r\\n                            else if ((alarmCodeInt & 512) == 512) {\\r\\n                                var alarm = 'PWRN';\\r\\n                            }\\r\\n                            //Motion Alert\\r\\n                            else if ((alarmCodeInt & 1024) == 1024) {\\r\\n                                var alarm = 'ALMOV';\\r\\n                            }\\r\\n                            //No Motion Alert\\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                            }\\r\\n                            // Side call button 1\\r\\n                            else if ((alarmCodeInt & 8192) == 8192) {\\r\\n                                var alarm = 'Side1';\\r\\n                            }\\r\\n                            // Side call button 2\\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                                AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                                configsToAck.push(configIds.ReadState.Charging);\\r\\n                                //configs.AlertSettings.Welfare.Mode\\r\\n                                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'false');\\r\\n                                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'true');\\r\\n                                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'false');\\r\\n                                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                                }\\r\\n                            }\\r\\n                            //Battery no charging\\r\\n                            else if ((alarmCodeInt & 65536) == 65536) {\\r\\n                                var alarm = 'BATCF';\\r\\n                                AddValue(configsToUpdate, configIds.ReadState.Charging, 'false');\\r\\n                                configsToAck.push(configIds.ReadState.Charging);\\r\\n                                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'true');\\r\\n                                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'false');\\r\\n                                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'true');\\r\\n                                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                                }\\r\\n                            }\\r\\n                            //Alert End\\r\\n                            else if ((alarmCodeInt & 131072) == 131072) {\\r\\n                                var alarm = 'ALA-F';\\r\\n                                if (configs.Welfare.Mode == '1') {\\r\\n                                    info = 'Recurrent';\\r\\n                                } else info = 'Amber';\\r\\n                            }\\r\\n                            //Amber Alert ON    Don`t know the dfference between ALA and ALA-O\\r\\n                            else if ((alarmCodeInt & 262144) == 262144) {\\r\\n                                var alarm = 'ALA';\\r\\n                            }\\r\\n                            // welfare check in\\r\\n                            else if ((alarmCodeInt & 524288) == 524288) {\\r\\n                                var alarm = 'WTS';\\r\\n                                if (configs.Welfare.Mode == '1') {\\r\\n                                    info = 'Recurrent';\\r\\n                                } else info = 'Amber';\\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\\r\\n                            else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n                                var alarm = 'ALA-W';\\r\\n                                if (configs.Welfare.Mode == '1') {\\r\\n                                    info = 'Recurrent';\\r\\n                                } else info = 'Amber';\\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 != '64') {\\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 != '64') {\\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 = (`Sentry-${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 = (`Sentry-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                            if ((statusInt & 16) == 16) {\\r\\n                                statusDevice += 'Charging,';\\r\\n                                // AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                                // configsToAck.push(configIds.ReadState.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 != '64') {\\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 = (`Sentry-${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 != '64') {\\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 = (`Sentry-${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 = (`Sentry-${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 = (`Sentry-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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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                            var report;\\r\\n                            switch (contactNumber) {\\r\\n                                // Emergency Number\\r\\n                                // [Value]:80 2B 33 34 36 33 35 36 30 37 39 33 30\\r\\n                                //{\\\"number\\\":{\\\"call\\\":0,\\\"noCard\\\":0,\\\"number\\\":\\\"+34635607930\\\",\\\"enable\\\":1,\\\"sms\\\":0,\\\"index\\\":0}}\\r\\n                                case '0':\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.length < 6) { //if no telephone defined\\r\\n                                        tel = '';\\r\\n                                    }\\r\\n                                    report = hex2bin(value.substring(0, 2)); // To find report mode Call &data or DAta only\\r\\n                                    AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                                    AddValue(codeValues, \\\"ReportMode\\\", report.substring(2, 3));\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.ReportMode, report.substring(2, 3));\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.ReportMode);\\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                                    if (tel.length < 6) { //if no telephone defined\\r\\n                                        tel = '';\\r\\n                                    }\\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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 '55': // Tilt Angle Alert\\r\\n                            //[Value]:0A 00 1E 00\\r\\n                            //{\\\"tiltAlert\\\":{\\\"angle\\\":30,\\\"time\\\":10,\\\"status\\\":0,\\\"dial\\\":0}}\\r\\n                            var angle = hexToDecimal(value.substring(4, 6));\\r\\n                            var timeout = hexToDecimal(value.substring(0, 2));\\r\\n                            var status = hexToDecimal(value.substring(6, 8));\\r\\n                            if (status == 0) angle = 0;\\r\\n                            //var alertSetting = angle;\\r\\n                            //imei = serverParams.Imei;\\r\\n                            //messageForReceiver = (`Sentry;ACK-TILTANG;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"tiltangle\\\", angle);\\r\\n                            AddValue(codeValues, \\\"tiltimeout\\\", timeout);\\r\\n                            AddValue(codeValues, \\\"tiltstatus\\\", status);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltTimeout, timeout);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltAngle, angle);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltTimeout);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltAngle);\\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 = (`Sentry;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.ManDownSettings, sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.EnableDisableManDownSettings, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.Sensitivity, sesibityOptionValue);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.EnableDisableManDownSettings);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.Sensitivity);\\r\\n                            break;\\r\\n                        case '57': // Welfare\\r\\n                            // [Value]:10 0E 00 80 58 02 00 80\\r\\n                            //{\\\"welfareAlert\\\":{\\\"time\\\":600,\\\"value\\\":3600,\\\"status\\\":1,\\\"dial\\\":1}}\\r\\n                            var welfareStatus = hex2bin(value.substring(6, 8)); // check status\\r\\n                            var welfareValue = hexToDecimal(changeEndianness(value.substring(0, 6)));\\r\\n                            var welfareTime = hexToDecimal(changeEndianness(value.substring(8, 14)));\\r\\n                            var enalbleDisable = '';\\r\\n                            if ((configs.ReadState.Charging == 'true') && (configs.Welfare.Mode == '1') && (configs.Welfare.EnableDisableWelfare == 'true')) { // Force Read to enable welfare when device is charging in recurrent mode\\r\\n                                var sensibility = 'Enable, '\\r\\n                                enalbleDisable = '1'\\r\\n                            } else {\\r\\n                                if (welfareStatus.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                            };\\r\\n                            //var imei = serverParams.Imei;\\r\\n                            //messageForReceiver = (`Sentry;ACK-WELFALERT;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            sensibility += ', ' + welfareValue / 60;\\r\\n                            sensibility += ', ' + welfareTime / 60;\\r\\n                            AddValue(codeValues, \\\"welfare\\\", sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.EnableDisableReadWelfare, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Prealarm, welfareTime / 60);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Timeout, welfareValue / 60);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.EnableDisableReadWelfare);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Prealarm);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Timeout);\\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 = (`Sentry;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 '75': // Extra Enable control   Welfare Mode\\r\\n                            //[Value]:80 00 00 10  last two digit for new/old welfare\\r\\n                            //{\\\"extraControl\\\":{\\\"bit29\\\":0,\\\"bit27\\\":0,\\\"bit28\\\":1,\\\"bit25\\\":0,\\\"bit26\\\":0,\\\"flagValue\\\":268435584,\\\"bit23\\\":0,\\\"bit24\\\":0,\\\"bit21\\\":0,\\\"bit22\\\":0,\\\"bit20\\\":0,\\\"bit9\\\":0,\\\"bit18\\\":0,\\\"bit19\\\":0,\\\"bit7\\\":1,\\\"bit16\\\":0,\\\"bit8\\\":0,\\\"bit17\\\":0,\\\"bit5\\\":0,\\\"bit14\\\":0,\\\"bit6\\\":0,\\\"bit15\\\":0,\\\"bit3\\\":0,\\\"bit4\\\":0,\\\"bit1\\\":0,\\\"bit2\\\":0,\\\"bit0\\\":0,\\\"bit12\\\":0,\\\"bit13\\\":0,\\\"bit10\\\":0,\\\"bit11\\\":0,\\\"bit30\\\":0,\\\"bit31\\\":0}}\\r\\n                            var extraStatus = hex2bin(value.substring(6, 7)).substring(7, 8);\\r\\n                            //if (extraStatus.substring(7, 8) == '1') {\\r\\n                            //    extra += ' Enable, '\\r\\n                            //} else {\\r\\n                            //    extra += ' 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, \\\"welfare Mode\\\", extraStatus);\\r\\n                            // messageForReceiver = (`Sentry;ACK-EXTRA;${imei};`);\\r\\n                            // sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Mode, extraStatus);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Mode);\\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 = (`Sentry;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 = (`Sentry;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 = (`Sentry-${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 = (`Sentry-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 = (`Sentry-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 = (`Sentry-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":1740509941},{"Type":1,"NewValue":"{\"Id\":362,\"Name\":\"Access PS Sentry\",\"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    // Sentry protocol - please see variables and typical values in order below\\r\\n    // Sentry-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    // Sentry-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 N.\\r\\n    // Created: 01/01/2025\\r\\n    // Last modified: 14/02/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', 'Sentry');\\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 = (`Sentry-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 Sentry-')) {\\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 = (`Sentry-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 = (`Sentry;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 = (`Sentry;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 = (`Sentry-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    // 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 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\\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  ¿qué es fall OFF?\\r\\n                            if ((alarmCodeExtInt & 1) == 1) {\\r\\n                                var alarm = 'ALF-C'; // Fall-DownAlertending\\r\\n                            }\\r\\n                            // Welfare Check-out\\r\\n                            else if ((alarmCodeExtInt & 2) == 2) {\\r\\n                                var alarm = 'WSTP';\\r\\n                                if (configs.Welfare.Mode == '1') {\\r\\n                                    info = 'Recurrent';\\r\\n                                } else info = 'Amber';\\r\\n                            }\\r\\n                            //Geo 5 in\\r\\n                            //else if ((alarmCodeInt & 16) == 16) {\\r\\n                            //    var alarm = 'BATL';\\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 Alert\\r\\n                            else if ((alarmCodeInt & 8) == 8) {\\r\\n                                var alarm = 'TLT';\\r\\n                            }\\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 Alert\\r\\n                            else if ((alarmCodeInt & 256) == 256) {\\r\\n                                var alarm = 'PWRF';\\r\\n                            }\\r\\n                            //Power On Alert\\r\\n                            else if ((alarmCodeInt & 512) == 512) {\\r\\n                                var alarm = 'PWRN';\\r\\n                            }\\r\\n                            //Motion Alert\\r\\n                            else if ((alarmCodeInt & 1024) == 1024) {\\r\\n                                var alarm = 'ALMOV';\\r\\n                            }\\r\\n                            //No Motion Alert\\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                            }\\r\\n                            // Side call button 1\\r\\n                            else if ((alarmCodeInt & 8192) == 8192) {\\r\\n                                var alarm = 'Side1';\\r\\n                            }\\r\\n                            // Side call button 2\\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                                AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                                configsToAck.push(configIds.ReadState.Charging);\\r\\n                                //configs.AlertSettings.Welfare.Mode\\r\\n                                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'false');\\r\\n                                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'true');\\r\\n                                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'false');\\r\\n                                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                                }\\r\\n                            }\\r\\n                            //Battery no charging\\r\\n                            else if ((alarmCodeInt & 65536) == 65536) {\\r\\n                                var alarm = 'BATCF';\\r\\n                                AddValue(configsToUpdate, configIds.ReadState.Charging, 'false');\\r\\n                                configsToAck.push(configIds.ReadState.Charging);\\r\\n                                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'true');\\r\\n                                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'false');\\r\\n                                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'true');\\r\\n                                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                                }\\r\\n                            }\\r\\n                            //Alert End\\r\\n                            else if ((alarmCodeInt & 131072) == 131072) {\\r\\n                                var alarm = 'ALA-F';\\r\\n                                if (configs.Welfare.Mode == '1') {\\r\\n                                    info = 'Recurrent';\\r\\n                                } else info = 'Amber';\\r\\n                            }\\r\\n                            //Amber Alert ON    Don`t know the dfference between ALA and ALA-O\\r\\n                            else if ((alarmCodeInt & 262144) == 262144) {\\r\\n                                var alarm = 'ALA';\\r\\n                            }\\r\\n                            // welfare check in\\r\\n                            else if ((alarmCodeInt & 524288) == 524288) {\\r\\n                                var alarm = 'WTS';\\r\\n                                if (configs.Welfare.Mode == '1') {\\r\\n                                    info = 'Recurrent';\\r\\n                                } else info = 'Amber';\\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\\r\\n                            else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n                                var alarm = 'ALA-W';\\r\\n                                if (configs.Welfare.Mode == '1') {\\r\\n                                    info = 'Recurrent';\\r\\n                                } else info = 'Amber';\\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 != '64') {\\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 != '64') {\\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 = (`Sentry-${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 = (`Sentry-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                            if ((statusInt & 16) == 16) {\\r\\n                                statusDevice += 'Charging,';\\r\\n                                // AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                                // configsToAck.push(configIds.ReadState.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 != '64') {\\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 = (`Sentry-${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 != '64') {\\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 = (`Sentry-${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 = (`Sentry-${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 = (`Sentry-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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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                            var report;\\r\\n                            switch (contactNumber) {\\r\\n                                // Emergency Number\\r\\n                                // [Value]:80 2B 33 34 36 33 35 36 30 37 39 33 30\\r\\n                                //{\\\"number\\\":{\\\"call\\\":0,\\\"noCard\\\":0,\\\"number\\\":\\\"+34635607930\\\",\\\"enable\\\":1,\\\"sms\\\":0,\\\"index\\\":0}}\\r\\n                                case '0':\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.length < 6) { //if no telephone defined\\r\\n                                        tel = '';\\r\\n                                    }\\r\\n                                    report = hex2bin(value.substring(0, 2)); // To find report mode Call &data or DAta only\\r\\n                                    AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                                    AddValue(codeValues, \\\"ReportMode\\\", report.substring(2, 3));\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.ReportMode, report.substring(2, 3));\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.ReportMode);\\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                                    if (tel.length < 6) { //if no telephone defined\\r\\n                                        tel = '';\\r\\n                                    }\\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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 '55': // Tilt Angle Alert\\r\\n                            //[Value]:0A 00 1E 00\\r\\n                            //{\\\"tiltAlert\\\":{\\\"angle\\\":30,\\\"time\\\":10,\\\"status\\\":0,\\\"dial\\\":0}}\\r\\n                            var angle = hexToDecimal(value.substring(4, 6));\\r\\n                            var timeout = hexToDecimal(value.substring(0, 2));\\r\\n                            var status = hexToDecimal(value.substring(6, 8));\\r\\n                            if (status == 0) angle = 0;\\r\\n                            //var alertSetting = angle;\\r\\n                            //imei = serverParams.Imei;\\r\\n                            //messageForReceiver = (`Sentry;ACK-TILTANG;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"tiltangle\\\", angle);\\r\\n                            AddValue(codeValues, \\\"tiltimeout\\\", timeout);\\r\\n                            AddValue(codeValues, \\\"tiltstatus\\\", status);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltTimeout, timeout);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltAngle, angle);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltTimeout);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltAngle);\\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 = (`Sentry;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.ManDownSettings, sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.EnableDisableManDownSettings, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.Sensitivity, sesibityOptionValue);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.EnableDisableManDownSettings);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.Sensitivity);\\r\\n                            break;\\r\\n                        case '57': // Welfare\\r\\n                            // [Value]:10 0E 00 80 58 02 00 80\\r\\n                            //{\\\"welfareAlert\\\":{\\\"time\\\":600,\\\"value\\\":3600,\\\"status\\\":1,\\\"dial\\\":1}}\\r\\n                            var welfareStatus = hex2bin(value.substring(6, 8)); // check status\\r\\n                            var welfareValue = hexToDecimal(changeEndianness(value.substring(0, 6)));\\r\\n                            var welfareTime = hexToDecimal(changeEndianness(value.substring(8, 14)));\\r\\n                            var enalbleDisable = '';\\r\\n                            if ((configs.ReadState.Charging == 'true') && (configs.Welfare.Mode == '1') && (configs.Welfare.EnableDisableWelfare == 'true')) { // Force Read to enable welfare when device is charging in recurrent mode\\r\\n                                var sensibility = 'Enable, '\\r\\n                                enalbleDisable = '1'\\r\\n                            } else {\\r\\n                                if (welfareStatus.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                            };\\r\\n                            //var imei = serverParams.Imei;\\r\\n                            //messageForReceiver = (`Sentry;ACK-WELFALERT;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            sensibility += ', ' + welfareValue / 60;\\r\\n                            sensibility += ', ' + welfareTime / 60;\\r\\n                            AddValue(codeValues, \\\"welfare\\\", sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.EnableDisableReadWelfare, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Prealarm, welfareTime / 60);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Timeout, welfareValue / 60);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.EnableDisableReadWelfare);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Prealarm);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Timeout);\\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 = (`Sentry;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 '75': // Extra Enable control   Welfare Mode\\r\\n                            //[Value]:80 00 00 10  last two digit for new/old welfare\\r\\n                            //{\\\"extraControl\\\":{\\\"bit29\\\":0,\\\"bit27\\\":0,\\\"bit28\\\":1,\\\"bit25\\\":0,\\\"bit26\\\":0,\\\"flagValue\\\":268435584,\\\"bit23\\\":0,\\\"bit24\\\":0,\\\"bit21\\\":0,\\\"bit22\\\":0,\\\"bit20\\\":0,\\\"bit9\\\":0,\\\"bit18\\\":0,\\\"bit19\\\":0,\\\"bit7\\\":1,\\\"bit16\\\":0,\\\"bit8\\\":0,\\\"bit17\\\":0,\\\"bit5\\\":0,\\\"bit14\\\":0,\\\"bit6\\\":0,\\\"bit15\\\":0,\\\"bit3\\\":0,\\\"bit4\\\":0,\\\"bit1\\\":0,\\\"bit2\\\":0,\\\"bit0\\\":0,\\\"bit12\\\":0,\\\"bit13\\\":0,\\\"bit10\\\":0,\\\"bit11\\\":0,\\\"bit30\\\":0,\\\"bit31\\\":0}}\\r\\n                            var extraStatus = hex2bin(value.substring(6, 7)).substring(7, 8);\\r\\n                            //if (extraStatus.substring(7, 8) == '1') {\\r\\n                            //    extra += ' Enable, '\\r\\n                            //} else {\\r\\n                            //    extra += ' 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, \\\"welfare Mode\\\", extraStatus);\\r\\n                            // messageForReceiver = (`Sentry;ACK-EXTRA;${imei};`);\\r\\n                            // sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Mode, extraStatus);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Mode);\\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 = (`Sentry;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 = (`Sentry;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 = (`Sentry-${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 = (`Sentry-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 = (`Sentry-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 = (`Sentry-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":1741952620},{"Type":1,"NewValue":"{\"Id\":362,\"Name\":\"Access PS Sentry\",\"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    // Sentry protocol - please see variables and typical values in order below\\r\\n    // Sentry-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    // Sentry-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 N.\\r\\n    // Created: 01/01/2025\\r\\n    // Last modified: 07/04/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', 'Sentry');\\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 = (`Sentry-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 'BATCN': // Battery Charging - On\\r\\n                AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                configsToAck.push(configIds.ReadState.Charging);\\r\\n                //configs.AlertSettings.Welfare.Mode\\r\\n                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'false');\\r\\n                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'true');\\r\\n                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'false');\\r\\n                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                }\\r\\n                break;\\r\\n            case 'BATCF': // Battery Charging - Off\\r\\n                AddValue(configsToUpdate, configIds.ReadState.Charging, 'false');\\r\\n                configsToAck.push(configIds.ReadState.Charging);\\r\\n                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'true');\\r\\n                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'false');\\r\\n                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'true');\\r\\n                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                }\\r\\n                break;\\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 Sentry-')) {\\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 = (`Sentry-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 = (`Sentry;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 = (`Sentry;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 = (`Sentry-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    // 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 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\\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  ¿qué es fall OFF?\\r\\n                            if ((alarmCodeExtInt & 1) == 1) {\\r\\n                                var alarm = 'ALF-C'; // Fall-DownAlertending\\r\\n                            }\\r\\n                            // Welfare Check-out\\r\\n                            else if ((alarmCodeExtInt & 2) == 2) {\\r\\n                                var alarm = 'WSTP';\\r\\n                                if (configs.Welfare.Mode == '1') {\\r\\n                                    info = 'Recurrent';\\r\\n                                } else info = 'Amber';\\r\\n                            }\\r\\n                            //Geo 5 in\\r\\n                            //else if ((alarmCodeInt & 16) == 16) {\\r\\n                            //    var alarm = 'BATL';\\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 Alert\\r\\n                            else if ((alarmCodeInt & 8) == 8) {\\r\\n                                var alarm = 'TLT';\\r\\n                            }\\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 Alert\\r\\n                            else if ((alarmCodeInt & 256) == 256) {\\r\\n                                var alarm = 'PWRF';\\r\\n                            }\\r\\n                            //Power On Alert\\r\\n                            else if ((alarmCodeInt & 512) == 512) {\\r\\n                                var alarm = 'PWRN';\\r\\n                            }\\r\\n                            //Motion Alert\\r\\n                            else if ((alarmCodeInt & 1024) == 1024) {\\r\\n                                var alarm = 'ALMOV';\\r\\n                            }\\r\\n                            //No Motion Alert\\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                            }\\r\\n                            // Side call button 1\\r\\n                            else if ((alarmCodeInt & 8192) == 8192) {\\r\\n                                var alarm = 'Side1';\\r\\n                            }\\r\\n                            // Side call button 2\\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                                /*AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                                configsToAck.push(configIds.ReadState.Charging);\\r\\n                                //configs.AlertSettings.Welfare.Mode\\r\\n                                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'false');\\r\\n                                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'true');\\r\\n                                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'false');\\r\\n                                    configsToAck.push(configIds.ReadState.Welfare);  \\r\\n                                }*/\\r\\n                            }\\r\\n                            //Battery no charging\\r\\n                            else if ((alarmCodeInt & 65536) == 65536) {\\r\\n                                var alarm = 'BATCF';\\r\\n                                /* AddValue(configsToUpdate, configIds.ReadState.Charging, 'false');\\r\\n                                 configsToAck.push(configIds.ReadState.Charging);\\r\\n                                 if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                                     AddValue(configsToUpdate, configIds.ReadState.Welfare, 'true');\\r\\n                                     //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'false');\\r\\n                                     AddConfig(configsToSend, configIds.ReadState.Welfare, 'true');\\r\\n                                     configsToAck.push(configIds.ReadState.Welfare);  \\r\\n                                 }*/\\r\\n                            }\\r\\n                            //Alert End\\r\\n                            else if ((alarmCodeInt & 131072) == 131072) {\\r\\n                                var alarm = 'ALA-F';\\r\\n                                if (configs.Welfare.Mode == '1') {\\r\\n                                    info = 'Recurrent';\\r\\n                                } else info = 'Amber';\\r\\n                            }\\r\\n                            //Amber Alert ON    Don`t know the dfference between ALA and ALA-O\\r\\n                            else if ((alarmCodeInt & 262144) == 262144) {\\r\\n                                var alarm = 'ALA';\\r\\n                            }\\r\\n                            // welfare check in\\r\\n                            else if ((alarmCodeInt & 524288) == 524288) {\\r\\n                                var alarm = 'WTS';\\r\\n                                if (configs.Welfare.Mode == '1') {\\r\\n                                    info = 'Recurrent';\\r\\n                                } else info = 'Amber';\\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\\r\\n                            else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n                                var alarm = 'ALA-W';\\r\\n                                if (configs.Welfare.Mode == '1') {\\r\\n                                    info = 'Recurrent';\\r\\n                                } else info = 'Amber';\\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 != '64') {\\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 != '64') {\\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 = (`Sentry-${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 = (`Sentry-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                            if ((statusInt & 16) == 16) {\\r\\n                                statusDevice += 'Charging,';\\r\\n                                // AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                                // configsToAck.push(configIds.ReadState.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 != '64') {\\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 = (`Sentry-${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 != '64') {\\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 = (`Sentry-${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 = (`Sentry-${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 = (`Sentry-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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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                            var report;\\r\\n                            switch (contactNumber) {\\r\\n                                // Emergency Number\\r\\n                                // [Value]:80 2B 33 34 36 33 35 36 30 37 39 33 30\\r\\n                                //{\\\"number\\\":{\\\"call\\\":0,\\\"noCard\\\":0,\\\"number\\\":\\\"+34635607930\\\",\\\"enable\\\":1,\\\"sms\\\":0,\\\"index\\\":0}}\\r\\n                                case '0':\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.length < 6) { //if no telephone defined\\r\\n                                        tel = '';\\r\\n                                    }\\r\\n                                    report = hex2bin(value.substring(0, 2)); // To find report mode Call &data or DAta only\\r\\n                                    AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                                    AddValue(codeValues, \\\"ReportMode\\\", report.substring(2, 3));\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.ReportMode, report.substring(2, 3));\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.ReportMode);\\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                                    if (tel.length < 6) { //if no telephone defined\\r\\n                                        tel = '';\\r\\n                                    }\\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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 '55': // Tilt Angle Alert\\r\\n                            //[Value]:0A 00 1E 00\\r\\n                            //{\\\"tiltAlert\\\":{\\\"angle\\\":30,\\\"time\\\":10,\\\"status\\\":0,\\\"dial\\\":0}}\\r\\n                            var angle = hexToDecimal(value.substring(4, 6));\\r\\n                            var timeout = hexToDecimal(value.substring(0, 2));\\r\\n                            var status = hexToDecimal(value.substring(6, 8));\\r\\n                            if (status == 0) angle = 0;\\r\\n                            //var alertSetting = angle;\\r\\n                            //imei = serverParams.Imei;\\r\\n                            //messageForReceiver = (`Sentry;ACK-TILTANG;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"tiltangle\\\", angle);\\r\\n                            AddValue(codeValues, \\\"tiltimeout\\\", timeout);\\r\\n                            AddValue(codeValues, \\\"tiltstatus\\\", status);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltTimeout, timeout);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltAngle, angle);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltTimeout);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltAngle);\\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 = (`Sentry;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.ManDownSettings, sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.EnableDisableManDownSettings, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.Sensitivity, sesibityOptionValue);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.EnableDisableManDownSettings);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.Sensitivity);\\r\\n                            break;\\r\\n                        case '57': // Welfare\\r\\n                            // [Value]:10 0E 00 80 58 02 00 80\\r\\n                            //{\\\"welfareAlert\\\":{\\\"time\\\":600,\\\"value\\\":3600,\\\"status\\\":1,\\\"dial\\\":1}}\\r\\n                            var welfareStatus = hex2bin(value.substring(6, 8)); // check status\\r\\n                            var welfareValue = hexToDecimal(changeEndianness(value.substring(0, 6)));\\r\\n                            var welfareTime = hexToDecimal(changeEndianness(value.substring(8, 14)));\\r\\n                            var enalbleDisable = '';\\r\\n                            if ((configs.ReadState.Charging == 'true') && (configs.Welfare.Mode == '1') && (configs.Welfare.EnableDisableWelfare == 'true')) { // Force Read to enable welfare when device is charging in recurrent mode\\r\\n                                var sensibility = 'Enable, '\\r\\n                                enalbleDisable = '1'\\r\\n                            } else {\\r\\n                                if (welfareStatus.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                            };\\r\\n                            //var imei = serverParams.Imei;\\r\\n                            //messageForReceiver = (`Sentry;ACK-WELFALERT;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            sensibility += ', ' + welfareValue / 60;\\r\\n                            sensibility += ', ' + welfareTime / 60;\\r\\n                            AddValue(codeValues, \\\"welfare\\\", sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.EnableDisableReadWelfare, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Prealarm, welfareTime / 60);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Timeout, welfareValue / 60);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.EnableDisableReadWelfare);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Prealarm);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Timeout);\\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 = (`Sentry;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 '75': // Extra Enable control   Welfare Mode\\r\\n                            //[Value]:80 00 00 10  last two digit for new/old welfare\\r\\n                            //{\\\"extraControl\\\":{\\\"bit29\\\":0,\\\"bit27\\\":0,\\\"bit28\\\":1,\\\"bit25\\\":0,\\\"bit26\\\":0,\\\"flagValue\\\":268435584,\\\"bit23\\\":0,\\\"bit24\\\":0,\\\"bit21\\\":0,\\\"bit22\\\":0,\\\"bit20\\\":0,\\\"bit9\\\":0,\\\"bit18\\\":0,\\\"bit19\\\":0,\\\"bit7\\\":1,\\\"bit16\\\":0,\\\"bit8\\\":0,\\\"bit17\\\":0,\\\"bit5\\\":0,\\\"bit14\\\":0,\\\"bit6\\\":0,\\\"bit15\\\":0,\\\"bit3\\\":0,\\\"bit4\\\":0,\\\"bit1\\\":0,\\\"bit2\\\":0,\\\"bit0\\\":0,\\\"bit12\\\":0,\\\"bit13\\\":0,\\\"bit10\\\":0,\\\"bit11\\\":0,\\\"bit30\\\":0,\\\"bit31\\\":0}}\\r\\n                            var extraStatus = hex2bin(value.substring(6, 7)).substring(7, 8);\\r\\n                            //if (extraStatus.substring(7, 8) == '1') {\\r\\n                            //    extra += ' Enable, '\\r\\n                            //} else {\\r\\n                            //    extra += ' 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, \\\"welfare Mode\\\", extraStatus);\\r\\n                            // messageForReceiver = (`Sentry;ACK-EXTRA;${imei};`);\\r\\n                            // sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Mode, extraStatus);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Mode);\\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 = (`Sentry;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 = (`Sentry;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 = (`Sentry-${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 = (`Sentry-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 = (`Sentry-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 = (`Sentry-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 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    // 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":1744052035},{"Type":1,"NewValue":"{\"Id\":362,\"Name\":\"Access PS Sentry\",\"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    // Sentry protocol - please see variables and typical values in order below\\r\\n    // Sentry-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    // Sentry-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 N.\\r\\n    // Created: 01/01/2025\\r\\n    // Last modified: 14/02/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', 'Sentry');\\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 = (`Sentry-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 Sentry-')) {\\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 = (`Sentry-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 = (`Sentry;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 = (`Sentry;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 = (`Sentry-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    // 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 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\\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  ¿qué es fall OFF?\\r\\n                            if ((alarmCodeExtInt & 1) == 1) {\\r\\n                                var alarm = 'ALF-C'; // Fall-DownAlertending\\r\\n                            }\\r\\n                            // Welfare Check-out\\r\\n                            else if ((alarmCodeExtInt & 2) == 2) {\\r\\n                                var alarm = 'WSTP';\\r\\n                                if (configs.Welfare.Mode == '1') {\\r\\n                                    info = 'Recurrent';\\r\\n                                } else info = 'Amber';\\r\\n                            }\\r\\n                            //Geo 5 in\\r\\n                            //else if ((alarmCodeInt & 16) == 16) {\\r\\n                            //    var alarm = 'BATL';\\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 Alert\\r\\n                            else if ((alarmCodeInt & 8) == 8) {\\r\\n                                var alarm = 'TLT';\\r\\n                            }\\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 Alert\\r\\n                            else if ((alarmCodeInt & 256) == 256) {\\r\\n                                var alarm = 'PWRF';\\r\\n                            }\\r\\n                            //Power On Alert\\r\\n                            else if ((alarmCodeInt & 512) == 512) {\\r\\n                                var alarm = 'PWRN';\\r\\n                            }\\r\\n                            //Motion Alert\\r\\n                            else if ((alarmCodeInt & 1024) == 1024) {\\r\\n                                var alarm = 'ALMOV';\\r\\n                            }\\r\\n                            //No Motion Alert\\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                            }\\r\\n                            // Side call button 1\\r\\n                            else if ((alarmCodeInt & 8192) == 8192) {\\r\\n                                var alarm = 'Side1';\\r\\n                            }\\r\\n                            // Side call button 2\\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                                AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                                configsToAck.push(configIds.ReadState.Charging);\\r\\n                                //configs.AlertSettings.Welfare.Mode\\r\\n                                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'false');\\r\\n                                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'true');\\r\\n                                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'false');\\r\\n                                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                                }\\r\\n                            }\\r\\n                            //Battery no charging\\r\\n                            else if ((alarmCodeInt & 65536) == 65536) {\\r\\n                                var alarm = 'BATCF';\\r\\n                                AddValue(configsToUpdate, configIds.ReadState.Charging, 'false');\\r\\n                                configsToAck.push(configIds.ReadState.Charging);\\r\\n                                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'true');\\r\\n                                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'false');\\r\\n                                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'true');\\r\\n                                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                                }\\r\\n                            }\\r\\n                            //Alert End\\r\\n                            else if ((alarmCodeInt & 131072) == 131072) {\\r\\n                                var alarm = 'ALA-F';\\r\\n                                if (configs.Welfare.Mode == '1') {\\r\\n                                    info = 'Recurrent';\\r\\n                                } else info = 'Amber';\\r\\n                            }\\r\\n                            //Amber Alert ON    Don`t know the dfference between ALA and ALA-O\\r\\n                            else if ((alarmCodeInt & 262144) == 262144) {\\r\\n                                var alarm = 'ALA';\\r\\n                            }\\r\\n                            // welfare check in\\r\\n                            else if ((alarmCodeInt & 524288) == 524288) {\\r\\n                                var alarm = 'WTS';\\r\\n                                if (configs.Welfare.Mode == '1') {\\r\\n                                    info = 'Recurrent';\\r\\n                                } else info = 'Amber';\\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\\r\\n                            else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n                                var alarm = 'ALA-W';\\r\\n                                if (configs.Welfare.Mode == '1') {\\r\\n                                    info = 'Recurrent';\\r\\n                                } else info = 'Amber';\\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 != '64') {\\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 != '64') {\\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 = (`Sentry-${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 = (`Sentry-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                            if ((statusInt & 16) == 16) {\\r\\n                                statusDevice += 'Charging,';\\r\\n                                // AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                                // configsToAck.push(configIds.ReadState.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 != '64') {\\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 = (`Sentry-${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 != '64') {\\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 = (`Sentry-${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 = (`Sentry-${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 = (`Sentry-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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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                            var report;\\r\\n                            switch (contactNumber) {\\r\\n                                // Emergency Number\\r\\n                                // [Value]:80 2B 33 34 36 33 35 36 30 37 39 33 30\\r\\n                                //{\\\"number\\\":{\\\"call\\\":0,\\\"noCard\\\":0,\\\"number\\\":\\\"+34635607930\\\",\\\"enable\\\":1,\\\"sms\\\":0,\\\"index\\\":0}}\\r\\n                                case '0':\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.length < 6) { //if no telephone defined\\r\\n                                        tel = '';\\r\\n                                    }\\r\\n                                    report = hex2bin(value.substring(0, 2)); // To find report mode Call &data or DAta only\\r\\n                                    AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                                    AddValue(codeValues, \\\"ReportMode\\\", report.substring(2, 3));\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.ReportMode, report.substring(2, 3));\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.ReportMode);\\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                                    if (tel.length < 6) { //if no telephone defined\\r\\n                                        tel = '';\\r\\n                                    }\\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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 '55': // Tilt Angle Alert\\r\\n                            //[Value]:0A 00 1E 00\\r\\n                            //{\\\"tiltAlert\\\":{\\\"angle\\\":30,\\\"time\\\":10,\\\"status\\\":0,\\\"dial\\\":0}}\\r\\n                            var angle = hexToDecimal(value.substring(4, 6));\\r\\n                            var timeout = hexToDecimal(value.substring(0, 2));\\r\\n                            var status = hexToDecimal(value.substring(6, 8));\\r\\n                            if (status == 0) angle = 0;\\r\\n                            //var alertSetting = angle;\\r\\n                            //imei = serverParams.Imei;\\r\\n                            //messageForReceiver = (`Sentry;ACK-TILTANG;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"tiltangle\\\", angle);\\r\\n                            AddValue(codeValues, \\\"tiltimeout\\\", timeout);\\r\\n                            AddValue(codeValues, \\\"tiltstatus\\\", status);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltTimeout, timeout);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltAngle, angle);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltTimeout);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltAngle);\\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 = (`Sentry;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.ManDownSettings, sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.EnableDisableManDownSettings, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.Sensitivity, sesibityOptionValue);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.EnableDisableManDownSettings);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.Sensitivity);\\r\\n                            break;\\r\\n                        case '57': // Welfare\\r\\n                            // [Value]:10 0E 00 80 58 02 00 80\\r\\n                            //{\\\"welfareAlert\\\":{\\\"time\\\":600,\\\"value\\\":3600,\\\"status\\\":1,\\\"dial\\\":1}}\\r\\n                            var welfareStatus = hex2bin(value.substring(6, 8)); // check status\\r\\n                            var welfareValue = hexToDecimal(changeEndianness(value.substring(0, 6)));\\r\\n                            var welfareTime = hexToDecimal(changeEndianness(value.substring(8, 14)));\\r\\n                            var enalbleDisable = '';\\r\\n                            if ((configs.ReadState.Charging == 'true') && (configs.Welfare.Mode == '1') && (configs.Welfare.EnableDisableWelfare == 'true')) { // Force Read to enable welfare when device is charging in recurrent mode\\r\\n                                var sensibility = 'Enable, '\\r\\n                                enalbleDisable = '1'\\r\\n                            } else {\\r\\n                                if (welfareStatus.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                            };\\r\\n                            //var imei = serverParams.Imei;\\r\\n                            //messageForReceiver = (`Sentry;ACK-WELFALERT;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            sensibility += ', ' + welfareValue / 60;\\r\\n                            sensibility += ', ' + welfareTime / 60;\\r\\n                            AddValue(codeValues, \\\"welfare\\\", sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.EnableDisableReadWelfare, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Prealarm, welfareTime / 60);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Timeout, welfareValue / 60);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.EnableDisableReadWelfare);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Prealarm);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Timeout);\\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 = (`Sentry;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 '75': // Extra Enable control   Welfare Mode\\r\\n                            //[Value]:80 00 00 10  last two digit for new/old welfare\\r\\n                            //{\\\"extraControl\\\":{\\\"bit29\\\":0,\\\"bit27\\\":0,\\\"bit28\\\":1,\\\"bit25\\\":0,\\\"bit26\\\":0,\\\"flagValue\\\":268435584,\\\"bit23\\\":0,\\\"bit24\\\":0,\\\"bit21\\\":0,\\\"bit22\\\":0,\\\"bit20\\\":0,\\\"bit9\\\":0,\\\"bit18\\\":0,\\\"bit19\\\":0,\\\"bit7\\\":1,\\\"bit16\\\":0,\\\"bit8\\\":0,\\\"bit17\\\":0,\\\"bit5\\\":0,\\\"bit14\\\":0,\\\"bit6\\\":0,\\\"bit15\\\":0,\\\"bit3\\\":0,\\\"bit4\\\":0,\\\"bit1\\\":0,\\\"bit2\\\":0,\\\"bit0\\\":0,\\\"bit12\\\":0,\\\"bit13\\\":0,\\\"bit10\\\":0,\\\"bit11\\\":0,\\\"bit30\\\":0,\\\"bit31\\\":0}}\\r\\n                            var extraStatus = hex2bin(value.substring(6, 7)).substring(7, 8);\\r\\n                            //if (extraStatus.substring(7, 8) == '1') {\\r\\n                            //    extra += ' Enable, '\\r\\n                            //} else {\\r\\n                            //    extra += ' 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, \\\"welfare Mode\\\", extraStatus);\\r\\n                            // messageForReceiver = (`Sentry;ACK-EXTRA;${imei};`);\\r\\n                            // sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Mode, extraStatus);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Mode);\\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 = (`Sentry;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 = (`Sentry;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 = (`Sentry-${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 = (`Sentry-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 = (`Sentry-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 = (`Sentry-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":1744057168},{"Type":1,"NewValue":"{\"Id\":362,\"Name\":\"Access PS Sentry\",\"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    // Sentry protocol - please see variables and typical values in order below\\r\\n    // Sentry-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    // Sentry-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 N.\\r\\n    // Created: 01/01/2025\\r\\n    // Last modified: 07/04/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', 'Sentry');\\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 = (`Sentry-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 'BATCN': // Battery Charging - On\\r\\n                AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                configsToAck.push(configIds.ReadState.Charging);\\r\\n                //configs.AlertSettings.Welfare.Mode\\r\\n                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'false');\\r\\n                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'true');\\r\\n                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'false');\\r\\n                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                }\\r\\n                break;\\r\\n            case 'BATCF': // Battery Charging - Off\\r\\n                AddValue(configsToUpdate, configIds.ReadState.Charging, 'false');\\r\\n                configsToAck.push(configIds.ReadState.Charging);\\r\\n                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'true');\\r\\n                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'false');\\r\\n                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'true');\\r\\n                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                }\\r\\n                break;\\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 Sentry-')) {\\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 = (`Sentry-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 = (`Sentry;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 = (`Sentry;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 = (`Sentry-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    // 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 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\\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  ¿qué es fall OFF?\\r\\n                            if ((alarmCodeExtInt & 1) == 1) {\\r\\n                                var alarm = 'ALF-C'; // Fall-DownAlertending\\r\\n                            }\\r\\n                            // Welfare Check-out\\r\\n                            else if ((alarmCodeExtInt & 2) == 2) {\\r\\n                                var alarm = 'WSTP';\\r\\n                                if (configs.Welfare.Mode == '1') {\\r\\n                                    info = 'Recurrent';\\r\\n                                } else info = 'Amber';\\r\\n                            }\\r\\n                            //Geo 5 in\\r\\n                            //else if ((alarmCodeInt & 16) == 16) {\\r\\n                            //    var alarm = 'BATL';\\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 Alert\\r\\n                            else if ((alarmCodeInt & 8) == 8) {\\r\\n                                var alarm = 'TLT';\\r\\n                            }\\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 Alert\\r\\n                            else if ((alarmCodeInt & 256) == 256) {\\r\\n                                var alarm = 'PWRF';\\r\\n                            }\\r\\n                            //Power On Alert\\r\\n                            else if ((alarmCodeInt & 512) == 512) {\\r\\n                                var alarm = 'PWRN';\\r\\n                            }\\r\\n                            //Motion Alert\\r\\n                            else if ((alarmCodeInt & 1024) == 1024) {\\r\\n                                var alarm = 'ALMOV';\\r\\n                            }\\r\\n                            //No Motion Alert\\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                            }\\r\\n                            // Side call button 1\\r\\n                            else if ((alarmCodeInt & 8192) == 8192) {\\r\\n                                var alarm = 'Side1';\\r\\n                            }\\r\\n                            // Side call button 2\\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                                /*AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                                configsToAck.push(configIds.ReadState.Charging);\\r\\n                                //configs.AlertSettings.Welfare.Mode\\r\\n                                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'false');\\r\\n                                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'true');\\r\\n                                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'false');\\r\\n                                    configsToAck.push(configIds.ReadState.Welfare);  \\r\\n                                }*/\\r\\n                            }\\r\\n                            //Battery no charging\\r\\n                            else if ((alarmCodeInt & 65536) == 65536) {\\r\\n                                var alarm = 'BATCF';\\r\\n                                /* AddValue(configsToUpdate, configIds.ReadState.Charging, 'false');\\r\\n                                 configsToAck.push(configIds.ReadState.Charging);\\r\\n                                 if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                                     AddValue(configsToUpdate, configIds.ReadState.Welfare, 'true');\\r\\n                                     //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'false');\\r\\n                                     AddConfig(configsToSend, configIds.ReadState.Welfare, 'true');\\r\\n                                     configsToAck.push(configIds.ReadState.Welfare);  \\r\\n                                 }*/\\r\\n                            }\\r\\n                            //Alert End\\r\\n                            else if ((alarmCodeInt & 131072) == 131072) {\\r\\n                                var alarm = 'ALA-F';\\r\\n                                if (configs.Welfare.Mode == '1') {\\r\\n                                    info = 'Recurrent';\\r\\n                                } else info = 'Amber';\\r\\n                            }\\r\\n                            //Amber Alert ON    Don`t know the dfference between ALA and ALA-O\\r\\n                            else if ((alarmCodeInt & 262144) == 262144) {\\r\\n                                var alarm = 'ALA';\\r\\n                            }\\r\\n                            // welfare check in\\r\\n                            else if ((alarmCodeInt & 524288) == 524288) {\\r\\n                                var alarm = 'WTS';\\r\\n                                if (configs.Welfare.Mode == '1') {\\r\\n                                    info = 'Recurrent';\\r\\n                                } else info = 'Amber';\\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\\r\\n                            else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n                                var alarm = 'ALA-W';\\r\\n                                if (configs.Welfare.Mode == '1') {\\r\\n                                    info = 'Recurrent';\\r\\n                                } else info = 'Amber';\\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 != '64') {\\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 != '64') {\\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 = (`Sentry-${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 = (`Sentry-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                            if ((statusInt & 16) == 16) {\\r\\n                                statusDevice += 'Charging,';\\r\\n                                // AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                                // configsToAck.push(configIds.ReadState.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 != '64') {\\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 = (`Sentry-${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 != '64') {\\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 = (`Sentry-${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 = (`Sentry-${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 = (`Sentry-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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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                            var report;\\r\\n                            switch (contactNumber) {\\r\\n                                // Emergency Number\\r\\n                                // [Value]:80 2B 33 34 36 33 35 36 30 37 39 33 30\\r\\n                                //{\\\"number\\\":{\\\"call\\\":0,\\\"noCard\\\":0,\\\"number\\\":\\\"+34635607930\\\",\\\"enable\\\":1,\\\"sms\\\":0,\\\"index\\\":0}}\\r\\n                                case '0':\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.length < 6) { //if no telephone defined\\r\\n                                        tel = '';\\r\\n                                    }\\r\\n                                    report = hex2bin(value.substring(0, 2)); // To find report mode Call &data or DAta only\\r\\n                                    AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                                    AddValue(codeValues, \\\"ReportMode\\\", report.substring(2, 3));\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.ReportMode, report.substring(2, 3));\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.ReportMode);\\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                                    if (tel.length < 6) { //if no telephone defined\\r\\n                                        tel = '';\\r\\n                                    }\\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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 '55': // Tilt Angle Alert\\r\\n                            //[Value]:0A 00 1E 00\\r\\n                            //{\\\"tiltAlert\\\":{\\\"angle\\\":30,\\\"time\\\":10,\\\"status\\\":0,\\\"dial\\\":0}}\\r\\n                            var angle = hexToDecimal(value.substring(4, 6));\\r\\n                            var timeout = hexToDecimal(value.substring(0, 2));\\r\\n                            var status = hexToDecimal(value.substring(6, 8));\\r\\n                            if (status == 0) angle = 0;\\r\\n                            //var alertSetting = angle;\\r\\n                            //imei = serverParams.Imei;\\r\\n                            //messageForReceiver = (`Sentry;ACK-TILTANG;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"tiltangle\\\", angle);\\r\\n                            AddValue(codeValues, \\\"tiltimeout\\\", timeout);\\r\\n                            AddValue(codeValues, \\\"tiltstatus\\\", status);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltTimeout, timeout);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltAngle, angle);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltTimeout);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltAngle);\\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 = (`Sentry;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.ManDownSettings, sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.EnableDisableManDownSettings, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.Sensitivity, sesibityOptionValue);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.EnableDisableManDownSettings);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.Sensitivity);\\r\\n                            break;\\r\\n                        case '57': // Welfare\\r\\n                            // [Value]:10 0E 00 80 58 02 00 80\\r\\n                            //{\\\"welfareAlert\\\":{\\\"time\\\":600,\\\"value\\\":3600,\\\"status\\\":1,\\\"dial\\\":1}}\\r\\n                            var welfareStatus = hex2bin(value.substring(6, 8)); // check status\\r\\n                            var welfareValue = hexToDecimal(changeEndianness(value.substring(0, 6)));\\r\\n                            var welfareTime = hexToDecimal(changeEndianness(value.substring(8, 14)));\\r\\n                            var enalbleDisable = '';\\r\\n                            if ((configs.ReadState.Charging == 'true') && (configs.Welfare.Mode == '1') && (configs.Welfare.EnableDisableWelfare == 'true')) { // Force Read to enable welfare when device is charging in recurrent mode\\r\\n                                var sensibility = 'Enable, '\\r\\n                                enalbleDisable = '1'\\r\\n                            } else {\\r\\n                                if (welfareStatus.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                            };\\r\\n                            //var imei = serverParams.Imei;\\r\\n                            //messageForReceiver = (`Sentry;ACK-WELFALERT;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            sensibility += ', ' + welfareValue / 60;\\r\\n                            sensibility += ', ' + welfareTime / 60;\\r\\n                            AddValue(codeValues, \\\"welfare\\\", sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.EnableDisableReadWelfare, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Prealarm, welfareTime / 60);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Timeout, welfareValue / 60);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.EnableDisableReadWelfare);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Prealarm);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Timeout);\\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 = (`Sentry;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 '75': // Extra Enable control   Welfare Mode\\r\\n                            //[Value]:80 00 00 10  last two digit for new/old welfare\\r\\n                            //{\\\"extraControl\\\":{\\\"bit29\\\":0,\\\"bit27\\\":0,\\\"bit28\\\":1,\\\"bit25\\\":0,\\\"bit26\\\":0,\\\"flagValue\\\":268435584,\\\"bit23\\\":0,\\\"bit24\\\":0,\\\"bit21\\\":0,\\\"bit22\\\":0,\\\"bit20\\\":0,\\\"bit9\\\":0,\\\"bit18\\\":0,\\\"bit19\\\":0,\\\"bit7\\\":1,\\\"bit16\\\":0,\\\"bit8\\\":0,\\\"bit17\\\":0,\\\"bit5\\\":0,\\\"bit14\\\":0,\\\"bit6\\\":0,\\\"bit15\\\":0,\\\"bit3\\\":0,\\\"bit4\\\":0,\\\"bit1\\\":0,\\\"bit2\\\":0,\\\"bit0\\\":0,\\\"bit12\\\":0,\\\"bit13\\\":0,\\\"bit10\\\":0,\\\"bit11\\\":0,\\\"bit30\\\":0,\\\"bit31\\\":0}}\\r\\n                            var extraStatus = hex2bin(value.substring(6, 7)).substring(7, 8);\\r\\n                            //if (extraStatus.substring(7, 8) == '1') {\\r\\n                            //    extra += ' Enable, '\\r\\n                            //} else {\\r\\n                            //    extra += ' 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, \\\"welfare Mode\\\", extraStatus);\\r\\n                            // messageForReceiver = (`Sentry;ACK-EXTRA;${imei};`);\\r\\n                            // sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Mode, extraStatus);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Mode);\\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 = (`Sentry;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 = (`Sentry;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 = (`Sentry-${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 = (`Sentry-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 = (`Sentry-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 = (`Sentry-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 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    // 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":1744059102},{"Type":1,"NewValue":"{\"Id\":362,\"Name\":\"Access PS Sentry\",\"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    // Sentry protocol - please see variables and typical values in order below\\r\\n    // Sentry-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    // Sentry-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 N.\\r\\n    // Created: 01/01/2025\\r\\n    // Last modified: 14/02/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', 'Sentry');\\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 = (`Sentry-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 Sentry-')) {\\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 = (`Sentry-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 = (`Sentry;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 = (`Sentry;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 = (`Sentry-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    // 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 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\\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  ¿qué es fall OFF?\\r\\n                            if ((alarmCodeExtInt & 1) == 1) {\\r\\n                                var alarm = 'ALF-C'; // Fall-DownAlertending\\r\\n                            }\\r\\n                            // Welfare Check-out\\r\\n                            else if ((alarmCodeExtInt & 2) == 2) {\\r\\n                                var alarm = 'WSTP';\\r\\n                                if (configs.Welfare.Mode == '1') {\\r\\n                                    info = 'Recurrent';\\r\\n                                } else info = 'Amber';\\r\\n                            }\\r\\n                            //Geo 5 in\\r\\n                            //else if ((alarmCodeInt & 16) == 16) {\\r\\n                            //    var alarm = 'BATL';\\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 Alert\\r\\n                            else if ((alarmCodeInt & 8) == 8) {\\r\\n                                var alarm = 'TLT';\\r\\n                            }\\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 Alert\\r\\n                            else if ((alarmCodeInt & 256) == 256) {\\r\\n                                var alarm = 'PWRF';\\r\\n                            }\\r\\n                            //Power On Alert\\r\\n                            else if ((alarmCodeInt & 512) == 512) {\\r\\n                                var alarm = 'PWRN';\\r\\n                            }\\r\\n                            //Motion Alert\\r\\n                            else if ((alarmCodeInt & 1024) == 1024) {\\r\\n                                var alarm = 'ALMOV';\\r\\n                            }\\r\\n                            //No Motion Alert\\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                            }\\r\\n                            // Side call button 1\\r\\n                            else if ((alarmCodeInt & 8192) == 8192) {\\r\\n                                var alarm = 'Side1';\\r\\n                            }\\r\\n                            // Side call button 2\\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                                AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                                configsToAck.push(configIds.ReadState.Charging);\\r\\n                                //configs.AlertSettings.Welfare.Mode\\r\\n                                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'false');\\r\\n                                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'true');\\r\\n                                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'false');\\r\\n                                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                                }\\r\\n                            }\\r\\n                            //Battery no charging\\r\\n                            else if ((alarmCodeInt & 65536) == 65536) {\\r\\n                                var alarm = 'BATCF';\\r\\n                                AddValue(configsToUpdate, configIds.ReadState.Charging, 'false');\\r\\n                                configsToAck.push(configIds.ReadState.Charging);\\r\\n                                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'true');\\r\\n                                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'false');\\r\\n                                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'true');\\r\\n                                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                                }\\r\\n                            }\\r\\n                            //Alert End\\r\\n                            else if ((alarmCodeInt & 131072) == 131072) {\\r\\n                                var alarm = 'ALA-F';\\r\\n                                if (configs.Welfare.Mode == '1') {\\r\\n                                    info = 'Recurrent';\\r\\n                                } else info = 'Amber';\\r\\n                            }\\r\\n                            //Amber Alert ON    Don`t know the dfference between ALA and ALA-O\\r\\n                            else if ((alarmCodeInt & 262144) == 262144) {\\r\\n                                var alarm = 'ALA';\\r\\n                            }\\r\\n                            // welfare check in\\r\\n                            else if ((alarmCodeInt & 524288) == 524288) {\\r\\n                                var alarm = 'WTS';\\r\\n                                if (configs.Welfare.Mode == '1') {\\r\\n                                    info = 'Recurrent';\\r\\n                                } else info = 'Amber';\\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\\r\\n                            else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n                                var alarm = 'ALA-W';\\r\\n                                if (configs.Welfare.Mode == '1') {\\r\\n                                    info = 'Recurrent';\\r\\n                                } else info = 'Amber';\\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 != '64') {\\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 != '64') {\\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 = (`Sentry-${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 = (`Sentry-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                            if ((statusInt & 16) == 16) {\\r\\n                                statusDevice += 'Charging,';\\r\\n                                // AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                                // configsToAck.push(configIds.ReadState.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 != '64') {\\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 = (`Sentry-${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 != '64') {\\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 = (`Sentry-${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 = (`Sentry-${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 = (`Sentry-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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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                            var report;\\r\\n                            switch (contactNumber) {\\r\\n                                // Emergency Number\\r\\n                                // [Value]:80 2B 33 34 36 33 35 36 30 37 39 33 30\\r\\n                                //{\\\"number\\\":{\\\"call\\\":0,\\\"noCard\\\":0,\\\"number\\\":\\\"+34635607930\\\",\\\"enable\\\":1,\\\"sms\\\":0,\\\"index\\\":0}}\\r\\n                                case '0':\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.length < 6) { //if no telephone defined\\r\\n                                        tel = '';\\r\\n                                    }\\r\\n                                    report = hex2bin(value.substring(0, 2)); // To find report mode Call &data or DAta only\\r\\n                                    AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                                    AddValue(codeValues, \\\"ReportMode\\\", report.substring(2, 3));\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.ReportMode, report.substring(2, 3));\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.ReportMode);\\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                                    if (tel.length < 6) { //if no telephone defined\\r\\n                                        tel = '';\\r\\n                                    }\\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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 '55': // Tilt Angle Alert\\r\\n                            //[Value]:0A 00 1E 00\\r\\n                            //{\\\"tiltAlert\\\":{\\\"angle\\\":30,\\\"time\\\":10,\\\"status\\\":0,\\\"dial\\\":0}}\\r\\n                            var angle = hexToDecimal(value.substring(4, 6));\\r\\n                            var timeout = hexToDecimal(value.substring(0, 2));\\r\\n                            var status = hexToDecimal(value.substring(6, 8));\\r\\n                            if (status == 0) angle = 0;\\r\\n                            //var alertSetting = angle;\\r\\n                            //imei = serverParams.Imei;\\r\\n                            //messageForReceiver = (`Sentry;ACK-TILTANG;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"tiltangle\\\", angle);\\r\\n                            AddValue(codeValues, \\\"tiltimeout\\\", timeout);\\r\\n                            AddValue(codeValues, \\\"tiltstatus\\\", status);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltTimeout, timeout);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltAngle, angle);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltTimeout);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltAngle);\\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 = (`Sentry;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.ManDownSettings, sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.EnableDisableManDownSettings, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.Sensitivity, sesibityOptionValue);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.EnableDisableManDownSettings);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.Sensitivity);\\r\\n                            break;\\r\\n                        case '57': // Welfare\\r\\n                            // [Value]:10 0E 00 80 58 02 00 80\\r\\n                            //{\\\"welfareAlert\\\":{\\\"time\\\":600,\\\"value\\\":3600,\\\"status\\\":1,\\\"dial\\\":1}}\\r\\n                            var welfareStatus = hex2bin(value.substring(6, 8)); // check status\\r\\n                            var welfareValue = hexToDecimal(changeEndianness(value.substring(0, 6)));\\r\\n                            var welfareTime = hexToDecimal(changeEndianness(value.substring(8, 14)));\\r\\n                            var enalbleDisable = '';\\r\\n                            if ((configs.ReadState.Charging == 'true') && (configs.Welfare.Mode == '1') && (configs.Welfare.EnableDisableWelfare == 'true')) { // Force Read to enable welfare when device is charging in recurrent mode\\r\\n                                var sensibility = 'Enable, '\\r\\n                                enalbleDisable = '1'\\r\\n                            } else {\\r\\n                                if (welfareStatus.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                            };\\r\\n                            //var imei = serverParams.Imei;\\r\\n                            //messageForReceiver = (`Sentry;ACK-WELFALERT;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            sensibility += ', ' + welfareValue / 60;\\r\\n                            sensibility += ', ' + welfareTime / 60;\\r\\n                            AddValue(codeValues, \\\"welfare\\\", sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.EnableDisableReadWelfare, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Prealarm, welfareTime / 60);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Timeout, welfareValue / 60);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.EnableDisableReadWelfare);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Prealarm);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Timeout);\\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 = (`Sentry;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 '75': // Extra Enable control   Welfare Mode\\r\\n                            //[Value]:80 00 00 10  last two digit for new/old welfare\\r\\n                            //{\\\"extraControl\\\":{\\\"bit29\\\":0,\\\"bit27\\\":0,\\\"bit28\\\":1,\\\"bit25\\\":0,\\\"bit26\\\":0,\\\"flagValue\\\":268435584,\\\"bit23\\\":0,\\\"bit24\\\":0,\\\"bit21\\\":0,\\\"bit22\\\":0,\\\"bit20\\\":0,\\\"bit9\\\":0,\\\"bit18\\\":0,\\\"bit19\\\":0,\\\"bit7\\\":1,\\\"bit16\\\":0,\\\"bit8\\\":0,\\\"bit17\\\":0,\\\"bit5\\\":0,\\\"bit14\\\":0,\\\"bit6\\\":0,\\\"bit15\\\":0,\\\"bit3\\\":0,\\\"bit4\\\":0,\\\"bit1\\\":0,\\\"bit2\\\":0,\\\"bit0\\\":0,\\\"bit12\\\":0,\\\"bit13\\\":0,\\\"bit10\\\":0,\\\"bit11\\\":0,\\\"bit30\\\":0,\\\"bit31\\\":0}}\\r\\n                            var extraStatus = hex2bin(value.substring(6, 7)).substring(7, 8);\\r\\n                            //if (extraStatus.substring(7, 8) == '1') {\\r\\n                            //    extra += ' Enable, '\\r\\n                            //} else {\\r\\n                            //    extra += ' 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, \\\"welfare Mode\\\", extraStatus);\\r\\n                            // messageForReceiver = (`Sentry;ACK-EXTRA;${imei};`);\\r\\n                            // sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Mode, extraStatus);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Mode);\\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 = (`Sentry;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 = (`Sentry;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 = (`Sentry-${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 = (`Sentry-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 = (`Sentry-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 = (`Sentry-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":1744059564},{"Type":1,"NewValue":"{\"Id\":362,\"Name\":\"Access PS Sentry\",\"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    // Sentry protocol - please see variables and typical values in order below\\r\\n    // Sentry-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    // Sentry-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 N.\\r\\n    // Created: 01/01/2025\\r\\n    // Last modified: 14/02/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', 'Sentry');\\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 = (`Sentry-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 Sentry-')) {\\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 = (`Sentry-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 = (`Sentry;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 = (`Sentry;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 = (`Sentry-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    // 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 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\\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  ¿qué es fall OFF?\\r\\n                            if ((alarmCodeExtInt & 1) == 1) {\\r\\n                                var alarm = 'ALF-C'; // Fall-DownAlertending\\r\\n                            }\\r\\n                            // Welfare Check-out\\r\\n                            else if ((alarmCodeExtInt & 2) == 2) {\\r\\n                                var alarm = 'WSTP';\\r\\n                                if (configs.Welfare.Mode == '1') {\\r\\n                                    info = 'Recurrent';\\r\\n                                } else info = 'Amber';\\r\\n                            }\\r\\n                            //Geo 5 in\\r\\n                            //else if ((alarmCodeInt & 16) == 16) {\\r\\n                            //    var alarm = 'BATL';\\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 Alert\\r\\n                            else if ((alarmCodeInt & 8) == 8) {\\r\\n                                var alarm = 'TLT';\\r\\n                            }\\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 Alert\\r\\n                            else if ((alarmCodeInt & 256) == 256) {\\r\\n                                var alarm = 'PWRF';\\r\\n                            }\\r\\n                            //Power On Alert\\r\\n                            else if ((alarmCodeInt & 512) == 512) {\\r\\n                                var alarm = 'PWRN';\\r\\n                            }\\r\\n                            //Motion Alert\\r\\n                            else if ((alarmCodeInt & 1024) == 1024) {\\r\\n                                var alarm = 'ALMOV';\\r\\n                            }\\r\\n                            //No Motion Alert\\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                            }\\r\\n                            // Side call button 1\\r\\n                            else if ((alarmCodeInt & 8192) == 8192) {\\r\\n                                var alarm = 'Side1';\\r\\n                            }\\r\\n                            // Side call button 2\\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                                /*AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                                configsToAck.push(configIds.ReadState.Charging);\\r\\n                                //configs.AlertSettings.Welfare.Mode\\r\\n                                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'false');\\r\\n                                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'true');\\r\\n                                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'false');\\r\\n                                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                                }*/\\r\\n                            }\\r\\n                            //Battery no charging\\r\\n                            else if ((alarmCodeInt & 65536) == 65536) {\\r\\n                                var alarm = 'BATCF';\\r\\n                                /* AddValue(configsToUpdate, configIds.ReadState.Charging, 'false');\\r\\n                                 configsToAck.push(configIds.ReadState.Charging);\\r\\n                                 if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                                     AddValue(configsToUpdate, configIds.ReadState.Welfare, 'true');\\r\\n                                     //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'false');\\r\\n                                     AddConfig(configsToSend, configIds.ReadState.Welfare, 'true');\\r\\n                                     configsToAck.push(configIds.ReadState.Welfare);\\r\\n                                 }*/\\r\\n                            }\\r\\n                            //Alert End\\r\\n                            else if ((alarmCodeInt & 131072) == 131072) {\\r\\n                                var alarm = 'ALA-F';\\r\\n                                if (configs.Welfare.Mode == '1') {\\r\\n                                    info = 'Recurrent';\\r\\n                                } else info = 'Amber';\\r\\n                            }\\r\\n                            //Amber Alert ON    Don`t know the dfference between ALA and ALA-O\\r\\n                            else if ((alarmCodeInt & 262144) == 262144) {\\r\\n                                var alarm = 'ALA';\\r\\n                            }\\r\\n                            // welfare check in\\r\\n                            else if ((alarmCodeInt & 524288) == 524288) {\\r\\n                                var alarm = 'WTS';\\r\\n                                if (configs.Welfare.Mode == '1') {\\r\\n                                    info = 'Recurrent';\\r\\n                                } else info = 'Amber';\\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\\r\\n                            else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n                                var alarm = 'ALA-W';\\r\\n                                if (configs.Welfare.Mode == '1') {\\r\\n                                    info = 'Recurrent';\\r\\n                                } else info = 'Amber';\\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 != '64') {\\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 != '64') {\\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 = (`Sentry-${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 = (`Sentry-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                            if ((statusInt & 16) == 16) {\\r\\n                                statusDevice += 'Charging,';\\r\\n                                // AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                                // configsToAck.push(configIds.ReadState.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 != '64') {\\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 = (`Sentry-${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 != '64') {\\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 = (`Sentry-${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 = (`Sentry-${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 = (`Sentry-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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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                            var report;\\r\\n                            switch (contactNumber) {\\r\\n                                // Emergency Number\\r\\n                                // [Value]:80 2B 33 34 36 33 35 36 30 37 39 33 30\\r\\n                                //{\\\"number\\\":{\\\"call\\\":0,\\\"noCard\\\":0,\\\"number\\\":\\\"+34635607930\\\",\\\"enable\\\":1,\\\"sms\\\":0,\\\"index\\\":0}}\\r\\n                                case '0':\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.length < 6) { //if no telephone defined\\r\\n                                        tel = '';\\r\\n                                    }\\r\\n                                    report = hex2bin(value.substring(0, 2)); // To find report mode Call &data or DAta only\\r\\n                                    AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                                    AddValue(codeValues, \\\"ReportMode\\\", report.substring(2, 3));\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.ReportMode, report.substring(2, 3));\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.ReportMode);\\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                                    if (tel.length < 6) { //if no telephone defined\\r\\n                                        tel = '';\\r\\n                                    }\\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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 '55': // Tilt Angle Alert\\r\\n                            //[Value]:0A 00 1E 00\\r\\n                            //{\\\"tiltAlert\\\":{\\\"angle\\\":30,\\\"time\\\":10,\\\"status\\\":0,\\\"dial\\\":0}}\\r\\n                            var angle = hexToDecimal(value.substring(4, 6));\\r\\n                            var timeout = hexToDecimal(value.substring(0, 2));\\r\\n                            var status = hexToDecimal(value.substring(6, 8));\\r\\n                            if (status == 0) angle = 0;\\r\\n                            //var alertSetting = angle;\\r\\n                            //imei = serverParams.Imei;\\r\\n                            //messageForReceiver = (`Sentry;ACK-TILTANG;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"tiltangle\\\", angle);\\r\\n                            AddValue(codeValues, \\\"tiltimeout\\\", timeout);\\r\\n                            AddValue(codeValues, \\\"tiltstatus\\\", status);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltTimeout, timeout);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltAngle, angle);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltTimeout);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltAngle);\\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 = (`Sentry;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.ManDownSettings, sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.EnableDisableManDownSettings, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.Sensitivity, sesibityOptionValue);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.EnableDisableManDownSettings);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.Sensitivity);\\r\\n                            break;\\r\\n                        case '57': // Welfare\\r\\n                            // [Value]:10 0E 00 80 58 02 00 80\\r\\n                            //{\\\"welfareAlert\\\":{\\\"time\\\":600,\\\"value\\\":3600,\\\"status\\\":1,\\\"dial\\\":1}}\\r\\n                            var welfareStatus = hex2bin(value.substring(6, 8)); // check status\\r\\n                            var welfareValue = hexToDecimal(changeEndianness(value.substring(0, 6)));\\r\\n                            var welfareTime = hexToDecimal(changeEndianness(value.substring(8, 14)));\\r\\n                            var enalbleDisable = '';\\r\\n                            if ((configs.ReadState.Charging == 'true') && (configs.Welfare.Mode == '1') && (configs.Welfare.EnableDisableWelfare == 'true')) { // Force Read to enable welfare when device is charging in recurrent mode\\r\\n                                var sensibility = 'Enable, '\\r\\n                                enalbleDisable = '1'\\r\\n                            } else {\\r\\n                                if (welfareStatus.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                            };\\r\\n                            //var imei = serverParams.Imei;\\r\\n                            //messageForReceiver = (`Sentry;ACK-WELFALERT;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            sensibility += ', ' + welfareValue / 60;\\r\\n                            sensibility += ', ' + welfareTime / 60;\\r\\n                            AddValue(codeValues, \\\"welfare\\\", sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.EnableDisableReadWelfare, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Prealarm, welfareTime / 60);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Timeout, welfareValue / 60);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.EnableDisableReadWelfare);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Prealarm);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Timeout);\\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 = (`Sentry;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 '75': // Extra Enable control   Welfare Mode\\r\\n                            //[Value]:80 00 00 10  last two digit for new/old welfare\\r\\n                            //{\\\"extraControl\\\":{\\\"bit29\\\":0,\\\"bit27\\\":0,\\\"bit28\\\":1,\\\"bit25\\\":0,\\\"bit26\\\":0,\\\"flagValue\\\":268435584,\\\"bit23\\\":0,\\\"bit24\\\":0,\\\"bit21\\\":0,\\\"bit22\\\":0,\\\"bit20\\\":0,\\\"bit9\\\":0,\\\"bit18\\\":0,\\\"bit19\\\":0,\\\"bit7\\\":1,\\\"bit16\\\":0,\\\"bit8\\\":0,\\\"bit17\\\":0,\\\"bit5\\\":0,\\\"bit14\\\":0,\\\"bit6\\\":0,\\\"bit15\\\":0,\\\"bit3\\\":0,\\\"bit4\\\":0,\\\"bit1\\\":0,\\\"bit2\\\":0,\\\"bit0\\\":0,\\\"bit12\\\":0,\\\"bit13\\\":0,\\\"bit10\\\":0,\\\"bit11\\\":0,\\\"bit30\\\":0,\\\"bit31\\\":0}}\\r\\n                            var extraStatus = hex2bin(value.substring(6, 7)).substring(7, 8);\\r\\n                            //if (extraStatus.substring(7, 8) == '1') {\\r\\n                            //    extra += ' Enable, '\\r\\n                            //} else {\\r\\n                            //    extra += ' 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, \\\"welfare Mode\\\", extraStatus);\\r\\n                            // messageForReceiver = (`Sentry;ACK-EXTRA;${imei};`);\\r\\n                            // sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Mode, extraStatus);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Mode);\\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 = (`Sentry;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 = (`Sentry;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 = (`Sentry-${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 = (`Sentry-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 = (`Sentry-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 = (`Sentry-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":1744059964},{"Type":1,"NewValue":"{\"Id\":362,\"Name\":\"Access PS Sentry\",\"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    // Sentry protocol - please see variables and typical values in order below\\r\\n    // Sentry-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    // Sentry-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 N.\\r\\n    // Created: 01/01/2025\\r\\n    // Last modified: 14/02/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', 'Sentry');\\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 = (`Sentry-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 'BATCN': // Battery Charging - On\\r\\n                AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                configsToAck.push(configIds.ReadState.Charging);\\r\\n                //configs.AlertSettings.Welfare.Mode\\r\\n                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'false');\\r\\n                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'true');\\r\\n                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'false');\\r\\n                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                }\\r\\n                break;\\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 Sentry-')) {\\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 = (`Sentry-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 = (`Sentry;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 = (`Sentry;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 = (`Sentry-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    // 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 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\\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  ¿qué es fall OFF?\\r\\n                            if ((alarmCodeExtInt & 1) == 1) {\\r\\n                                var alarm = 'ALF-C'; // Fall-DownAlertending\\r\\n                            }\\r\\n                            // Welfare Check-out\\r\\n                            else if ((alarmCodeExtInt & 2) == 2) {\\r\\n                                var alarm = 'WSTP';\\r\\n                                if (configs.Welfare.Mode == '1') {\\r\\n                                    info = 'Recurrent';\\r\\n                                } else info = 'Amber';\\r\\n                            }\\r\\n                            //Geo 5 in\\r\\n                            //else if ((alarmCodeInt & 16) == 16) {\\r\\n                            //    var alarm = 'BATL';\\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 Alert\\r\\n                            else if ((alarmCodeInt & 8) == 8) {\\r\\n                                var alarm = 'TLT';\\r\\n                            }\\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 Alert\\r\\n                            else if ((alarmCodeInt & 256) == 256) {\\r\\n                                var alarm = 'PWRF';\\r\\n                            }\\r\\n                            //Power On Alert\\r\\n                            else if ((alarmCodeInt & 512) == 512) {\\r\\n                                var alarm = 'PWRN';\\r\\n                            }\\r\\n                            //Motion Alert\\r\\n                            else if ((alarmCodeInt & 1024) == 1024) {\\r\\n                                var alarm = 'ALMOV';\\r\\n                            }\\r\\n                            //No Motion Alert\\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                            }\\r\\n                            // Side call button 1\\r\\n                            else if ((alarmCodeInt & 8192) == 8192) {\\r\\n                                var alarm = 'Side1';\\r\\n                            }\\r\\n                            // Side call button 2\\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                                /*AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                                configsToAck.push(configIds.ReadState.Charging);\\r\\n                                //configs.AlertSettings.Welfare.Mode\\r\\n                                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'false');\\r\\n                                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'true');\\r\\n                                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'false');\\r\\n                                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                                }*/\\r\\n                            }\\r\\n                            //Battery no charging\\r\\n                            else if ((alarmCodeInt & 65536) == 65536) {\\r\\n                                var alarm = 'BATCF';\\r\\n                                /* AddValue(configsToUpdate, configIds.ReadState.Charging, 'false');\\r\\n                                 configsToAck.push(configIds.ReadState.Charging);\\r\\n                                 if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                                     AddValue(configsToUpdate, configIds.ReadState.Welfare, 'true');\\r\\n                                     //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'false');\\r\\n                                     AddConfig(configsToSend, configIds.ReadState.Welfare, 'true');\\r\\n                                     configsToAck.push(configIds.ReadState.Welfare);\\r\\n                                 }*/\\r\\n                            }\\r\\n                            //Alert End\\r\\n                            else if ((alarmCodeInt & 131072) == 131072) {\\r\\n                                var alarm = 'ALA-F';\\r\\n                                if (configs.Welfare.Mode == '1') {\\r\\n                                    info = 'Recurrent';\\r\\n                                } else info = 'Amber';\\r\\n                            }\\r\\n                            //Amber Alert ON    Don`t know the dfference between ALA and ALA-O\\r\\n                            else if ((alarmCodeInt & 262144) == 262144) {\\r\\n                                var alarm = 'ALA';\\r\\n                            }\\r\\n                            // welfare check in\\r\\n                            else if ((alarmCodeInt & 524288) == 524288) {\\r\\n                                var alarm = 'WTS';\\r\\n                                if (configs.Welfare.Mode == '1') {\\r\\n                                    info = 'Recurrent';\\r\\n                                } else info = 'Amber';\\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\\r\\n                            else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n                                var alarm = 'ALA-W';\\r\\n                                if (configs.Welfare.Mode == '1') {\\r\\n                                    info = 'Recurrent';\\r\\n                                } else info = 'Amber';\\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 != '64') {\\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 != '64') {\\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 = (`Sentry-${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 = (`Sentry-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                            if ((statusInt & 16) == 16) {\\r\\n                                statusDevice += 'Charging,';\\r\\n                                // AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                                // configsToAck.push(configIds.ReadState.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 != '64') {\\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 = (`Sentry-${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 != '64') {\\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 = (`Sentry-${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 = (`Sentry-${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 = (`Sentry-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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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                            var report;\\r\\n                            switch (contactNumber) {\\r\\n                                // Emergency Number\\r\\n                                // [Value]:80 2B 33 34 36 33 35 36 30 37 39 33 30\\r\\n                                //{\\\"number\\\":{\\\"call\\\":0,\\\"noCard\\\":0,\\\"number\\\":\\\"+34635607930\\\",\\\"enable\\\":1,\\\"sms\\\":0,\\\"index\\\":0}}\\r\\n                                case '0':\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.length < 6) { //if no telephone defined\\r\\n                                        tel = '';\\r\\n                                    }\\r\\n                                    report = hex2bin(value.substring(0, 2)); // To find report mode Call &data or DAta only\\r\\n                                    AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                                    AddValue(codeValues, \\\"ReportMode\\\", report.substring(2, 3));\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.ReportMode, report.substring(2, 3));\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.ReportMode);\\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                                    if (tel.length < 6) { //if no telephone defined\\r\\n                                        tel = '';\\r\\n                                    }\\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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 '55': // Tilt Angle Alert\\r\\n                            //[Value]:0A 00 1E 00\\r\\n                            //{\\\"tiltAlert\\\":{\\\"angle\\\":30,\\\"time\\\":10,\\\"status\\\":0,\\\"dial\\\":0}}\\r\\n                            var angle = hexToDecimal(value.substring(4, 6));\\r\\n                            var timeout = hexToDecimal(value.substring(0, 2));\\r\\n                            var status = hexToDecimal(value.substring(6, 8));\\r\\n                            if (status == 0) angle = 0;\\r\\n                            //var alertSetting = angle;\\r\\n                            //imei = serverParams.Imei;\\r\\n                            //messageForReceiver = (`Sentry;ACK-TILTANG;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"tiltangle\\\", angle);\\r\\n                            AddValue(codeValues, \\\"tiltimeout\\\", timeout);\\r\\n                            AddValue(codeValues, \\\"tiltstatus\\\", status);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltTimeout, timeout);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltAngle, angle);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltTimeout);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltAngle);\\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 = (`Sentry;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.ManDownSettings, sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.EnableDisableManDownSettings, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.Sensitivity, sesibityOptionValue);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.EnableDisableManDownSettings);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.Sensitivity);\\r\\n                            break;\\r\\n                        case '57': // Welfare\\r\\n                            // [Value]:10 0E 00 80 58 02 00 80\\r\\n                            //{\\\"welfareAlert\\\":{\\\"time\\\":600,\\\"value\\\":3600,\\\"status\\\":1,\\\"dial\\\":1}}\\r\\n                            var welfareStatus = hex2bin(value.substring(6, 8)); // check status\\r\\n                            var welfareValue = hexToDecimal(changeEndianness(value.substring(0, 6)));\\r\\n                            var welfareTime = hexToDecimal(changeEndianness(value.substring(8, 14)));\\r\\n                            var enalbleDisable = '';\\r\\n                            if ((configs.ReadState.Charging == 'true') && (configs.Welfare.Mode == '1') && (configs.Welfare.EnableDisableWelfare == 'true')) { // Force Read to enable welfare when device is charging in recurrent mode\\r\\n                                var sensibility = 'Enable, '\\r\\n                                enalbleDisable = '1'\\r\\n                            } else {\\r\\n                                if (welfareStatus.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                            };\\r\\n                            //var imei = serverParams.Imei;\\r\\n                            //messageForReceiver = (`Sentry;ACK-WELFALERT;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            sensibility += ', ' + welfareValue / 60;\\r\\n                            sensibility += ', ' + welfareTime / 60;\\r\\n                            AddValue(codeValues, \\\"welfare\\\", sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.EnableDisableReadWelfare, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Prealarm, welfareTime / 60);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Timeout, welfareValue / 60);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.EnableDisableReadWelfare);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Prealarm);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Timeout);\\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 = (`Sentry;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 '75': // Extra Enable control   Welfare Mode\\r\\n                            //[Value]:80 00 00 10  last two digit for new/old welfare\\r\\n                            //{\\\"extraControl\\\":{\\\"bit29\\\":0,\\\"bit27\\\":0,\\\"bit28\\\":1,\\\"bit25\\\":0,\\\"bit26\\\":0,\\\"flagValue\\\":268435584,\\\"bit23\\\":0,\\\"bit24\\\":0,\\\"bit21\\\":0,\\\"bit22\\\":0,\\\"bit20\\\":0,\\\"bit9\\\":0,\\\"bit18\\\":0,\\\"bit19\\\":0,\\\"bit7\\\":1,\\\"bit16\\\":0,\\\"bit8\\\":0,\\\"bit17\\\":0,\\\"bit5\\\":0,\\\"bit14\\\":0,\\\"bit6\\\":0,\\\"bit15\\\":0,\\\"bit3\\\":0,\\\"bit4\\\":0,\\\"bit1\\\":0,\\\"bit2\\\":0,\\\"bit0\\\":0,\\\"bit12\\\":0,\\\"bit13\\\":0,\\\"bit10\\\":0,\\\"bit11\\\":0,\\\"bit30\\\":0,\\\"bit31\\\":0}}\\r\\n                            var extraStatus = hex2bin(value.substring(6, 7)).substring(7, 8);\\r\\n                            //if (extraStatus.substring(7, 8) == '1') {\\r\\n                            //    extra += ' Enable, '\\r\\n                            //} else {\\r\\n                            //    extra += ' 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, \\\"welfare Mode\\\", extraStatus);\\r\\n                            // messageForReceiver = (`Sentry;ACK-EXTRA;${imei};`);\\r\\n                            // sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Mode, extraStatus);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Mode);\\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 = (`Sentry;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 = (`Sentry;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 = (`Sentry-${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 = (`Sentry-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 = (`Sentry-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 = (`Sentry-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":1744060383},{"Type":1,"NewValue":"{\"Id\":362,\"Name\":\"Access PS Sentry\",\"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    // Sentry protocol - please see variables and typical values in order below\\r\\n    // Sentry-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    // Sentry-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 N.\\r\\n    // Created: 01/01/2025\\r\\n    // Last modified: 14/02/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', 'Sentry');\\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 = (`Sentry-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 'BATCN': // Battery Charging - On\\r\\n                AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                configsToAck.push(configIds.ReadState.Charging);\\r\\n                //configs.AlertSettings.Welfare.Mode\\r\\n                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'false');\\r\\n                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'true');\\r\\n                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'false');\\r\\n                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                }\\r\\n                break;\\r\\n            case 'BATCF': // Battery Charging - Off\\r\\n                AddValue(configsToUpdate, configIds.ReadState.Charging, 'false');\\r\\n                configsToAck.push(configIds.ReadState.Charging);\\r\\n                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'true');\\r\\n                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'false');\\r\\n                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'true');\\r\\n                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                }\\r\\n                break;\\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 Sentry-')) {\\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 = (`Sentry-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 = (`Sentry;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 = (`Sentry;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 = (`Sentry-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    // 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 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\\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  ¿qué es fall OFF?\\r\\n                            if ((alarmCodeExtInt & 1) == 1) {\\r\\n                                var alarm = 'ALF-C'; // Fall-DownAlertending\\r\\n                            }\\r\\n                            // Welfare Check-out\\r\\n                            else if ((alarmCodeExtInt & 2) == 2) {\\r\\n                                var alarm = 'WSTP';\\r\\n                                if (configs.Welfare.Mode == '1') {\\r\\n                                    info = 'Recurrent';\\r\\n                                } else info = 'Amber';\\r\\n                            }\\r\\n                            //Geo 5 in\\r\\n                            //else if ((alarmCodeInt & 16) == 16) {\\r\\n                            //    var alarm = 'BATL';\\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 Alert\\r\\n                            else if ((alarmCodeInt & 8) == 8) {\\r\\n                                var alarm = 'TLT';\\r\\n                            }\\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 Alert\\r\\n                            else if ((alarmCodeInt & 256) == 256) {\\r\\n                                var alarm = 'PWRF';\\r\\n                            }\\r\\n                            //Power On Alert\\r\\n                            else if ((alarmCodeInt & 512) == 512) {\\r\\n                                var alarm = 'PWRN';\\r\\n                            }\\r\\n                            //Motion Alert\\r\\n                            else if ((alarmCodeInt & 1024) == 1024) {\\r\\n                                var alarm = 'ALMOV';\\r\\n                            }\\r\\n                            //No Motion Alert\\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                            }\\r\\n                            // Side call button 1\\r\\n                            else if ((alarmCodeInt & 8192) == 8192) {\\r\\n                                var alarm = 'Side1';\\r\\n                            }\\r\\n                            // Side call button 2\\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                                /*AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                                configsToAck.push(configIds.ReadState.Charging);\\r\\n                                //configs.AlertSettings.Welfare.Mode\\r\\n                                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'false');\\r\\n                                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'true');\\r\\n                                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'false');\\r\\n                                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                                }*/\\r\\n                            }\\r\\n                            //Battery no charging\\r\\n                            else if ((alarmCodeInt & 65536) == 65536) {\\r\\n                                var alarm = 'BATCF';\\r\\n                                /* AddValue(configsToUpdate, configIds.ReadState.Charging, 'false');\\r\\n                                 configsToAck.push(configIds.ReadState.Charging);\\r\\n                                 if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                                     AddValue(configsToUpdate, configIds.ReadState.Welfare, 'true');\\r\\n                                     //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'false');\\r\\n                                     AddConfig(configsToSend, configIds.ReadState.Welfare, 'true');\\r\\n                                     configsToAck.push(configIds.ReadState.Welfare);\\r\\n                                 }*/\\r\\n                            }\\r\\n                            //Alert End\\r\\n                            else if ((alarmCodeInt & 131072) == 131072) {\\r\\n                                var alarm = 'ALA-F';\\r\\n                                if (configs.Welfare.Mode == '1') {\\r\\n                                    info = 'Recurrent';\\r\\n                                } else info = 'Amber';\\r\\n                            }\\r\\n                            //Amber Alert ON    Don`t know the dfference between ALA and ALA-O\\r\\n                            else if ((alarmCodeInt & 262144) == 262144) {\\r\\n                                var alarm = 'ALA';\\r\\n                            }\\r\\n                            // welfare check in\\r\\n                            else if ((alarmCodeInt & 524288) == 524288) {\\r\\n                                var alarm = 'WTS';\\r\\n                                if (configs.Welfare.Mode == '1') {\\r\\n                                    info = 'Recurrent';\\r\\n                                } else info = 'Amber';\\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\\r\\n                            else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n                                var alarm = 'ALA-W';\\r\\n                                if (configs.Welfare.Mode == '1') {\\r\\n                                    info = 'Recurrent';\\r\\n                                } else info = 'Amber';\\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 != '64') {\\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 != '64') {\\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 = (`Sentry-${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 = (`Sentry-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                            if ((statusInt & 16) == 16) {\\r\\n                                statusDevice += 'Charging,';\\r\\n                                // AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                                // configsToAck.push(configIds.ReadState.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 != '64') {\\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 = (`Sentry-${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 != '64') {\\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 = (`Sentry-${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 = (`Sentry-${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 = (`Sentry-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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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                            var report;\\r\\n                            switch (contactNumber) {\\r\\n                                // Emergency Number\\r\\n                                // [Value]:80 2B 33 34 36 33 35 36 30 37 39 33 30\\r\\n                                //{\\\"number\\\":{\\\"call\\\":0,\\\"noCard\\\":0,\\\"number\\\":\\\"+34635607930\\\",\\\"enable\\\":1,\\\"sms\\\":0,\\\"index\\\":0}}\\r\\n                                case '0':\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.length < 6) { //if no telephone defined\\r\\n                                        tel = '';\\r\\n                                    }\\r\\n                                    report = hex2bin(value.substring(0, 2)); // To find report mode Call &data or DAta only\\r\\n                                    AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                                    AddValue(codeValues, \\\"ReportMode\\\", report.substring(2, 3));\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.ReportMode, report.substring(2, 3));\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.ReportMode);\\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                                    if (tel.length < 6) { //if no telephone defined\\r\\n                                        tel = '';\\r\\n                                    }\\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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 '55': // Tilt Angle Alert\\r\\n                            //[Value]:0A 00 1E 00\\r\\n                            //{\\\"tiltAlert\\\":{\\\"angle\\\":30,\\\"time\\\":10,\\\"status\\\":0,\\\"dial\\\":0}}\\r\\n                            var angle = hexToDecimal(value.substring(4, 6));\\r\\n                            var timeout = hexToDecimal(value.substring(0, 2));\\r\\n                            var status = hexToDecimal(value.substring(6, 8));\\r\\n                            if (status == 0) angle = 0;\\r\\n                            //var alertSetting = angle;\\r\\n                            //imei = serverParams.Imei;\\r\\n                            //messageForReceiver = (`Sentry;ACK-TILTANG;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"tiltangle\\\", angle);\\r\\n                            AddValue(codeValues, \\\"tiltimeout\\\", timeout);\\r\\n                            AddValue(codeValues, \\\"tiltstatus\\\", status);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltTimeout, timeout);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltAngle, angle);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltTimeout);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltAngle);\\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 = (`Sentry;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.ManDownSettings, sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.EnableDisableManDownSettings, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.Sensitivity, sesibityOptionValue);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.EnableDisableManDownSettings);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.Sensitivity);\\r\\n                            break;\\r\\n                        case '57': // Welfare\\r\\n                            // [Value]:10 0E 00 80 58 02 00 80\\r\\n                            //{\\\"welfareAlert\\\":{\\\"time\\\":600,\\\"value\\\":3600,\\\"status\\\":1,\\\"dial\\\":1}}\\r\\n                            var welfareStatus = hex2bin(value.substring(6, 8)); // check status\\r\\n                            var welfareValue = hexToDecimal(changeEndianness(value.substring(0, 6)));\\r\\n                            var welfareTime = hexToDecimal(changeEndianness(value.substring(8, 14)));\\r\\n                            var enalbleDisable = '';\\r\\n                            if ((configs.ReadState.Charging == 'true') && (configs.Welfare.Mode == '1') && (configs.Welfare.EnableDisableWelfare == 'true')) { // Force Read to enable welfare when device is charging in recurrent mode\\r\\n                                var sensibility = 'Enable, '\\r\\n                                enalbleDisable = '1'\\r\\n                            } else {\\r\\n                                if (welfareStatus.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                            };\\r\\n                            //var imei = serverParams.Imei;\\r\\n                            //messageForReceiver = (`Sentry;ACK-WELFALERT;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            sensibility += ', ' + welfareValue / 60;\\r\\n                            sensibility += ', ' + welfareTime / 60;\\r\\n                            AddValue(codeValues, \\\"welfare\\\", sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.EnableDisableReadWelfare, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Prealarm, welfareTime / 60);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Timeout, welfareValue / 60);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.EnableDisableReadWelfare);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Prealarm);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Timeout);\\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 = (`Sentry;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 '75': // Extra Enable control   Welfare Mode\\r\\n                            //[Value]:80 00 00 10  last two digit for new/old welfare\\r\\n                            //{\\\"extraControl\\\":{\\\"bit29\\\":0,\\\"bit27\\\":0,\\\"bit28\\\":1,\\\"bit25\\\":0,\\\"bit26\\\":0,\\\"flagValue\\\":268435584,\\\"bit23\\\":0,\\\"bit24\\\":0,\\\"bit21\\\":0,\\\"bit22\\\":0,\\\"bit20\\\":0,\\\"bit9\\\":0,\\\"bit18\\\":0,\\\"bit19\\\":0,\\\"bit7\\\":1,\\\"bit16\\\":0,\\\"bit8\\\":0,\\\"bit17\\\":0,\\\"bit5\\\":0,\\\"bit14\\\":0,\\\"bit6\\\":0,\\\"bit15\\\":0,\\\"bit3\\\":0,\\\"bit4\\\":0,\\\"bit1\\\":0,\\\"bit2\\\":0,\\\"bit0\\\":0,\\\"bit12\\\":0,\\\"bit13\\\":0,\\\"bit10\\\":0,\\\"bit11\\\":0,\\\"bit30\\\":0,\\\"bit31\\\":0}}\\r\\n                            var extraStatus = hex2bin(value.substring(6, 7)).substring(7, 8);\\r\\n                            //if (extraStatus.substring(7, 8) == '1') {\\r\\n                            //    extra += ' Enable, '\\r\\n                            //} else {\\r\\n                            //    extra += ' 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, \\\"welfare Mode\\\", extraStatus);\\r\\n                            // messageForReceiver = (`Sentry;ACK-EXTRA;${imei};`);\\r\\n                            // sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Mode, extraStatus);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Mode);\\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 = (`Sentry;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 = (`Sentry;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 = (`Sentry-${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 = (`Sentry-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 = (`Sentry-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 = (`Sentry-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":1744060697},{"Type":1,"NewValue":"{\"Id\":362,\"Name\":\"Access PS Sentry\",\"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    // Sentry protocol - please see variables and typical values in order below\\r\\n    // Sentry-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    // Sentry-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 N.\\r\\n    // Created: 01/01/2025\\r\\n    // Last modified: 14/02/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', 'Sentry');\\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 = (`Sentry-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 'BATCN': // Battery Charging - On\\r\\n                AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                configsToAck.push(configIds.ReadState.Charging);\\r\\n                //configs.AlertSettings.Welfare.Mode\\r\\n                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'false');\\r\\n                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'true');\\r\\n                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'false');\\r\\n                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                }\\r\\n                break;\\r\\n            case 'BATCF': // Battery Charging - Off\\r\\n                AddValue(configsToUpdate, configIds.ReadState.Charging, 'false');\\r\\n                configsToAck.push(configIds.ReadState.Charging);\\r\\n                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'true');\\r\\n                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'false');\\r\\n                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'true');\\r\\n                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                }\\r\\n                break;\\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 Sentry-')) {\\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 = (`Sentry-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 = (`Sentry;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 = (`Sentry;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 = (`Sentry-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    // 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 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\\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  ¿qué es fall OFF?\\r\\n                            if ((alarmCodeExtInt & 1) == 1) {\\r\\n                                var alarm = 'ALF-C'; // Fall-DownAlertending\\r\\n                            }\\r\\n                            // Welfare Check-out\\r\\n                            else if ((alarmCodeExtInt & 2) == 2) {\\r\\n                                var alarm = 'WSTP';\\r\\n                                if (configs.Welfare.Mode == '1') {\\r\\n                                    info = 'Recurrent';\\r\\n                                } else info = 'Amber';\\r\\n                            }\\r\\n                            //Geo 5 in\\r\\n                            //else if ((alarmCodeInt & 16) == 16) {\\r\\n                            //    var alarm = 'BATL';\\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 Alert\\r\\n                            else if ((alarmCodeInt & 8) == 8) {\\r\\n                                var alarm = 'TLT';\\r\\n                            }\\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 Alert\\r\\n                            else if ((alarmCodeInt & 256) == 256) {\\r\\n                                var alarm = 'PWRF';\\r\\n                            }\\r\\n                            //Power On Alert\\r\\n                            else if ((alarmCodeInt & 512) == 512) {\\r\\n                                var alarm = 'PWRN';\\r\\n                            }\\r\\n                            //Motion Alert\\r\\n                            else if ((alarmCodeInt & 1024) == 1024) {\\r\\n                                var alarm = 'ALMOV';\\r\\n                            }\\r\\n                            //No Motion Alert\\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                            }\\r\\n                            // Side call button 1\\r\\n                            else if ((alarmCodeInt & 8192) == 8192) {\\r\\n                                var alarm = 'Side1';\\r\\n                            }\\r\\n                            // Side call button 2\\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                                /*AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                                configsToAck.push(configIds.ReadState.Charging);\\r\\n                                //configs.AlertSettings.Welfare.Mode\\r\\n                                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'false');\\r\\n                                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'true');\\r\\n                                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'false');\\r\\n                                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                                }*/\\r\\n                            }\\r\\n                            //Battery no charging\\r\\n                            else if ((alarmCodeInt & 65536) == 65536) {\\r\\n                                var alarm = 'BATCF';\\r\\n                                /* AddValue(configsToUpdate, configIds.ReadState.Charging, 'false');\\r\\n                                 configsToAck.push(configIds.ReadState.Charging);\\r\\n                                 if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                                     AddValue(configsToUpdate, configIds.ReadState.Welfare, 'true');\\r\\n                                     //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'false');\\r\\n                                     AddConfig(configsToSend, configIds.ReadState.Welfare, 'true');\\r\\n                                     configsToAck.push(configIds.ReadState.Welfare);\\r\\n                                 }*/\\r\\n                            }\\r\\n                            //Alert End\\r\\n                            else if ((alarmCodeInt & 131072) == 131072) {\\r\\n                                var alarm = 'ALA-F';\\r\\n                                if (configs.Welfare.Mode == '1') {\\r\\n                                    info = 'Recurrent';\\r\\n                                } else info = 'Amber';\\r\\n                            }\\r\\n                            //Amber Alert ON    Don`t know the dfference between ALA and ALA-O\\r\\n                            else if ((alarmCodeInt & 262144) == 262144) {\\r\\n                                var alarm = 'ALA';\\r\\n                            }\\r\\n                            // welfare check in\\r\\n                            else if ((alarmCodeInt & 524288) == 524288) {\\r\\n                                var alarm = 'WTS';\\r\\n                                if (configs.Welfare.Mode == '1') {\\r\\n                                    info = 'Recurrent';\\r\\n                                } else info = 'Amber';\\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\\r\\n                            else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n                                var alarm = 'ALA-W';\\r\\n                                if (configs.Welfare.Mode == '1') {\\r\\n                                    info = 'Recurrent';\\r\\n                                } else info = 'Amber';\\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 != '64') {\\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 != '64') {\\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 = (`Sentry-${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 = (`Sentry-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                            if ((statusInt & 16) == 16) {\\r\\n                                statusDevice += 'Charging,';\\r\\n                                // AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                                // configsToAck.push(configIds.ReadState.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 != '64') {\\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 = (`Sentry-${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 != '64') {\\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 = (`Sentry-${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 = (`Sentry-${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 = (`Sentry-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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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                            var report;\\r\\n                            switch (contactNumber) {\\r\\n                                // Emergency Number\\r\\n                                // [Value]:80 2B 33 34 36 33 35 36 30 37 39 33 30\\r\\n                                //{\\\"number\\\":{\\\"call\\\":0,\\\"noCard\\\":0,\\\"number\\\":\\\"+34635607930\\\",\\\"enable\\\":1,\\\"sms\\\":0,\\\"index\\\":0}}\\r\\n                                case '0':\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.length < 6) { //if no telephone defined\\r\\n                                        tel = '';\\r\\n                                    }\\r\\n                                    report = hex2bin(value.substring(0, 2)); // To find report mode Call &data or DAta only\\r\\n                                    AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                                    AddValue(codeValues, \\\"ReportMode\\\", report.substring(2, 3));\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.ReportMode, report.substring(2, 3));\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.ReportMode);\\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                                    if (tel.length < 6) { //if no telephone defined\\r\\n                                        tel = '';\\r\\n                                    }\\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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 '55': // Tilt Angle Alert\\r\\n                            //[Value]:0A 00 1E 00\\r\\n                            //{\\\"tiltAlert\\\":{\\\"angle\\\":30,\\\"time\\\":10,\\\"status\\\":0,\\\"dial\\\":0}}\\r\\n                            var angle = hexToDecimal(value.substring(4, 6));\\r\\n                            var timeout = hexToDecimal(value.substring(0, 2));\\r\\n                            var status = hexToDecimal(value.substring(6, 8));\\r\\n                            if (status == 0) angle = 0;\\r\\n                            //var alertSetting = angle;\\r\\n                            //imei = serverParams.Imei;\\r\\n                            //messageForReceiver = (`Sentry;ACK-TILTANG;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"tiltangle\\\", angle);\\r\\n                            AddValue(codeValues, \\\"tiltimeout\\\", timeout);\\r\\n                            AddValue(codeValues, \\\"tiltstatus\\\", status);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltTimeout, timeout);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltAngle, angle);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltTimeout);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltAngle);\\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 = (`Sentry;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.ManDownSettings, sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.EnableDisableManDownSettings, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.Sensitivity, sesibityOptionValue);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.EnableDisableManDownSettings);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.Sensitivity);\\r\\n                            break;\\r\\n                        case '57': // Welfare\\r\\n                            // [Value]:10 0E 00 80 58 02 00 80\\r\\n                            //{\\\"welfareAlert\\\":{\\\"time\\\":600,\\\"value\\\":3600,\\\"status\\\":1,\\\"dial\\\":1}}\\r\\n                            var welfareStatus = hex2bin(value.substring(6, 8)); // check status\\r\\n                            var welfareValue = hexToDecimal(changeEndianness(value.substring(0, 6)));\\r\\n                            var welfareTime = hexToDecimal(changeEndianness(value.substring(8, 14)));\\r\\n                            var enalbleDisable = '';\\r\\n                            if ((configs.ReadState.Charging == 'true') && (configs.Welfare.Mode == '1') && (configs.Welfare.EnableDisableWelfare == 'true')) { // Force Read to enable welfare when device is charging in recurrent mode\\r\\n                                var sensibility = 'Enable, '\\r\\n                                enalbleDisable = '1'\\r\\n                            } else {\\r\\n                                if (welfareStatus.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                            };\\r\\n                            //var imei = serverParams.Imei;\\r\\n                            //messageForReceiver = (`Sentry;ACK-WELFALERT;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            sensibility += ', ' + welfareValue / 60;\\r\\n                            sensibility += ', ' + welfareTime / 60;\\r\\n                            AddValue(codeValues, \\\"welfare\\\", sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.EnableDisableReadWelfare, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Prealarm, welfareTime / 60);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Timeout, welfareValue / 60);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.EnableDisableReadWelfare);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Prealarm);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Timeout);\\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 = (`Sentry;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 '75': // Extra Enable control   Welfare Mode\\r\\n                            //[Value]:80 00 00 10  last two digit for new/old welfare\\r\\n                            //{\\\"extraControl\\\":{\\\"bit29\\\":0,\\\"bit27\\\":0,\\\"bit28\\\":1,\\\"bit25\\\":0,\\\"bit26\\\":0,\\\"flagValue\\\":268435584,\\\"bit23\\\":0,\\\"bit24\\\":0,\\\"bit21\\\":0,\\\"bit22\\\":0,\\\"bit20\\\":0,\\\"bit9\\\":0,\\\"bit18\\\":0,\\\"bit19\\\":0,\\\"bit7\\\":1,\\\"bit16\\\":0,\\\"bit8\\\":0,\\\"bit17\\\":0,\\\"bit5\\\":0,\\\"bit14\\\":0,\\\"bit6\\\":0,\\\"bit15\\\":0,\\\"bit3\\\":0,\\\"bit4\\\":0,\\\"bit1\\\":0,\\\"bit2\\\":0,\\\"bit0\\\":0,\\\"bit12\\\":0,\\\"bit13\\\":0,\\\"bit10\\\":0,\\\"bit11\\\":0,\\\"bit30\\\":0,\\\"bit31\\\":0}}\\r\\n                            var extraStatus = hex2bin(value.substring(6, 7)).substring(7, 8);\\r\\n                            //if (extraStatus.substring(7, 8) == '1') {\\r\\n                            //    extra += ' Enable, '\\r\\n                            //} else {\\r\\n                            //    extra += ' 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, \\\"welfare Mode\\\", extraStatus);\\r\\n                            // messageForReceiver = (`Sentry;ACK-EXTRA;${imei};`);\\r\\n                            // sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Mode, extraStatus);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Mode);\\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 = (`Sentry;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 = (`Sentry;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 = (`Sentry-${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 = (`Sentry-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 = (`Sentry-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 = (`Sentry-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":1744102555},{"Type":1,"NewValue":"{\"Id\":362,\"Name\":\"Access PS Sentry\",\"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    // Sentry protocol - please see variables and typical values in order below\\n    // Sentry-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    // Sentry-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 N.\\n    // Created: 01/01/2025\\n    // Last modified: 14/02/2025\\n    //\\n    ///////////////////////////////////////////////////////////////////////////////\\n    if (typeof localTesting === \\\"undefined\\\") {\\n        var 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', 'Sentry');\\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 = (`Sentry-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 'BATCN': // Battery Charging - On\\n                AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\n                configsToAck.push(configIds.ReadState.Charging);\\n                //configs.AlertSettings.Welfare.Mode\\n                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\n                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'false');\\n                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'true');\\n                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'false');\\n                    configsToAck.push(configIds.ReadState.Welfare);\\n                }\\n                break;\\n            case 'BATCF': // Battery Charging - Off\\n                AddValue(configsToUpdate, configIds.ReadState.Charging, 'false');\\n                configsToAck.push(configIds.ReadState.Charging);\\n                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\n                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'true');\\n                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'false');\\n                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'true');\\n                    configsToAck.push(configIds.ReadState.Welfare);\\n                }\\n                break;\\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 Sentry-')) {\\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 = (`Sentry-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 = (`Sentry;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 = (`Sentry;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 = (`Sentry-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    var 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    console.log(dataToReceiver);\\n    // end of main operation\\n    // define functions used in operation\\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\\n    function AddConfig(codeValueArray, configName, newvalue) {\\n        if (newvalue !== undefined) { // don't add if newvalue is undefined\\n            var cvpair = {\\n                'code': configName,\\n                'value': newvalue, // ?  newvalue : \\\"Not Defined\\\" \\n                'forced': true\\n            };\\n            codeValueArray.push(cvpair);\\n        };\\n    }\\n\\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 = hex_to_ascii(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  ¿qué es fall OFF?\\n                            if ((alarmCodeExtInt & 1) == 1) {\\n                                var alarm = 'ALF-C'; // Fall-DownAlertending\\n                            }\\n                            // Welfare Check-out\\n                            else if ((alarmCodeExtInt & 2) == 2) {\\n                                var alarm = 'WSTP';\\n                                if (configs.Welfare !== undefined) {\\n                                    if (configs.Welfare.Mode == '1') {\\n                                        info = 'Recurrent';\\n                                    } else info = 'Amber';\\n                                }\\n                            }\\n                            //Geo 5 in\\n                            //else if ((alarmCodeInt & 16) == 16) {\\n                            //    var alarm = 'BATL';\\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 Alert\\n                            else if ((alarmCodeInt & 8) == 8) {\\n                                var alarm = 'TLT';\\n                            }\\n                            // Geo IN - OUT\\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 Alert\\n                            else if ((alarmCodeInt & 256) == 256) {\\n                                var alarm = 'PWRF';\\n                            }\\n                            //Power On Alert\\n                            else if ((alarmCodeInt & 512) == 512) {\\n                                var alarm = 'PWRN';\\n                            }\\n                            //Motion Alert\\n                            else if ((alarmCodeInt & 1024) == 1024) {\\n                                var alarm = 'ALMOV';\\n                            }\\n                            //No Motion Alert\\n                            else if ((alarmCodeInt & 2048) == 2048) {\\n                                var alarm = 'ALNM';\\n                            }\\n                            //SOS\\n                            else if ((alarmCodeInt & 4096) == 4096) {\\n                                var alarm = 'ALSOS';\\n                            }\\n                            // Side call button 1\\n                            else if ((alarmCodeInt & 8192) == 8192) {\\n                                var alarm = 'Side1';\\n                            }\\n                            // Side call button 2\\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                                /*AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\n                                configsToAck.push(configIds.ReadState.Charging);\\n                                //configs.AlertSettings.Welfare.Mode\\n                                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\n                                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'false');\\n                                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'true');\\n                                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'false');\\n                                    configsToAck.push(configIds.ReadState.Welfare);\\n                                }*/\\n                            }\\n                            //Battery no charging\\n                            else if ((alarmCodeInt & 65536) == 65536) {\\n                                var alarm = 'BATCF';\\n                                /* AddValue(configsToUpdate, configIds.ReadState.Charging, 'false');\\n                                 configsToAck.push(configIds.ReadState.Charging);\\n                                 if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\n                                     AddValue(configsToUpdate, configIds.ReadState.Welfare, 'true');\\n                                     //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'false');\\n                                     AddConfig(configsToSend, configIds.ReadState.Welfare, 'true');\\n                                     configsToAck.push(configIds.ReadState.Welfare);\\n                                 }*/\\n                            }\\n                            //Alert End\\n                            else if ((alarmCodeInt & 131072) == 131072) {\\n                                var alarm = 'ALA-F';\\n                                if (configs.Welfare.Mode == '1') {\\n                                    info = 'Recurrent';\\n                                } else info = 'Amber';\\n                            }\\n                            //Amber Alert ON    Don`t know the dfference between ALA and ALA-O\\n                            else if ((alarmCodeInt & 262144) == 262144) {\\n                                var alarm = 'ALA';\\n                            }\\n                            // welfare check in\\n                            else if ((alarmCodeInt & 524288) == 524288) {\\n                                var alarm = 'WTS';\\n                                if (configs.Welfare.Mode == '1') {\\n                                    info = 'Recurrent';\\n                                } else info = 'Amber';\\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\\n                            else if ((alarmCodeInt & 4194304) == 4194304) {\\n                                var alarm = 'ALA-W';\\n                                if (configs.Welfare.Mode == '1') {\\n                                    info = 'Recurrent';\\n                                } else info = 'Amber';\\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 != '64') {\\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                            //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 = hex_to_ascii(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 != '64') {\\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 = (`Sentry-${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 = (`Sentry-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                            // HardCode to fix possible issue in protocol\\n                            // event_time = timestamp; \\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                            if ((statusInt & 16) == 16) {\\n                                statusDevice += 'Charging,';\\n                                // AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\n                                // configsToAck.push(configIds.ReadState.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) { //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 = hex2bin(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 = hex_to_ascii(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 = hex_to_ascii(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 = hex_to_ascii(value.substring(22, 22 + (2 * desc_leng)));\\n                                //descr = hex_to_ascii(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 = hex_to_ascii(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 != '64') {\\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 = (`Sentry-${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 != '64') {\\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 = (`Sentry-${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                //  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                // \\\"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,;\\\",\\n                if (alarmCode) {\\n                    messageForReceiver = (`Sentry-${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 = (`Sentry-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 = (`Sentry;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 = hex_to_ascii(value);\\n                            imei = serverParams.Imei;\\n                            AddValue(codeValues, \\\"imei\\\", imei);\\n                            AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\n                            messageForReceiver = (`Sentry;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 = (`Sentry;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 = hex_to_ascii(value.substring(0, value.length));\\n                            //var workMode = hexToDecimal(value);\\n                            //var workMode = hex_to_ascii(value.substring(0, value.length));\\n                            var workMode = 1234; // + value + \\\"end\\\";\\n                            //var workModeVal = 9;\\n                            //workMode = 'test10';\\n                            imei = serverParams.Imei;\\n                            messageForReceiver = (`Sentry;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 = hex_to_ascii(value.substring(0, value.length));\\n                            imei = serverParams.Imei;\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\n                            messageForReceiver = (`Sentry;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 = hex2bin(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 = hex2bin(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 = hex2bin(value.substring(0, 2)) + hex2bin(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                            var report;\\n                            switch (contactNumber) {\\n                                // Emergency Number\\n                                // [Value]:80 2B 33 34 36 33 35 36 30 37 39 33 30\\n                                //{\\\"number\\\":{\\\"call\\\":0,\\\"noCard\\\":0,\\\"number\\\":\\\"+34635607930\\\",\\\"enable\\\":1,\\\"sms\\\":0,\\\"index\\\":0}}\\n                                case '0':\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\n                                    if (tel.length < 6) { //if no telephone defined\\n                                        tel = '';\\n                                    }\\n                                    report = hex2bin(value.substring(0, 2)); // To find report mode Call &data or DAta only\\n                                    AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\n                                    AddValue(codeValues, \\\"ReportMode\\\", report.substring(2, 3));\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.ReportMode, report.substring(2, 3));\\n                                    configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\n                                    configsToAck.push(configIds.ReadAlertSettings.ReportMode);\\n                                    break;\\n                                    // Speed Dial Number\\n                                case '1':\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\n                                    if (tel.length < 6) { //if no telephone defined\\n                                        tel = '';\\n                                    }\\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 = hex_to_ascii(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 = hex_to_ascii(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 = hex_to_ascii(value.substring(0, value.length));\\n                            imei = serverParams.Imei;\\n                            break;\\n                        case '41': // APN Username\\n                            //no ACK need\\n                            //apn = apn + ',' + hex_to_ascii(value.substring(0, value.length));\\n                            break;\\n                        case '42': // APN Password\\n                            //no ACK need\\n                            //apn = apn + ',' + hex_to_ascii(value.substring(0, value.length));\\n                            messageForReceiver = (`Sentry;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 = hex_to_ascii(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 = (`Sentry;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 = (`Sentry;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 = hex2bin(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 = (`Sentry;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 '55': // Tilt Angle Alert\\n                            //[Value]:0A 00 1E 00\\n                            //{\\\"tiltAlert\\\":{\\\"angle\\\":30,\\\"time\\\":10,\\\"status\\\":0,\\\"dial\\\":0}}\\n                            var angle = hexToDecimal(value.substring(4, 6));\\n                            var timeout = hexToDecimal(value.substring(0, 2));\\n                            var status = hexToDecimal(value.substring(6, 8));\\n                            if (status == 0) angle = 0;\\n                            //var alertSetting = angle;\\n                            //imei = serverParams.Imei;\\n                            //messageForReceiver = (`Sentry;ACK-TILTANG;${imei};`);\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\n                            AddValue(codeValues, \\\"tiltangle\\\", angle);\\n                            AddValue(codeValues, \\\"tiltimeout\\\", timeout);\\n                            AddValue(codeValues, \\\"tiltstatus\\\", status);\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltTimeout, timeout);\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltAngle, angle);\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltTimeout);\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltAngle);\\n                            break;\\n                        case '56': //Fall down sensibility\\n                            // '00001100'\\n                            var fallStatus = hex2bin(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 = (`Sentry;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.ManDownSettings, sensibility);\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.EnableDisableManDownSettings, enalbleDisable);\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.Sensitivity, sesibityOptionValue);\\n                            //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\n                            configsToAck.push(configIds.ReadManDownSettings.EnableDisableManDownSettings);\\n                            configsToAck.push(configIds.ReadManDownSettings.Sensitivity);\\n                            break;\\n                        case '57': // Welfare\\n                            // [Value]:10 0E 00 80 58 02 00 80\\n                            //{\\\"welfareAlert\\\":{\\\"time\\\":600,\\\"value\\\":3600,\\\"status\\\":1,\\\"dial\\\":1}}\\n                            var welfareStatus = hex2bin(value.substring(6, 8)); // check status\\n                            var welfareValue = hexToDecimal(changeEndianness(value.substring(0, 6)));\\n                            var welfareTime = hexToDecimal(changeEndianness(value.substring(8, 14)));\\n                            var enalbleDisable = '';\\n                            if ((configs.ReadState.Charging == 'true') && (configs.Welfare.Mode == '1') && (configs.Welfare.EnableDisableWelfare == 'true')) { // Force Read to enable welfare when device is charging in recurrent mode\\n                                var sensibility = 'Enable, '\\n                                enalbleDisable = '1'\\n                            } else {\\n                                if (welfareStatus.substring(0, 1) == '1') {\\n                                    var sensibility = 'Enable, '\\n                                    enalbleDisable = '1'\\n                                } else {\\n                                    var sensibility = 'Disable, '\\n                                }\\n                            };\\n                            //var imei = serverParams.Imei;\\n                            //messageForReceiver = (`Sentry;ACK-WELFALERT;${imei};`);\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\n                            sensibility += ', ' + welfareValue / 60;\\n                            sensibility += ', ' + welfareTime / 60;\\n                            AddValue(codeValues, \\\"welfare\\\", sensibility);\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.EnableDisableReadWelfare, enalbleDisable);\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Prealarm, welfareTime / 60);\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Timeout, welfareValue / 60);\\n                            configsToAck.push(configIds.ReadWelfareSettings.EnableDisableReadWelfare);\\n                            configsToAck.push(configIds.ReadWelfareSettings.Prealarm);\\n                            configsToAck.push(configIds.ReadWelfareSettings.Timeout);\\n                            break;\\n                        case '73': //BeaconList\\n                            var beaconNumber = hexToDecimal(value.substring(1, 2));\\n                            var beaconStatus = hex2bin(value.substring(0, 1));\\n                            //if (beaconStatus.substring(4, 5) == '1') {\\n                            //    homeBeacon += ' Enable, '\\n                            //} else {\\n                            //    homeBeacon += ' Disable, '\\n                            //};\\n                            beaconStatus = hex_to_ascii(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 = (`Sentry;ACK-GDATA;${imei};`);\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\n                            AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\n                            configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\n                            break;\\n                        case '75': // Extra Enable control   Welfare Mode\\n                            //[Value]:80 00 00 10  last two digit for new/old welfare\\n                            //{\\\"extraControl\\\":{\\\"bit29\\\":0,\\\"bit27\\\":0,\\\"bit28\\\":1,\\\"bit25\\\":0,\\\"bit26\\\":0,\\\"flagValue\\\":268435584,\\\"bit23\\\":0,\\\"bit24\\\":0,\\\"bit21\\\":0,\\\"bit22\\\":0,\\\"bit20\\\":0,\\\"bit9\\\":0,\\\"bit18\\\":0,\\\"bit19\\\":0,\\\"bit7\\\":1,\\\"bit16\\\":0,\\\"bit8\\\":0,\\\"bit17\\\":0,\\\"bit5\\\":0,\\\"bit14\\\":0,\\\"bit6\\\":0,\\\"bit15\\\":0,\\\"bit3\\\":0,\\\"bit4\\\":0,\\\"bit1\\\":0,\\\"bit2\\\":0,\\\"bit0\\\":0,\\\"bit12\\\":0,\\\"bit13\\\":0,\\\"bit10\\\":0,\\\"bit11\\\":0,\\\"bit30\\\":0,\\\"bit31\\\":0}}\\n                            var extraStatus = hex2bin(value.substring(6, 7)).substring(7, 8);\\n                            //if (extraStatus.substring(7, 8) == '1') {\\n                            //    extra += ' Enable, '\\n                            //} else {\\n                            //    extra += ' Disable, '\\n                            //};\\n                            //beaconStatus = hex_to_ascii(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, \\\"welfare Mode\\\", extraStatus);\\n                            // messageForReceiver = (`Sentry;ACK-EXTRA;${imei};`);\\n                            // sendMessageToLocalhostNoWait(messageForReceiver);\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Mode, extraStatus);\\n                            configsToAck.push(configIds.ReadWelfareSettings.Mode);\\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 = hex_to_ascii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\n                                var wifiPassword = hex_to_ascii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\n                                var imei = serverParams.Imei;\\n                                messageForReceiver = (`Sentry;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 = hex2bin(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 = (`Sentry;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 = hex_to_ascii(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 = hex_to_ascii(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 = hex2bin(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 = hex_to_ascii(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 = (`Sentry-${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 = (`Sentry-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 = (`Sentry-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 = (`Sentry-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 = hex_to_ascii(rawFromBytes.substring(i, i + 30));\\n                AddValue(codeValues, \\\"imei\\\", imei);\\n            }\\n        }\\n    }\\n\\n    function ascii_to_hexa(str) { // ascii to hex \\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\\n    function 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\\n    function 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    }\\n\\n    function hex2bin(hex) { //\\n        return (parseInt(hex, 16).toString(2)).padStart(8, '0');\\n    }\\n\\n    function calculateCheckSum(payloadData) { // check if payload checksum is valid\\n        var checksum = byteStringToByteArray(payloadData);\\n        checksum = crc16byte(checksum);\\n        checksum = decimalToHex(checksum);\\n        checksum = ('0000' + checksum).slice(-4).toUpperCase();\\n        return changeEndianness(checksum);\\n    }\\n\\n    function 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\\n    function debug(str) { // write debug info to console log, if localTesting\\n        if (localTesting === \\\"True\\\") {\\n            console.log(str);\\n        }\\n    }\\n\\n    function decimalToHex(x) { // decimal to hex\\n        x = x.toString(16).toUpperCase();\\n        return x;\\n    }\\n\\n    function hex_to_ascii(str1) { // Hex to Ascii \\n        var hex = str1.toString();\\n        var str = '';\\n        for (var n = 0; n < hex.length; n += 2) {\\n            str += String.fromCharCode(parseInt(hex.substr(n, 2), 16));\\n        }\\n        return str;\\n    }\\n\\n    function hexToDecimalSigned(hex) { // hex to decimal\\n        if (hex.length % 2 != 0) {\\n            hex = \\\"0\\\" + hex;\\n        }\\n        var num = parseInt(hex, 16);\\n        var maxVal = Math.pow(2, hex.length / 2 * 8);\\n        if (num > maxVal / 2 - 1) {\\n            num = num - maxVal;\\n        }\\n        return num;\\n    }\\n\\n    function hexToDecimal(x) {\\n        x = parseInt(x, 16);\\n        return x;\\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 acceptance server the message ... ');\\n            console.log(str);\\n            server = '52.174.17.77';\\n        } else {\\n            server = '127.0.0.1';\\n        }\\n        var c = net.createConnection(5678, server);\\n        c.on('error', function(error) {\\n            c = net.createConnection(5678, server);\\n        });\\n        c.write(`${str}`);\\n        c.end();\\n    }\\n    // modify to return the object that contains your data\\n    return dataToReceiver;\\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":1744107297},{"Type":1,"NewValue":"{\"Id\":362,\"Name\":\"Access PS Sentry\",\"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    // Sentry protocol - please see variables and typical values in order below\\n    // Sentry-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    // Sentry-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 N.\\n    // Created: 01/01/2025\\n    // Last modified: 14/02/2025\\n    //\\n    ///////////////////////////////////////////////////////////////////////////////\\n    if (typeof localTesting === \\\"undefined\\\") {\\n        var 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', 'Sentry');\\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 = (`Sentry-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 'BATCN': // Battery Charging - On\\n                AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\n                configsToAck.push(configIds.ReadState.Charging);\\n                //configs.AlertSettings.Welfare.Mode\\n                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\n                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'false');\\n                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'true');\\n                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'false');\\n                    configsToAck.push(configIds.ReadState.Welfare);\\n                }\\n                break;\\n            case 'BATCF': // Battery Charging - Off\\n                AddValue(configsToUpdate, configIds.ReadState.Charging, 'false');\\n                configsToAck.push(configIds.ReadState.Charging);\\n                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\n                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'true');\\n                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'false');\\n                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'true');\\n                    configsToAck.push(configIds.ReadState.Welfare);\\n                }\\n                break;\\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 Sentry-')) {\\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 = (`Sentry-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 = (`Sentry;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 = (`Sentry;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 = (`Sentry-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    var 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    console.log(dataToReceiver);\\n    // end of main operation\\n    // define functions used in operation\\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\\n    function AddConfig(codeValueArray, configName, newvalue) {\\n        if (newvalue !== undefined) { // don't add if newvalue is undefined\\n            var cvpair = {\\n                'code': configName,\\n                'value': newvalue, // ?  newvalue : \\\"Not Defined\\\" \\n                'forced': true\\n            };\\n            codeValueArray.push(cvpair);\\n        };\\n    }\\n\\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 = hex_to_ascii(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  ¿qué es fall OFF?\\n                            if ((alarmCodeExtInt & 1) == 1) {\\n                                var alarm = 'ALF-C'; // Fall-DownAlertending\\n                            }\\n                            // Welfare Check-out\\n                            else if ((alarmCodeExtInt & 2) == 2) {\\n                                var alarm = 'WSTP';\\n                                if (configs.Welfare !== undefined) {\\n                                    if (configs.Welfare.Mode == '1') {\\n                                        info = 'Recurrent';\\n                                    } else info = 'Amber';\\n                                }\\n                            }\\n                            //Geo 5 in\\n                            //else if ((alarmCodeInt & 16) == 16) {\\n                            //    var alarm = 'BATL';\\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 Alert\\n                            else if ((alarmCodeInt & 8) == 8) {\\n                                var alarm = 'TLT';\\n                            }\\n                            // Geo IN - OUT\\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 Alert\\n                            else if ((alarmCodeInt & 256) == 256) {\\n                                var alarm = 'PWRF';\\n                            }\\n                            //Power On Alert\\n                            else if ((alarmCodeInt & 512) == 512) {\\n                                var alarm = 'PWRN';\\n                            }\\n                            //Motion Alert\\n                            else if ((alarmCodeInt & 1024) == 1024) {\\n                                var alarm = 'ALMOV';\\n                            }\\n                            //No Motion Alert\\n                            else if ((alarmCodeInt & 2048) == 2048) {\\n                                var alarm = 'ALNM';\\n                            }\\n                            //SOS\\n                            else if ((alarmCodeInt & 4096) == 4096) {\\n                                var alarm = 'ALSOS';\\n                            }\\n                            // Side call button 1\\n                            else if ((alarmCodeInt & 8192) == 8192) {\\n                                var alarm = 'Side1';\\n                            }\\n                            // Side call button 2\\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                                /*AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\n                                configsToAck.push(configIds.ReadState.Charging);\\n                                //configs.AlertSettings.Welfare.Mode\\n                                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\n                                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'false');\\n                                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'true');\\n                                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'false');\\n                                    configsToAck.push(configIds.ReadState.Welfare);\\n                                }*/\\n                            }\\n                            //Battery no charging\\n                            else if ((alarmCodeInt & 65536) == 65536) {\\n                                var alarm = 'BATCF';\\n                                /* AddValue(configsToUpdate, configIds.ReadState.Charging, 'false');\\n                                 configsToAck.push(configIds.ReadState.Charging);\\n                                 if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\n                                     AddValue(configsToUpdate, configIds.ReadState.Welfare, 'true');\\n                                     //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'false');\\n                                     AddConfig(configsToSend, configIds.ReadState.Welfare, 'true');\\n                                     configsToAck.push(configIds.ReadState.Welfare);\\n                                 }*/\\n                            }\\n                            //Alert End\\n                            else if ((alarmCodeInt & 131072) == 131072) {\\n                                var alarm = 'ALA-F';\\n                                if (configs.Welfare.Mode == '1') {\\n                                    info = 'Recurrent';\\n                                } else info = 'Amber';\\n                            }\\n                            //Amber Alert ON    Don`t know the dfference between ALA and ALA-O\\n                            else if ((alarmCodeInt & 262144) == 262144) {\\n                                var alarm = 'ALA';\\n                            }\\n                            // welfare check in\\n                            else if ((alarmCodeInt & 524288) == 524288) {\\n                                var alarm = 'WTS';\\n                                if (configs.Welfare.Mode == '1') {\\n                                    info = 'Recurrent';\\n                                } else info = 'Amber';\\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\\n                            else if ((alarmCodeInt & 4194304) == 4194304) {\\n                                var alarm = 'ALA-W';\\n                                if (configs.Welfare.Mode == '1') {\\n                                    info = 'Recurrent';\\n                                } else info = 'Amber';\\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 != '64') {\\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                            //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 = hex_to_ascii(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 != '64') {\\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 = (`Sentry-${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 = (`Sentry-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                            // HardCode to fix possible issue in protocol\\n                            // event_time = timestamp; \\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                            if ((statusInt & 16) == 16) {\\n                                statusDevice += 'Charging,';\\n                                // AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\n                                // configsToAck.push(configIds.ReadState.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) { //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 = hex2bin(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 = hex_to_ascii(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 = hex_to_ascii(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 = hex_to_ascii(value.substring(22, 22 + (2 * desc_leng)));\\n                                //descr = hex_to_ascii(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 = hex_to_ascii(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 != '64') {\\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 = (`Sentry-${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 != '64') {\\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 = (`Sentry-${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                //  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                // \\\"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,;\\\",\\n                if (alarmCode) {\\n                    messageForReceiver = (`Sentry-${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 = (`Sentry-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 = (`Sentry;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 = hex_to_ascii(value);\\n                            imei = serverParams.Imei;\\n                            AddValue(codeValues, \\\"imei\\\", imei);\\n                            AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\n                            messageForReceiver = (`Sentry;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 = (`Sentry;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 = hex_to_ascii(value.substring(0, value.length));\\n                            //var workMode = hexToDecimal(value);\\n                            //var workMode = hex_to_ascii(value.substring(0, value.length));\\n                            var workMode = 1234; // + value + \\\"end\\\";\\n                            //var workModeVal = 9;\\n                            //workMode = 'test10';\\n                            imei = serverParams.Imei;\\n                            messageForReceiver = (`Sentry;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 = hex_to_ascii(value.substring(0, value.length));\\n                            imei = serverParams.Imei;\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\n                            messageForReceiver = (`Sentry;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 = hex2bin(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 = hex2bin(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 = hex2bin(value.substring(0, 2)) + hex2bin(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                            var report;\\n                            switch (contactNumber) {\\n                                // Emergency Number\\n                                // [Value]:80 2B 33 34 36 33 35 36 30 37 39 33 30\\n                                //{\\\"number\\\":{\\\"call\\\":0,\\\"noCard\\\":0,\\\"number\\\":\\\"+34635607930\\\",\\\"enable\\\":1,\\\"sms\\\":0,\\\"index\\\":0}}\\n                                case '0':\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\n                                    if (tel.length < 6) { //if no telephone defined\\n                                        tel = '';\\n                                    }\\n                                    report = hex2bin(value.substring(0, 2)); // To find report mode Call &data or DAta only\\n                                    AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\n                                    AddValue(codeValues, \\\"ReportMode\\\", report.substring(2, 3));\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.ReportMode, report.substring(2, 3));\\n                                    configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\n                                    configsToAck.push(configIds.ReadAlertSettings.ReportMode);\\n                                    break;\\n                                    // Speed Dial Number\\n                                case '1':\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\n                                    if (tel.length < 6) { //if no telephone defined\\n                                        tel = '';\\n                                    }\\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 = hex_to_ascii(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 = hex_to_ascii(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 = hex_to_ascii(value.substring(0, value.length));\\n                            imei = serverParams.Imei;\\n                            break;\\n                        case '41': // APN Username\\n                            //no ACK need\\n                            //apn = apn + ',' + hex_to_ascii(value.substring(0, value.length));\\n                            break;\\n                        case '42': // APN Password\\n                            //no ACK need\\n                            //apn = apn + ',' + hex_to_ascii(value.substring(0, value.length));\\n                            messageForReceiver = (`Sentry;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 = hex_to_ascii(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 = (`Sentry;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 = (`Sentry;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 = hex2bin(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 = (`Sentry;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 '55': // Tilt Angle Alert\\n                            //[Value]:0A 00 1E 00\\n                            //{\\\"tiltAlert\\\":{\\\"angle\\\":30,\\\"time\\\":10,\\\"status\\\":0,\\\"dial\\\":0}}\\n                            var angle = hexToDecimal(value.substring(4, 6));\\n                            var timeout = hexToDecimal(value.substring(0, 2));\\n                            var status = hexToDecimal(value.substring(6, 8));\\n                            if (status == 0) angle = 0;\\n                            //var alertSetting = angle;\\n                            //imei = serverParams.Imei;\\n                            //messageForReceiver = (`Sentry;ACK-TILTANG;${imei};`);\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\n                            AddValue(codeValues, \\\"tiltangle\\\", angle);\\n                            AddValue(codeValues, \\\"tiltimeout\\\", timeout);\\n                            AddValue(codeValues, \\\"tiltstatus\\\", status);\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltTimeout, timeout);\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltAngle, angle);\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltTimeout);\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltAngle);\\n                            break;\\n                        case '56': //Fall down sensibility\\n                            // '00001100'\\n                            var fallStatus = hex2bin(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 = (`Sentry;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.ManDownSettings, sensibility);\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.EnableDisableManDownSettings, enalbleDisable);\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.Sensitivity, sesibityOptionValue);\\n                            //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\n                            configsToAck.push(configIds.ReadManDownSettings.EnableDisableManDownSettings);\\n                            configsToAck.push(configIds.ReadManDownSettings.Sensitivity);\\n                            break;\\n                        case '57': // Welfare\\n                            // [Value]:10 0E 00 80 58 02 00 80\\n                            //{\\\"welfareAlert\\\":{\\\"time\\\":600,\\\"value\\\":3600,\\\"status\\\":1,\\\"dial\\\":1}}\\n                            var welfareStatus = hex2bin(value.substring(6, 8)); // check status\\n                            var welfareValue = hexToDecimal(changeEndianness(value.substring(0, 6)));\\n                            var welfareTime = hexToDecimal(changeEndianness(value.substring(8, 14)));\\n                            var enalbleDisable = '';\\n                            if ((configs.ReadState.Charging == 'true') && (configs.Welfare.Mode == '1') && (configs.Welfare.EnableDisableWelfare == 'true')) { // Force Read to enable welfare when device is charging in recurrent mode\\n                                var sensibility = 'Enable, '\\n                                enalbleDisable = '1'\\n                            } else {\\n                                if (welfareStatus.substring(0, 1) == '1') {\\n                                    var sensibility = 'Enable, '\\n                                    enalbleDisable = '1'\\n                                } else {\\n                                    var sensibility = 'Disable, '\\n                                }\\n                            };\\n                            //var imei = serverParams.Imei;\\n                            //messageForReceiver = (`Sentry;ACK-WELFALERT;${imei};`);\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\n                            sensibility += ', ' + welfareValue / 60;\\n                            sensibility += ', ' + welfareTime / 60;\\n                            AddValue(codeValues, \\\"welfare\\\", sensibility);\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.EnableDisableReadWelfare, enalbleDisable);\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Prealarm, welfareTime / 60);\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Timeout, welfareValue / 60);\\n                            configsToAck.push(configIds.ReadWelfareSettings.EnableDisableReadWelfare);\\n                            configsToAck.push(configIds.ReadWelfareSettings.Prealarm);\\n                            configsToAck.push(configIds.ReadWelfareSettings.Timeout);\\n                            break;\\n                        case '73': //BeaconList\\n                            var beaconNumber = hexToDecimal(value.substring(1, 2));\\n                            var beaconStatus = hex2bin(value.substring(0, 1));\\n                            //if (beaconStatus.substring(4, 5) == '1') {\\n                            //    homeBeacon += ' Enable, '\\n                            //} else {\\n                            //    homeBeacon += ' Disable, '\\n                            //};\\n                            beaconStatus = hex_to_ascii(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 = (`Sentry;ACK-GDATA;${imei};`);\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\n                            AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\n                            configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\n                            break;\\n                        case '75': // Extra Enable control   Welfare Mode\\n                            //[Value]:80 00 00 10  last two digit for new/old welfare\\n                            //{\\\"extraControl\\\":{\\\"bit29\\\":0,\\\"bit27\\\":0,\\\"bit28\\\":1,\\\"bit25\\\":0,\\\"bit26\\\":0,\\\"flagValue\\\":268435584,\\\"bit23\\\":0,\\\"bit24\\\":0,\\\"bit21\\\":0,\\\"bit22\\\":0,\\\"bit20\\\":0,\\\"bit9\\\":0,\\\"bit18\\\":0,\\\"bit19\\\":0,\\\"bit7\\\":1,\\\"bit16\\\":0,\\\"bit8\\\":0,\\\"bit17\\\":0,\\\"bit5\\\":0,\\\"bit14\\\":0,\\\"bit6\\\":0,\\\"bit15\\\":0,\\\"bit3\\\":0,\\\"bit4\\\":0,\\\"bit1\\\":0,\\\"bit2\\\":0,\\\"bit0\\\":0,\\\"bit12\\\":0,\\\"bit13\\\":0,\\\"bit10\\\":0,\\\"bit11\\\":0,\\\"bit30\\\":0,\\\"bit31\\\":0}}\\n                            var extraStatus = hex2bin(value.substring(6, 7)).substring(7, 8);\\n                            //if (extraStatus.substring(7, 8) == '1') {\\n                            //    extra += ' Enable, '\\n                            //} else {\\n                            //    extra += ' Disable, '\\n                            //};\\n                            //beaconStatus = hex_to_ascii(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, \\\"welfare Mode\\\", extraStatus);\\n                            // messageForReceiver = (`Sentry;ACK-EXTRA;${imei};`);\\n                            // sendMessageToLocalhostNoWait(messageForReceiver);\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Mode, extraStatus);\\n                            configsToAck.push(configIds.ReadWelfareSettings.Mode);\\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 = hex_to_ascii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\n                                var wifiPassword = hex_to_ascii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\n                                var imei = serverParams.Imei;\\n                                messageForReceiver = (`Sentry;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 = hex2bin(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 = (`Sentry;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 = hex_to_ascii(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 = hex_to_ascii(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 = hex2bin(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 = hex_to_ascii(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 = (`Sentry-${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 = (`Sentry-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 = (`Sentry-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 = (`Sentry-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 = hex_to_ascii(rawFromBytes.substring(i, i + 30));\\n                AddValue(codeValues, \\\"imei\\\", imei);\\n            }\\n        }\\n    }\\n\\n    function ascii_to_hexa(str) { // ascii to hex \\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\\n    function 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\\n    function 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    }\\n\\n    function hex2bin(hex) { //\\n        return (parseInt(hex, 16).toString(2)).padStart(8, '0');\\n    }\\n\\n    function calculateCheckSum(payloadData) { // check if payload checksum is valid\\n        var checksum = byteStringToByteArray(payloadData);\\n        checksum = crc16byte(checksum);\\n        checksum = decimalToHex(checksum);\\n        checksum = ('0000' + checksum).slice(-4).toUpperCase();\\n        return changeEndianness(checksum);\\n    }\\n\\n    function 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\\n    function debug(str) { // write debug info to console log, if localTesting\\n        if (localTesting === \\\"True\\\") {\\n            console.log(str);\\n        }\\n    }\\n\\n    function decimalToHex(x) { // decimal to hex\\n        x = x.toString(16).toUpperCase();\\n        return x;\\n    }\\n\\n    function hex_to_ascii(str1) { // Hex to Ascii \\n        var hex = str1.toString();\\n        var str = '';\\n        for (var n = 0; n < hex.length; n += 2) {\\n            str += String.fromCharCode(parseInt(hex.substr(n, 2), 16));\\n        }\\n        return str;\\n    }\\n\\n    function hexToDecimalSigned(hex) { // hex to decimal\\n        if (hex.length % 2 != 0) {\\n            hex = \\\"0\\\" + hex;\\n        }\\n        var num = parseInt(hex, 16);\\n        var maxVal = Math.pow(2, hex.length / 2 * 8);\\n        if (num > maxVal / 2 - 1) {\\n            num = num - maxVal;\\n        }\\n        return num;\\n    }\\n\\n    function hexToDecimal(x) {\\n        x = parseInt(x, 16);\\n        return x;\\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 acceptance server the message ... ');\\n            console.log(str);\\n            server = '52.174.17.77';\\n        } else {\\n            server = '127.0.0.1';\\n        }\\n        var c = net.createConnection(5678, server);\\n        c.on('error', function(error) {\\n            c = net.createConnection(5678, server);\\n        });\\n        c.write(`${str}`);\\n        c.end();\\n    }\\n    // modify to return the object that contains your data\\n    return dataToReceiver;\\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":1744107729},{"Type":1,"NewValue":"{\"Id\":362,\"Name\":\"Access PS Sentry\",\"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    // Sentry protocol - please see variables and typical values in order below\\n    // Sentry-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    // Sentry-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 N.\\n    // Created: 01/01/2025\\n    // Last modified: 14/02/2025\\n    //\\n    ///////////////////////////////////////////////////////////////////////////////\\n    if (typeof localTesting === \\\"undefined\\\") {\\n        var 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', 'Sentry');\\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 = (`Sentry-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 'BATCN': // Battery Charging - On\\n                AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\n                configsToAck.push(configIds.ReadState.Charging);\\n                //configs.AlertSettings.Welfare.Mode\\n                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\n                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'false');\\n                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'true');\\n                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'false');\\n                    configsToAck.push(configIds.ReadState.Welfare);\\n                }\\n                break;\\n            case 'BATCF': // Battery Charging - Off\\n                AddValue(configsToUpdate, configIds.ReadState.Charging, 'false');\\n                configsToAck.push(configIds.ReadState.Charging);\\n                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\n                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'true');\\n                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'false');\\n                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'true');\\n                    configsToAck.push(configIds.ReadState.Welfare);\\n                }\\n                break;\\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 Sentry-')) {\\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 = (`Sentry-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 = (`Sentry;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 = (`Sentry;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 = (`Sentry-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    var 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    console.log(dataToReceiver);\\n    // end of main operation\\n    // define functions used in operation\\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\\n    function AddConfig(codeValueArray, configName, newvalue) {\\n        if (newvalue !== undefined) { // don't add if newvalue is undefined\\n            var cvpair = {\\n                'code': configName,\\n                'value': newvalue, // ?  newvalue : \\\"Not Defined\\\" \\n                'forced': true\\n            };\\n            codeValueArray.push(cvpair);\\n        };\\n    }\\n\\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 = hex_to_ascii(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  ¿qué es fall OFF?\\n                            if ((alarmCodeExtInt & 1) == 1) {\\n                                var alarm = 'ALF-C'; // Fall-DownAlertending\\n                            }\\n                            // Welfare Check-out\\n                            else if ((alarmCodeExtInt & 2) == 2) {\\n                                var alarm = 'WSTP';\\n                                if (configs.Welfare !== undefined) {\\n                                    if (configs.Welfare.Mode == '1') {\\n                                        info = 'Recurrent';\\n                                    } else info = 'Amber';\\n                                }\\n                            }\\n                            //Geo 5 in\\n                            //else if ((alarmCodeInt & 16) == 16) {\\n                            //    var alarm = 'BATL';\\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 Alert\\n                            else if ((alarmCodeInt & 8) == 8) {\\n                                var alarm = 'TLT';\\n                            }\\n                            // Geo IN - OUT\\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 Alert\\n                            else if ((alarmCodeInt & 256) == 256) {\\n                                var alarm = 'PWRF';\\n                            }\\n                            //Power On Alert\\n                            else if ((alarmCodeInt & 512) == 512) {\\n                                var alarm = 'PWRN';\\n                            }\\n                            //Motion Alert\\n                            else if ((alarmCodeInt & 1024) == 1024) {\\n                                var alarm = 'ALMOV';\\n                            }\\n                            //No Motion Alert\\n                            else if ((alarmCodeInt & 2048) == 2048) {\\n                                var alarm = 'ALNM';\\n                            }\\n                            //SOS\\n                            else if ((alarmCodeInt & 4096) == 4096) {\\n                                var alarm = 'ALSOS';\\n                            }\\n                            // Side call button 1\\n                            else if ((alarmCodeInt & 8192) == 8192) {\\n                                var alarm = 'Side1';\\n                            }\\n                            // Side call button 2\\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                                /*AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\n                                configsToAck.push(configIds.ReadState.Charging);\\n                                //configs.AlertSettings.Welfare.Mode\\n                                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\n                                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'false');\\n                                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'true');\\n                                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'false');\\n                                    configsToAck.push(configIds.ReadState.Welfare);\\n                                }*/\\n                            }\\n                            //Battery no charging\\n                            else if ((alarmCodeInt & 65536) == 65536) {\\n                                var alarm = 'BATCF';\\n                                /* AddValue(configsToUpdate, configIds.ReadState.Charging, 'false');\\n                                 configsToAck.push(configIds.ReadState.Charging);\\n                                 if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\n                                     AddValue(configsToUpdate, configIds.ReadState.Welfare, 'true');\\n                                     //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'false');\\n                                     AddConfig(configsToSend, configIds.ReadState.Welfare, 'true');\\n                                     configsToAck.push(configIds.ReadState.Welfare);\\n                                 }*/\\n                            }\\n                            //Alert End\\n                            else if ((alarmCodeInt & 131072) == 131072) {\\n                                var alarm = 'ALA-F';\\n                                if (configs.Welfare.Mode == '1') {\\n                                    info = 'Recurrent';\\n                                } else info = 'Amber';\\n                            }\\n                            //Amber Alert ON    Don`t know the dfference between ALA and ALA-O\\n                            else if ((alarmCodeInt & 262144) == 262144) {\\n                                var alarm = 'ALA';\\n                            }\\n                            // welfare check in\\n                            else if ((alarmCodeInt & 524288) == 524288) {\\n                                var alarm = 'WTS';\\n                                if (configs.Welfare.Mode == '1') {\\n                                    info = 'Recurrent';\\n                                } else info = 'Amber';\\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\\n                            else if ((alarmCodeInt & 4194304) == 4194304) {\\n                                var alarm = 'ALA-W';\\n                                if (configs.Welfare.Mode == '1') {\\n                                    info = 'Recurrent';\\n                                } else info = 'Amber';\\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 != '64') {\\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                            //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 = hex_to_ascii(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 != '64') {\\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 = (`Sentry-${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 = (`Sentry-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                            // HardCode to fix possible issue in protocol\\n                            // event_time = timestamp; \\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                            if ((statusInt & 16) == 16) {\\n                                statusDevice += 'Charging,';\\n                                // AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\n                                // configsToAck.push(configIds.ReadState.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) { //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 = hex2bin(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 = hex_to_ascii(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 = hex_to_ascii(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 = hex_to_ascii(value.substring(22, 22 + (2 * desc_leng)));\\n                                //descr = hex_to_ascii(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 = hex_to_ascii(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 != '64') {\\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 = (`Sentry-${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 != '64') {\\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 = (`Sentry-${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                //  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                // \\\"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,;\\\",\\n                if (alarmCode) {\\n                    messageForReceiver = (`Sentry-${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 = (`Sentry-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 = (`Sentry;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 = hex_to_ascii(value);\\n                            imei = serverParams.Imei;\\n                            AddValue(codeValues, \\\"imei\\\", imei);\\n                            AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\n                            messageForReceiver = (`Sentry;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 = (`Sentry;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 = hex_to_ascii(value.substring(0, value.length));\\n                            //var workMode = hexToDecimal(value);\\n                            //var workMode = hex_to_ascii(value.substring(0, value.length));\\n                            var workMode = 1234; // + value + \\\"end\\\";\\n                            //var workModeVal = 9;\\n                            //workMode = 'test10';\\n                            imei = serverParams.Imei;\\n                            messageForReceiver = (`Sentry;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 = hex_to_ascii(value.substring(0, value.length));\\n                            imei = serverParams.Imei;\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\n                            messageForReceiver = (`Sentry;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 = hex2bin(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 = hex2bin(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 = hex2bin(value.substring(0, 2)) + hex2bin(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                            var report;\\n                            switch (contactNumber) {\\n                                // Emergency Number\\n                                // [Value]:80 2B 33 34 36 33 35 36 30 37 39 33 30\\n                                //{\\\"number\\\":{\\\"call\\\":0,\\\"noCard\\\":0,\\\"number\\\":\\\"+34635607930\\\",\\\"enable\\\":1,\\\"sms\\\":0,\\\"index\\\":0}}\\n                                case '0':\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\n                                    if (tel.length < 6) { //if no telephone defined\\n                                        tel = '';\\n                                    }\\n                                    report = hex2bin(value.substring(0, 2)); // To find report mode Call &data or DAta only\\n                                    AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\n                                    AddValue(codeValues, \\\"ReportMode\\\", report.substring(2, 3));\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.ReportMode, report.substring(2, 3));\\n                                    configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\n                                    configsToAck.push(configIds.ReadAlertSettings.ReportMode);\\n                                    break;\\n                                    // Speed Dial Number\\n                                case '1':\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\n                                    if (tel.length < 6) { //if no telephone defined\\n                                        tel = '';\\n                                    }\\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 = hex_to_ascii(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 = hex_to_ascii(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 = hex_to_ascii(value.substring(0, value.length));\\n                            imei = serverParams.Imei;\\n                            break;\\n                        case '41': // APN Username\\n                            //no ACK need\\n                            //apn = apn + ',' + hex_to_ascii(value.substring(0, value.length));\\n                            break;\\n                        case '42': // APN Password\\n                            //no ACK need\\n                            //apn = apn + ',' + hex_to_ascii(value.substring(0, value.length));\\n                            messageForReceiver = (`Sentry;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 = hex_to_ascii(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 = (`Sentry;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 = (`Sentry;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 = hex2bin(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 = (`Sentry;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 '55': // Tilt Angle Alert\\n                            //[Value]:0A 00 1E 00\\n                            //{\\\"tiltAlert\\\":{\\\"angle\\\":30,\\\"time\\\":10,\\\"status\\\":0,\\\"dial\\\":0}}\\n                            var angle = hexToDecimal(value.substring(4, 6));\\n                            var timeout = hexToDecimal(value.substring(0, 2));\\n                            var status = hexToDecimal(value.substring(6, 8));\\n                            if (status == 0) angle = 0;\\n                            //var alertSetting = angle;\\n                            //imei = serverParams.Imei;\\n                            //messageForReceiver = (`Sentry;ACK-TILTANG;${imei};`);\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\n                            AddValue(codeValues, \\\"tiltangle\\\", angle);\\n                            AddValue(codeValues, \\\"tiltimeout\\\", timeout);\\n                            AddValue(codeValues, \\\"tiltstatus\\\", status);\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltTimeout, timeout);\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltAngle, angle);\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltTimeout);\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltAngle);\\n                            break;\\n                        case '56': //Fall down sensibility\\n                            // '00001100'\\n                            var fallStatus = hex2bin(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 = (`Sentry;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.ManDownSettings, sensibility);\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.EnableDisableManDownSettings, enalbleDisable);\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.Sensitivity, sesibityOptionValue);\\n                            //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\n                            configsToAck.push(configIds.ReadManDownSettings.EnableDisableManDownSettings);\\n                            configsToAck.push(configIds.ReadManDownSettings.Sensitivity);\\n                            break;\\n                        case '57': // Welfare\\n                            // [Value]:10 0E 00 80 58 02 00 80\\n                            //{\\\"welfareAlert\\\":{\\\"time\\\":600,\\\"value\\\":3600,\\\"status\\\":1,\\\"dial\\\":1}}\\n                            var welfareStatus = hex2bin(value.substring(6, 8)); // check status\\n                            var welfareValue = hexToDecimal(changeEndianness(value.substring(0, 6)));\\n                            var welfareTime = hexToDecimal(changeEndianness(value.substring(8, 14)));\\n                            var enalbleDisable = '';\\n                            if ((configs.ReadState.Charging == 'true') && (configs.Welfare.Mode == '1') && (configs.Welfare.EnableDisableWelfare == 'true')) { // Force Read to enable welfare when device is charging in recurrent mode\\n                                var sensibility = 'Enable, '\\n                                enalbleDisable = '1'\\n                            } else {\\n                                if (welfareStatus.substring(0, 1) == '1') {\\n                                    var sensibility = 'Enable, '\\n                                    enalbleDisable = '1'\\n                                } else {\\n                                    var sensibility = 'Disable, '\\n                                }\\n                            };\\n                            //var imei = serverParams.Imei;\\n                            //messageForReceiver = (`Sentry;ACK-WELFALERT;${imei};`);\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\n                            sensibility += ', ' + welfareValue / 60;\\n                            sensibility += ', ' + welfareTime / 60;\\n                            AddValue(codeValues, \\\"welfare\\\", sensibility);\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.EnableDisableReadWelfare, enalbleDisable);\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Prealarm, welfareTime / 60);\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Timeout, welfareValue / 60);\\n                            configsToAck.push(configIds.ReadWelfareSettings.EnableDisableReadWelfare);\\n                            configsToAck.push(configIds.ReadWelfareSettings.Prealarm);\\n                            configsToAck.push(configIds.ReadWelfareSettings.Timeout);\\n                            break;\\n                        case '73': //BeaconList\\n                            var beaconNumber = hexToDecimal(value.substring(1, 2));\\n                            var beaconStatus = hex2bin(value.substring(0, 1));\\n                            //if (beaconStatus.substring(4, 5) == '1') {\\n                            //    homeBeacon += ' Enable, '\\n                            //} else {\\n                            //    homeBeacon += ' Disable, '\\n                            //};\\n                            beaconStatus = hex_to_ascii(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 = (`Sentry;ACK-GDATA;${imei};`);\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\n                            AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\n                            configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\n                            break;\\n                        case '75': // Extra Enable control   Welfare Mode\\n                            //[Value]:80 00 00 10  last two digit for new/old welfare\\n                            //{\\\"extraControl\\\":{\\\"bit29\\\":0,\\\"bit27\\\":0,\\\"bit28\\\":1,\\\"bit25\\\":0,\\\"bit26\\\":0,\\\"flagValue\\\":268435584,\\\"bit23\\\":0,\\\"bit24\\\":0,\\\"bit21\\\":0,\\\"bit22\\\":0,\\\"bit20\\\":0,\\\"bit9\\\":0,\\\"bit18\\\":0,\\\"bit19\\\":0,\\\"bit7\\\":1,\\\"bit16\\\":0,\\\"bit8\\\":0,\\\"bit17\\\":0,\\\"bit5\\\":0,\\\"bit14\\\":0,\\\"bit6\\\":0,\\\"bit15\\\":0,\\\"bit3\\\":0,\\\"bit4\\\":0,\\\"bit1\\\":0,\\\"bit2\\\":0,\\\"bit0\\\":0,\\\"bit12\\\":0,\\\"bit13\\\":0,\\\"bit10\\\":0,\\\"bit11\\\":0,\\\"bit30\\\":0,\\\"bit31\\\":0}}\\n                            var extraStatus = hex2bin(value.substring(6, 7)).substring(7, 8);\\n                            //if (extraStatus.substring(7, 8) == '1') {\\n                            //    extra += ' Enable, '\\n                            //} else {\\n                            //    extra += ' Disable, '\\n                            //};\\n                            //beaconStatus = hex_to_ascii(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, \\\"welfare Mode\\\", extraStatus);\\n                            // messageForReceiver = (`Sentry;ACK-EXTRA;${imei};`);\\n                            // sendMessageToLocalhostNoWait(messageForReceiver);\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Mode, extraStatus);\\n                            configsToAck.push(configIds.ReadWelfareSettings.Mode);\\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 = hex_to_ascii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\n                                var wifiPassword = hex_to_ascii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\n                                var imei = serverParams.Imei;\\n                                messageForReceiver = (`Sentry;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 = hex2bin(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 = (`Sentry;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 = hex_to_ascii(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 = hex_to_ascii(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 = hex2bin(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 = hex_to_ascii(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 = (`Sentry-${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 = (`Sentry-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 = (`Sentry-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 = (`Sentry-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 = hex_to_ascii(rawFromBytes.substring(i, i + 30));\\n                AddValue(codeValues, \\\"imei\\\", imei);\\n            }\\n        }\\n    }\\n\\n    function ascii_to_hexa(str) { // ascii to hex \\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\\n    function 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\\n    function 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    }\\n\\n    function hex2bin(hex) { //\\n        return (parseInt(hex, 16).toString(2)).padStart(8, '0');\\n    }\\n\\n    function calculateCheckSum(payloadData) { // check if payload checksum is valid\\n        var checksum = byteStringToByteArray(payloadData);\\n        checksum = crc16byte(checksum);\\n        checksum = decimalToHex(checksum);\\n        checksum = ('0000' + checksum).slice(-4).toUpperCase();\\n        return changeEndianness(checksum);\\n    }\\n\\n    function 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\\n    function debug(str) { // write debug info to console log, if localTesting\\n        if (localTesting === \\\"True\\\") {\\n            console.log(str);\\n        }\\n    }\\n\\n    function decimalToHex(x) { // decimal to hex\\n        x = x.toString(16).toUpperCase();\\n        return x;\\n    }\\n\\n    function hex_to_ascii(str1) { // Hex to Ascii \\n        var hex = str1.toString();\\n        var str = '';\\n        for (var n = 0; n < hex.length; n += 2) {\\n            str += String.fromCharCode(parseInt(hex.substr(n, 2), 16));\\n        }\\n        return str;\\n    }\\n\\n    function hexToDecimalSigned(hex) { // hex to decimal\\n        if (hex.length % 2 != 0) {\\n            hex = \\\"0\\\" + hex;\\n        }\\n        var num = parseInt(hex, 16);\\n        var maxVal = Math.pow(2, hex.length / 2 * 8);\\n        if (num > maxVal / 2 - 1) {\\n            num = num - maxVal;\\n        }\\n        return num;\\n    }\\n\\n    function hexToDecimal(x) {\\n        x = parseInt(x, 16);\\n        return x;\\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 acceptance server the message ... ');\\n            console.log(str);\\n            server = '52.174.17.77';\\n        } else {\\n            server = '127.0.0.1';\\n        }\\n        var c = net.createConnection(5678, server);\\n        c.on('error', function(error) {\\n            c = net.createConnection(5678, server);\\n        });\\n        c.write(`${str}`);\\n        c.end();\\n    }\\n    // modify to return the object that contains your data\\n    return dataToReceiver;\\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":1744109040},{"Type":1,"NewValue":"{\"Id\":362,\"Name\":\"Access PS Sentry\",\"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    // Sentry protocol - please see variables and typical values in order below\\n    // Sentry-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    // Sentry-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 N.\\n    // Created: 01/01/2025\\n    // Last modified: 14/02/2025\\n    //\\n    ///////////////////////////////////////////////////////////////////////////////\\n    if (typeof localTesting === undefined) {\\n        var 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', 'Sentry');\\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 = (`Sentry-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 'BATCN': // Battery Charging - On\\n                AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\n                configsToAck.push(configIds.ReadState.Charging);\\n                //configs.AlertSettings.Welfare.Mode\\n                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\n                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'false');\\n                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'true');\\n                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'false');\\n                    configsToAck.push(configIds.ReadState.Welfare);\\n                }\\n                break;\\n            case 'BATCF': // Battery Charging - Off\\n                AddValue(configsToUpdate, configIds.ReadState.Charging, 'false');\\n                configsToAck.push(configIds.ReadState.Charging);\\n                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\n                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'true');\\n                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'false');\\n                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'true');\\n                    configsToAck.push(configIds.ReadState.Welfare);\\n                }\\n                break;\\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 Sentry-')) {\\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 = (`Sentry-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 = (`Sentry;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 = (`Sentry;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 = (`Sentry-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    var 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    console.log(dataToReceiver);\\n    // end of main operation\\n    // define functions used in operation\\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\\n    function AddConfig(codeValueArray, configName, newvalue) {\\n        if (newvalue !== undefined) { // don't add if newvalue is undefined\\n            var cvpair = {\\n                'code': configName,\\n                'value': newvalue, // ?  newvalue : \\\"Not Defined\\\" \\n                'forced': true\\n            };\\n            codeValueArray.push(cvpair);\\n        };\\n    }\\n\\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 = hex_to_ascii(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  ¿qué es fall OFF?\\n                            if ((alarmCodeExtInt & 1) == 1) {\\n                                var alarm = 'ALF-C'; // Fall-DownAlertending\\n                            }\\n                            // Welfare Check-out\\n                            else if ((alarmCodeExtInt & 2) == 2) {\\n                                var alarm = 'WSTP';\\n                                if (configs.Welfare !== undefined) {\\n                                    if (configs.Welfare.Mode == '1') {\\n                                        info = 'Recurrent';\\n                                    } else info = 'Amber';\\n                                }\\n                            }\\n                            //Geo 5 in\\n                            //else if ((alarmCodeInt & 16) == 16) {\\n                            //    var alarm = 'BATL';\\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 Alert\\n                            else if ((alarmCodeInt & 8) == 8) {\\n                                var alarm = 'TLT';\\n                            }\\n                            // Geo IN - OUT\\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 Alert\\n                            else if ((alarmCodeInt & 256) == 256) {\\n                                var alarm = 'PWRF';\\n                            }\\n                            //Power On Alert\\n                            else if ((alarmCodeInt & 512) == 512) {\\n                                var alarm = 'PWRN';\\n                            }\\n                            //Motion Alert\\n                            else if ((alarmCodeInt & 1024) == 1024) {\\n                                var alarm = 'ALMOV';\\n                            }\\n                            //No Motion Alert\\n                            else if ((alarmCodeInt & 2048) == 2048) {\\n                                var alarm = 'ALNM';\\n                            }\\n                            //SOS\\n                            else if ((alarmCodeInt & 4096) == 4096) {\\n                                var alarm = 'ALSOS';\\n                            }\\n                            // Side call button 1\\n                            else if ((alarmCodeInt & 8192) == 8192) {\\n                                var alarm = 'Side1';\\n                            }\\n                            // Side call button 2\\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                                /*AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\n                                configsToAck.push(configIds.ReadState.Charging);\\n                                //configs.AlertSettings.Welfare.Mode\\n                                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\n                                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'false');\\n                                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'true');\\n                                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'false');\\n                                    configsToAck.push(configIds.ReadState.Welfare);\\n                                }*/\\n                            }\\n                            //Battery no charging\\n                            else if ((alarmCodeInt & 65536) == 65536) {\\n                                var alarm = 'BATCF';\\n                                /* AddValue(configsToUpdate, configIds.ReadState.Charging, 'false');\\n                                 configsToAck.push(configIds.ReadState.Charging);\\n                                 if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\n                                     AddValue(configsToUpdate, configIds.ReadState.Welfare, 'true');\\n                                     //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'false');\\n                                     AddConfig(configsToSend, configIds.ReadState.Welfare, 'true');\\n                                     configsToAck.push(configIds.ReadState.Welfare);\\n                                 }*/\\n                            }\\n                            //Alert End\\n                            else if ((alarmCodeInt & 131072) == 131072) {\\n                                var alarm = 'ALA-F';\\n                                if (configs.Welfare.Mode == '1') {\\n                                    info = 'Recurrent';\\n                                } else info = 'Amber';\\n                            }\\n                            //Amber Alert ON    Don`t know the dfference between ALA and ALA-O\\n                            else if ((alarmCodeInt & 262144) == 262144) {\\n                                var alarm = 'ALA';\\n                            }\\n                            // welfare check in\\n                            else if ((alarmCodeInt & 524288) == 524288) {\\n                                var alarm = 'WTS';\\n                                if (configs.Welfare.Mode == '1') {\\n                                    info = 'Recurrent';\\n                                } else info = 'Amber';\\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\\n                            else if ((alarmCodeInt & 4194304) == 4194304) {\\n                                var alarm = 'ALA-W';\\n                                if (configs.Welfare.Mode == '1') {\\n                                    info = 'Recurrent';\\n                                } else info = 'Amber';\\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 != '64') {\\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                            //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 = hex_to_ascii(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 != '64') {\\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 = (`Sentry-${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 = (`Sentry-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                            // HardCode to fix possible issue in protocol\\n                            // event_time = timestamp; \\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                            if ((statusInt & 16) == 16) {\\n                                statusDevice += 'Charging,';\\n                                // AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\n                                // configsToAck.push(configIds.ReadState.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) { //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 = hex2bin(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 = hex_to_ascii(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 = hex_to_ascii(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 = hex_to_ascii(value.substring(22, 22 + (2 * desc_leng)));\\n                                //descr = hex_to_ascii(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 = hex_to_ascii(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 != '64') {\\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 = (`Sentry-${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 != '64') {\\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 = (`Sentry-${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                //  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                // \\\"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,;\\\",\\n                if (alarmCode) {\\n                    messageForReceiver = (`Sentry-${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 = (`Sentry-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 = (`Sentry;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 = hex_to_ascii(value);\\n                            imei = serverParams.Imei;\\n                            AddValue(codeValues, \\\"imei\\\", imei);\\n                            AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\n                            messageForReceiver = (`Sentry;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 = (`Sentry;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 = hex_to_ascii(value.substring(0, value.length));\\n                            //var workMode = hexToDecimal(value);\\n                            //var workMode = hex_to_ascii(value.substring(0, value.length));\\n                            var workMode = 1234; // + value + \\\"end\\\";\\n                            //var workModeVal = 9;\\n                            //workMode = 'test10';\\n                            imei = serverParams.Imei;\\n                            messageForReceiver = (`Sentry;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 = hex_to_ascii(value.substring(0, value.length));\\n                            imei = serverParams.Imei;\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\n                            messageForReceiver = (`Sentry;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 = hex2bin(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 = hex2bin(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 = hex2bin(value.substring(0, 2)) + hex2bin(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                            var report;\\n                            switch (contactNumber) {\\n                                // Emergency Number\\n                                // [Value]:80 2B 33 34 36 33 35 36 30 37 39 33 30\\n                                //{\\\"number\\\":{\\\"call\\\":0,\\\"noCard\\\":0,\\\"number\\\":\\\"+34635607930\\\",\\\"enable\\\":1,\\\"sms\\\":0,\\\"index\\\":0}}\\n                                case '0':\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\n                                    if (tel.length < 6) { //if no telephone defined\\n                                        tel = '';\\n                                    }\\n                                    report = hex2bin(value.substring(0, 2)); // To find report mode Call &data or DAta only\\n                                    AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\n                                    AddValue(codeValues, \\\"ReportMode\\\", report.substring(2, 3));\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.ReportMode, report.substring(2, 3));\\n                                    configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\n                                    configsToAck.push(configIds.ReadAlertSettings.ReportMode);\\n                                    break;\\n                                    // Speed Dial Number\\n                                case '1':\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\n                                    if (tel.length < 6) { //if no telephone defined\\n                                        tel = '';\\n                                    }\\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 = hex_to_ascii(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 = hex_to_ascii(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 = hex_to_ascii(value.substring(0, value.length));\\n                            imei = serverParams.Imei;\\n                            break;\\n                        case '41': // APN Username\\n                            //no ACK need\\n                            //apn = apn + ',' + hex_to_ascii(value.substring(0, value.length));\\n                            break;\\n                        case '42': // APN Password\\n                            //no ACK need\\n                            //apn = apn + ',' + hex_to_ascii(value.substring(0, value.length));\\n                            messageForReceiver = (`Sentry;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 = hex_to_ascii(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 = (`Sentry;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 = (`Sentry;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 = hex2bin(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 = (`Sentry;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 '55': // Tilt Angle Alert\\n                            //[Value]:0A 00 1E 00\\n                            //{\\\"tiltAlert\\\":{\\\"angle\\\":30,\\\"time\\\":10,\\\"status\\\":0,\\\"dial\\\":0}}\\n                            var angle = hexToDecimal(value.substring(4, 6));\\n                            var timeout = hexToDecimal(value.substring(0, 2));\\n                            var status = hexToDecimal(value.substring(6, 8));\\n                            if (status == 0) angle = 0;\\n                            //var alertSetting = angle;\\n                            //imei = serverParams.Imei;\\n                            //messageForReceiver = (`Sentry;ACK-TILTANG;${imei};`);\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\n                            AddValue(codeValues, \\\"tiltangle\\\", angle);\\n                            AddValue(codeValues, \\\"tiltimeout\\\", timeout);\\n                            AddValue(codeValues, \\\"tiltstatus\\\", status);\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltTimeout, timeout);\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltAngle, angle);\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltTimeout);\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltAngle);\\n                            break;\\n                        case '56': //Fall down sensibility\\n                            // '00001100'\\n                            var fallStatus = hex2bin(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 = (`Sentry;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.ManDownSettings, sensibility);\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.EnableDisableManDownSettings, enalbleDisable);\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.Sensitivity, sesibityOptionValue);\\n                            //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\n                            configsToAck.push(configIds.ReadManDownSettings.EnableDisableManDownSettings);\\n                            configsToAck.push(configIds.ReadManDownSettings.Sensitivity);\\n                            break;\\n                        case '57': // Welfare\\n                            // [Value]:10 0E 00 80 58 02 00 80\\n                            //{\\\"welfareAlert\\\":{\\\"time\\\":600,\\\"value\\\":3600,\\\"status\\\":1,\\\"dial\\\":1}}\\n                            var welfareStatus = hex2bin(value.substring(6, 8)); // check status\\n                            var welfareValue = hexToDecimal(changeEndianness(value.substring(0, 6)));\\n                            var welfareTime = hexToDecimal(changeEndianness(value.substring(8, 14)));\\n                            var enalbleDisable = '';\\n                            if ((configs.ReadState.Charging == 'true') && (configs.Welfare.Mode == '1') && (configs.Welfare.EnableDisableWelfare == 'true')) { // Force Read to enable welfare when device is charging in recurrent mode\\n                                var sensibility = 'Enable, '\\n                                enalbleDisable = '1'\\n                            } else {\\n                                if (welfareStatus.substring(0, 1) == '1') {\\n                                    var sensibility = 'Enable, '\\n                                    enalbleDisable = '1'\\n                                } else {\\n                                    var sensibility = 'Disable, '\\n                                }\\n                            };\\n                            //var imei = serverParams.Imei;\\n                            //messageForReceiver = (`Sentry;ACK-WELFALERT;${imei};`);\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\n                            sensibility += ', ' + welfareValue / 60;\\n                            sensibility += ', ' + welfareTime / 60;\\n                            AddValue(codeValues, \\\"welfare\\\", sensibility);\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.EnableDisableReadWelfare, enalbleDisable);\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Prealarm, welfareTime / 60);\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Timeout, welfareValue / 60);\\n                            configsToAck.push(configIds.ReadWelfareSettings.EnableDisableReadWelfare);\\n                            configsToAck.push(configIds.ReadWelfareSettings.Prealarm);\\n                            configsToAck.push(configIds.ReadWelfareSettings.Timeout);\\n                            break;\\n                        case '73': //BeaconList\\n                            var beaconNumber = hexToDecimal(value.substring(1, 2));\\n                            var beaconStatus = hex2bin(value.substring(0, 1));\\n                            //if (beaconStatus.substring(4, 5) == '1') {\\n                            //    homeBeacon += ' Enable, '\\n                            //} else {\\n                            //    homeBeacon += ' Disable, '\\n                            //};\\n                            beaconStatus = hex_to_ascii(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 = (`Sentry;ACK-GDATA;${imei};`);\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\n                            AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\n                            configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\n                            break;\\n                        case '75': // Extra Enable control   Welfare Mode\\n                            //[Value]:80 00 00 10  last two digit for new/old welfare\\n                            //{\\\"extraControl\\\":{\\\"bit29\\\":0,\\\"bit27\\\":0,\\\"bit28\\\":1,\\\"bit25\\\":0,\\\"bit26\\\":0,\\\"flagValue\\\":268435584,\\\"bit23\\\":0,\\\"bit24\\\":0,\\\"bit21\\\":0,\\\"bit22\\\":0,\\\"bit20\\\":0,\\\"bit9\\\":0,\\\"bit18\\\":0,\\\"bit19\\\":0,\\\"bit7\\\":1,\\\"bit16\\\":0,\\\"bit8\\\":0,\\\"bit17\\\":0,\\\"bit5\\\":0,\\\"bit14\\\":0,\\\"bit6\\\":0,\\\"bit15\\\":0,\\\"bit3\\\":0,\\\"bit4\\\":0,\\\"bit1\\\":0,\\\"bit2\\\":0,\\\"bit0\\\":0,\\\"bit12\\\":0,\\\"bit13\\\":0,\\\"bit10\\\":0,\\\"bit11\\\":0,\\\"bit30\\\":0,\\\"bit31\\\":0}}\\n                            var extraStatus = hex2bin(value.substring(6, 7)).substring(7, 8);\\n                            //if (extraStatus.substring(7, 8) == '1') {\\n                            //    extra += ' Enable, '\\n                            //} else {\\n                            //    extra += ' Disable, '\\n                            //};\\n                            //beaconStatus = hex_to_ascii(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, \\\"welfare Mode\\\", extraStatus);\\n                            // messageForReceiver = (`Sentry;ACK-EXTRA;${imei};`);\\n                            // sendMessageToLocalhostNoWait(messageForReceiver);\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Mode, extraStatus);\\n                            configsToAck.push(configIds.ReadWelfareSettings.Mode);\\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 = hex_to_ascii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\n                                var wifiPassword = hex_to_ascii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\n                                var imei = serverParams.Imei;\\n                                messageForReceiver = (`Sentry;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 = hex2bin(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 = (`Sentry;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 = hex_to_ascii(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 = hex_to_ascii(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 = hex2bin(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 = hex_to_ascii(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 = (`Sentry-${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 = (`Sentry-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 = (`Sentry-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 = (`Sentry-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 = hex_to_ascii(rawFromBytes.substring(i, i + 30));\\n                AddValue(codeValues, \\\"imei\\\", imei);\\n            }\\n        }\\n    }\\n\\n    function ascii_to_hexa(str) { // ascii to hex \\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\\n    function 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\\n    function 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    }\\n\\n    function hex2bin(hex) { //\\n        return (parseInt(hex, 16).toString(2)).padStart(8, '0');\\n    }\\n\\n    function calculateCheckSum(payloadData) { // check if payload checksum is valid\\n        var checksum = byteStringToByteArray(payloadData);\\n        checksum = crc16byte(checksum);\\n        checksum = decimalToHex(checksum);\\n        checksum = ('0000' + checksum).slice(-4).toUpperCase();\\n        return changeEndianness(checksum);\\n    }\\n\\n    function 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\\n    function debug(str) { // write debug info to console log, if localTesting\\n        if (localTesting === \\\"True\\\") {\\n            console.log(str);\\n        }\\n    }\\n\\n    function decimalToHex(x) { // decimal to hex\\n        x = x.toString(16).toUpperCase();\\n        return x;\\n    }\\n\\n    function hex_to_ascii(str1) { // Hex to Ascii \\n        var hex = str1.toString();\\n        var str = '';\\n        for (var n = 0; n < hex.length; n += 2) {\\n            str += String.fromCharCode(parseInt(hex.substr(n, 2), 16));\\n        }\\n        return str;\\n    }\\n\\n    function hexToDecimalSigned(hex) { // hex to decimal\\n        if (hex.length % 2 != 0) {\\n            hex = \\\"0\\\" + hex;\\n        }\\n        var num = parseInt(hex, 16);\\n        var maxVal = Math.pow(2, hex.length / 2 * 8);\\n        if (num > maxVal / 2 - 1) {\\n            num = num - maxVal;\\n        }\\n        return num;\\n    }\\n\\n    function hexToDecimal(x) {\\n        x = parseInt(x, 16);\\n        return x;\\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 acceptance server the message ... ');\\n            console.log(str);\\n            server = '52.174.17.77';\\n        } else {\\n            server = '127.0.0.1';\\n        }\\n        var c = net.createConnection(5678, server);\\n        c.on('error', function(error) {\\n            c = net.createConnection(5678, server);\\n        });\\n        c.write(`${str}`);\\n        c.end();\\n    }\\n    // modify to return the object that contains your data\\n    return dataToReceiver;\\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":1744113196},{"Type":1,"NewValue":"{\"Id\":362,\"Name\":\"Access PS Sentry\",\"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    // Sentry protocol - please see variables and typical values in order below\\n    // Sentry-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    // Sentry-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 N.\\n    // Created: 01/01/2025\\n    // Last modified: 14/02/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', 'Sentry');\\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 = (`Sentry-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 'BATCN': // Battery Charging - On\\n                AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\n                configsToAck.push(configIds.ReadState.Charging);\\n                //configs.AlertSettings.Welfare.Mode\\n                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\n                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'false');\\n                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'true');\\n                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'false');\\n                    configsToAck.push(configIds.ReadState.Welfare);\\n                }\\n                break;\\n            case 'BATCF': // Battery Charging - Off\\n                AddValue(configsToUpdate, configIds.ReadState.Charging, 'false');\\n                configsToAck.push(configIds.ReadState.Charging);\\n                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\n                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'true');\\n                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'false');\\n                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'true');\\n                    configsToAck.push(configIds.ReadState.Welfare);\\n                }\\n                break;\\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 Sentry-')) {\\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 = (`Sentry-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 = (`Sentry;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 = (`Sentry;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 = (`Sentry-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    var 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    console.log(dataToReceiver);\\n    // end of main operation\\n    // define functions used in operation\\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\\n    function AddConfig(codeValueArray, configName, newvalue) {\\n        if (newvalue !== undefined) { // don't add if newvalue is undefined\\n            var cvpair = {\\n                'code': configName,\\n                'value': newvalue, // ?  newvalue : \\\"Not Defined\\\" \\n                'forced': true\\n            };\\n            codeValueArray.push(cvpair);\\n        };\\n    }\\n\\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 = hex_to_ascii(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  ¿qué es fall OFF?\\n                            if ((alarmCodeExtInt & 1) == 1) {\\n                                var alarm = 'ALF-C'; // Fall-DownAlertending\\n                            }\\n                            // Welfare Check-out\\n                            else if ((alarmCodeExtInt & 2) == 2) {\\n                                var alarm = 'WSTP';\\n                                if (configs.Welfare !== undefined) {\\n                                    if (configs.Welfare.Mode == '1') {\\n                                        info = 'Recurrent';\\n                                    } else info = 'Amber';\\n                                }\\n                            }\\n                            //Geo 5 in\\n                            //else if ((alarmCodeInt & 16) == 16) {\\n                            //    var alarm = 'BATL';\\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 Alert\\n                            else if ((alarmCodeInt & 8) == 8) {\\n                                var alarm = 'TLT';\\n                            }\\n                            // Geo IN - OUT\\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 Alert\\n                            else if ((alarmCodeInt & 256) == 256) {\\n                                var alarm = 'PWRF';\\n                            }\\n                            //Power On Alert\\n                            else if ((alarmCodeInt & 512) == 512) {\\n                                var alarm = 'PWRN';\\n                            }\\n                            //Motion Alert\\n                            else if ((alarmCodeInt & 1024) == 1024) {\\n                                var alarm = 'ALMOV';\\n                            }\\n                            //No Motion Alert\\n                            else if ((alarmCodeInt & 2048) == 2048) {\\n                                var alarm = 'ALNM';\\n                            }\\n                            //SOS\\n                            else if ((alarmCodeInt & 4096) == 4096) {\\n                                var alarm = 'ALSOS';\\n                            }\\n                            // Side call button 1\\n                            else if ((alarmCodeInt & 8192) == 8192) {\\n                                var alarm = 'Side1';\\n                            }\\n                            // Side call button 2\\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                                /*AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\n                                configsToAck.push(configIds.ReadState.Charging);\\n                                //configs.AlertSettings.Welfare.Mode\\n                                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\n                                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'false');\\n                                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'true');\\n                                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'false');\\n                                    configsToAck.push(configIds.ReadState.Welfare);\\n                                }*/\\n                            }\\n                            //Battery no charging\\n                            else if ((alarmCodeInt & 65536) == 65536) {\\n                                var alarm = 'BATCF';\\n                                /* AddValue(configsToUpdate, configIds.ReadState.Charging, 'false');\\n                                 configsToAck.push(configIds.ReadState.Charging);\\n                                 if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\n                                     AddValue(configsToUpdate, configIds.ReadState.Welfare, 'true');\\n                                     //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'false');\\n                                     AddConfig(configsToSend, configIds.ReadState.Welfare, 'true');\\n                                     configsToAck.push(configIds.ReadState.Welfare);\\n                                 }*/\\n                            }\\n                            //Alert End\\n                            else if ((alarmCodeInt & 131072) == 131072) {\\n                                var alarm = 'ALA-F';\\n                                if (configs.Welfare.Mode == '1') {\\n                                    info = 'Recurrent';\\n                                } else info = 'Amber';\\n                            }\\n                            //Amber Alert ON    Don`t know the dfference between ALA and ALA-O\\n                            else if ((alarmCodeInt & 262144) == 262144) {\\n                                var alarm = 'ALA';\\n                            }\\n                            // welfare check in\\n                            else if ((alarmCodeInt & 524288) == 524288) {\\n                                var alarm = 'WTS';\\n                                if (configs.Welfare.Mode == '1') {\\n                                    info = 'Recurrent';\\n                                } else info = 'Amber';\\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\\n                            else if ((alarmCodeInt & 4194304) == 4194304) {\\n                                var alarm = 'ALA-W';\\n                                if (configs.Welfare.Mode == '1') {\\n                                    info = 'Recurrent';\\n                                } else info = 'Amber';\\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 != '64') {\\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                            //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 = hex_to_ascii(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 != '64') {\\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 = (`Sentry-${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 = (`Sentry-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                            // HardCode to fix possible issue in protocol\\n                            // event_time = timestamp; \\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                            if ((statusInt & 16) == 16) {\\n                                statusDevice += 'Charging,';\\n                                // AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\n                                // configsToAck.push(configIds.ReadState.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) { //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 = hex2bin(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 = hex_to_ascii(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 = hex_to_ascii(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 = hex_to_ascii(value.substring(22, 22 + (2 * desc_leng)));\\n                                //descr = hex_to_ascii(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 = hex_to_ascii(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 != '64') {\\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 = (`Sentry-${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 != '64') {\\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 = (`Sentry-${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                //  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                // \\\"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,;\\\",\\n                if (alarmCode) {\\n                    messageForReceiver = (`Sentry-${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 = (`Sentry-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 = (`Sentry;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 = hex_to_ascii(value);\\n                            imei = serverParams.Imei;\\n                            AddValue(codeValues, \\\"imei\\\", imei);\\n                            AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\n                            messageForReceiver = (`Sentry;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 = (`Sentry;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 = hex_to_ascii(value.substring(0, value.length));\\n                            //var workMode = hexToDecimal(value);\\n                            //var workMode = hex_to_ascii(value.substring(0, value.length));\\n                            var workMode = 1234; // + value + \\\"end\\\";\\n                            //var workModeVal = 9;\\n                            //workMode = 'test10';\\n                            imei = serverParams.Imei;\\n                            messageForReceiver = (`Sentry;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 = hex_to_ascii(value.substring(0, value.length));\\n                            imei = serverParams.Imei;\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\n                            messageForReceiver = (`Sentry;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 = hex2bin(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 = hex2bin(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 = hex2bin(value.substring(0, 2)) + hex2bin(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                            var report;\\n                            switch (contactNumber) {\\n                                // Emergency Number\\n                                // [Value]:80 2B 33 34 36 33 35 36 30 37 39 33 30\\n                                //{\\\"number\\\":{\\\"call\\\":0,\\\"noCard\\\":0,\\\"number\\\":\\\"+34635607930\\\",\\\"enable\\\":1,\\\"sms\\\":0,\\\"index\\\":0}}\\n                                case '0':\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\n                                    if (tel.length < 6) { //if no telephone defined\\n                                        tel = '';\\n                                    }\\n                                    report = hex2bin(value.substring(0, 2)); // To find report mode Call &data or DAta only\\n                                    AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\n                                    AddValue(codeValues, \\\"ReportMode\\\", report.substring(2, 3));\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.ReportMode, report.substring(2, 3));\\n                                    configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\n                                    configsToAck.push(configIds.ReadAlertSettings.ReportMode);\\n                                    break;\\n                                    // Speed Dial Number\\n                                case '1':\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\n                                    if (tel.length < 6) { //if no telephone defined\\n                                        tel = '';\\n                                    }\\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 = hex_to_ascii(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 = hex_to_ascii(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 = hex_to_ascii(value.substring(0, value.length));\\n                            imei = serverParams.Imei;\\n                            break;\\n                        case '41': // APN Username\\n                            //no ACK need\\n                            //apn = apn + ',' + hex_to_ascii(value.substring(0, value.length));\\n                            break;\\n                        case '42': // APN Password\\n                            //no ACK need\\n                            //apn = apn + ',' + hex_to_ascii(value.substring(0, value.length));\\n                            messageForReceiver = (`Sentry;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 = hex_to_ascii(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 = (`Sentry;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 = (`Sentry;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 = hex2bin(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 = (`Sentry;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 '55': // Tilt Angle Alert\\n                            //[Value]:0A 00 1E 00\\n                            //{\\\"tiltAlert\\\":{\\\"angle\\\":30,\\\"time\\\":10,\\\"status\\\":0,\\\"dial\\\":0}}\\n                            var angle = hexToDecimal(value.substring(4, 6));\\n                            var timeout = hexToDecimal(value.substring(0, 2));\\n                            var status = hexToDecimal(value.substring(6, 8));\\n                            if (status == 0) angle = 0;\\n                            //var alertSetting = angle;\\n                            //imei = serverParams.Imei;\\n                            //messageForReceiver = (`Sentry;ACK-TILTANG;${imei};`);\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\n                            AddValue(codeValues, \\\"tiltangle\\\", angle);\\n                            AddValue(codeValues, \\\"tiltimeout\\\", timeout);\\n                            AddValue(codeValues, \\\"tiltstatus\\\", status);\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltTimeout, timeout);\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltAngle, angle);\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltTimeout);\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltAngle);\\n                            break;\\n                        case '56': //Fall down sensibility\\n                            // '00001100'\\n                            var fallStatus = hex2bin(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 = (`Sentry;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.ManDownSettings, sensibility);\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.EnableDisableManDownSettings, enalbleDisable);\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.Sensitivity, sesibityOptionValue);\\n                            //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\n                            configsToAck.push(configIds.ReadManDownSettings.EnableDisableManDownSettings);\\n                            configsToAck.push(configIds.ReadManDownSettings.Sensitivity);\\n                            break;\\n                        case '57': // Welfare\\n                            // [Value]:10 0E 00 80 58 02 00 80\\n                            //{\\\"welfareAlert\\\":{\\\"time\\\":600,\\\"value\\\":3600,\\\"status\\\":1,\\\"dial\\\":1}}\\n                            var welfareStatus = hex2bin(value.substring(6, 8)); // check status\\n                            var welfareValue = hexToDecimal(changeEndianness(value.substring(0, 6)));\\n                            var welfareTime = hexToDecimal(changeEndianness(value.substring(8, 14)));\\n                            var enalbleDisable = '';\\n                            if ((configs.ReadState.Charging == 'true') && (configs.Welfare.Mode == '1') && (configs.Welfare.EnableDisableWelfare == 'true')) { // Force Read to enable welfare when device is charging in recurrent mode\\n                                var sensibility = 'Enable, '\\n                                enalbleDisable = '1'\\n                            } else {\\n                                if (welfareStatus.substring(0, 1) == '1') {\\n                                    var sensibility = 'Enable, '\\n                                    enalbleDisable = '1'\\n                                } else {\\n                                    var sensibility = 'Disable, '\\n                                }\\n                            };\\n                            //var imei = serverParams.Imei;\\n                            //messageForReceiver = (`Sentry;ACK-WELFALERT;${imei};`);\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\n                            sensibility += ', ' + welfareValue / 60;\\n                            sensibility += ', ' + welfareTime / 60;\\n                            AddValue(codeValues, \\\"welfare\\\", sensibility);\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.EnableDisableReadWelfare, enalbleDisable);\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Prealarm, welfareTime / 60);\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Timeout, welfareValue / 60);\\n                            configsToAck.push(configIds.ReadWelfareSettings.EnableDisableReadWelfare);\\n                            configsToAck.push(configIds.ReadWelfareSettings.Prealarm);\\n                            configsToAck.push(configIds.ReadWelfareSettings.Timeout);\\n                            break;\\n                        case '73': //BeaconList\\n                            var beaconNumber = hexToDecimal(value.substring(1, 2));\\n                            var beaconStatus = hex2bin(value.substring(0, 1));\\n                            //if (beaconStatus.substring(4, 5) == '1') {\\n                            //    homeBeacon += ' Enable, '\\n                            //} else {\\n                            //    homeBeacon += ' Disable, '\\n                            //};\\n                            beaconStatus = hex_to_ascii(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 = (`Sentry;ACK-GDATA;${imei};`);\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\n                            AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\n                            configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\n                            break;\\n                        case '75': // Extra Enable control   Welfare Mode\\n                            //[Value]:80 00 00 10  last two digit for new/old welfare\\n                            //{\\\"extraControl\\\":{\\\"bit29\\\":0,\\\"bit27\\\":0,\\\"bit28\\\":1,\\\"bit25\\\":0,\\\"bit26\\\":0,\\\"flagValue\\\":268435584,\\\"bit23\\\":0,\\\"bit24\\\":0,\\\"bit21\\\":0,\\\"bit22\\\":0,\\\"bit20\\\":0,\\\"bit9\\\":0,\\\"bit18\\\":0,\\\"bit19\\\":0,\\\"bit7\\\":1,\\\"bit16\\\":0,\\\"bit8\\\":0,\\\"bit17\\\":0,\\\"bit5\\\":0,\\\"bit14\\\":0,\\\"bit6\\\":0,\\\"bit15\\\":0,\\\"bit3\\\":0,\\\"bit4\\\":0,\\\"bit1\\\":0,\\\"bit2\\\":0,\\\"bit0\\\":0,\\\"bit12\\\":0,\\\"bit13\\\":0,\\\"bit10\\\":0,\\\"bit11\\\":0,\\\"bit30\\\":0,\\\"bit31\\\":0}}\\n                            var extraStatus = hex2bin(value.substring(6, 7)).substring(7, 8);\\n                            //if (extraStatus.substring(7, 8) == '1') {\\n                            //    extra += ' Enable, '\\n                            //} else {\\n                            //    extra += ' Disable, '\\n                            //};\\n                            //beaconStatus = hex_to_ascii(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, \\\"welfare Mode\\\", extraStatus);\\n                            // messageForReceiver = (`Sentry;ACK-EXTRA;${imei};`);\\n                            // sendMessageToLocalhostNoWait(messageForReceiver);\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Mode, extraStatus);\\n                            configsToAck.push(configIds.ReadWelfareSettings.Mode);\\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 = hex_to_ascii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\n                                var wifiPassword = hex_to_ascii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\n                                var imei = serverParams.Imei;\\n                                messageForReceiver = (`Sentry;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 = hex2bin(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 = (`Sentry;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 = hex_to_ascii(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 = hex_to_ascii(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 = hex2bin(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 = hex_to_ascii(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 = (`Sentry-${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 = (`Sentry-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 = (`Sentry-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 = (`Sentry-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 = hex_to_ascii(rawFromBytes.substring(i, i + 30));\\n                AddValue(codeValues, \\\"imei\\\", imei);\\n            }\\n        }\\n    }\\n\\n    function ascii_to_hexa(str) { // ascii to hex \\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\\n    function 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\\n    function 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    }\\n\\n    function hex2bin(hex) { //\\n        return (parseInt(hex, 16).toString(2)).padStart(8, '0');\\n    }\\n\\n    function calculateCheckSum(payloadData) { // check if payload checksum is valid\\n        var checksum = byteStringToByteArray(payloadData);\\n        checksum = crc16byte(checksum);\\n        checksum = decimalToHex(checksum);\\n        checksum = ('0000' + checksum).slice(-4).toUpperCase();\\n        return changeEndianness(checksum);\\n    }\\n\\n    function 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\\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 decimalToHex(x) { // decimal to hex\\n        x = x.toString(16).toUpperCase();\\n        return x;\\n    }\\n\\n    function hex_to_ascii(str1) { // Hex to Ascii \\n        var hex = str1.toString();\\n        var str = '';\\n        for (var n = 0; n < hex.length; n += 2) {\\n            str += String.fromCharCode(parseInt(hex.substr(n, 2), 16));\\n        }\\n        return str;\\n    }\\n\\n    function hexToDecimalSigned(hex) { // hex to decimal\\n        if (hex.length % 2 != 0) {\\n            hex = \\\"0\\\" + hex;\\n        }\\n        var num = parseInt(hex, 16);\\n        var maxVal = Math.pow(2, hex.length / 2 * 8);\\n        if (num > maxVal / 2 - 1) {\\n            num = num - maxVal;\\n        }\\n        return num;\\n    }\\n\\n    function hexToDecimal(x) {\\n        x = parseInt(x, 16);\\n        return x;\\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 acceptance server the message ... ');\\n            console.log(str);\\n            server = '52.174.17.77';\\n        } else {\\n            server = '127.0.0.1';\\n        }\\n        var c = net.createConnection(5678, server);\\n        c.on('error', function(error) {\\n            c = net.createConnection(5678, server);\\n        });\\n        c.write(`${str}`);\\n        c.end();\\n    }\\n    // modify to return the object that contains your data\\n    return dataToReceiver;\\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":1744113712},{"Type":1,"NewValue":"{\"Id\":362,\"Name\":\"Access PS Sentry\",\"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    // Sentry protocol - please see variables and typical values in order below\\n    // Sentry-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    // Sentry-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 N.\\n    // Created: 01/01/2025\\n    // Last modified: 14/02/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', 'Sentry');\\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 = (`Sentry-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 'BATCN': // Battery Charging - On\\n                AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\n                configsToAck.push(configIds.ReadState.Charging);\\n                //configs.AlertSettings.Welfare.Mode\\n                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\n                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'false');\\n                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'true');\\n                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'false');\\n                    configsToAck.push(configIds.ReadState.Welfare);\\n                }\\n                break;\\n            case 'BATCF': // Battery Charging - Off\\n                AddValue(configsToUpdate, configIds.ReadState.Charging, 'false');\\n                configsToAck.push(configIds.ReadState.Charging);\\n                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\n                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'true');\\n                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'false');\\n                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'true');\\n                    configsToAck.push(configIds.ReadState.Welfare);\\n                }\\n                break;\\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 Sentry-')) {\\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 = (`Sentry-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 = (`Sentry;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 = (`Sentry;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 = (`Sentry-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    var 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    console.log(dataToReceiver);\\n    // end of main operation\\n    // define functions used in operation\\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\\n    function AddConfig(codeValueArray, configName, newvalue) {\\n        if (newvalue !== undefined) { // don't add if newvalue is undefined\\n            var cvpair = {\\n                'code': configName,\\n                'value': newvalue, // ?  newvalue : \\\"Not Defined\\\" \\n                'forced': true\\n            };\\n            codeValueArray.push(cvpair);\\n        };\\n    }\\n\\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 = hex_to_ascii(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  ¿qué es fall OFF?\\n                            if ((alarmCodeExtInt & 1) == 1) {\\n                                var alarm = 'ALF-C'; // Fall-DownAlertending\\n                            }\\n                            // Welfare Check-out\\n                            else if ((alarmCodeExtInt & 2) == 2) {\\n                                var alarm = 'WSTP';\\n                                if (configs.Welfare !== undefined) {\\n                                    if (configs.Welfare.Mode == '1') {\\n                                        info = 'Recurrent';\\n                                    } else info = 'Amber';\\n                                }\\n                            }\\n                            //Geo 5 in\\n                            //else if ((alarmCodeInt & 16) == 16) {\\n                            //    var alarm = 'BATL';\\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 Alert\\n                            else if ((alarmCodeInt & 8) == 8) {\\n                                var alarm = 'TLT';\\n                            }\\n                            // Geo IN - OUT\\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 Alert\\n                            else if ((alarmCodeInt & 256) == 256) {\\n                                var alarm = 'PWRF';\\n                            }\\n                            //Power On Alert\\n                            else if ((alarmCodeInt & 512) == 512) {\\n                                var alarm = 'PWRN';\\n                            }\\n                            //Motion Alert\\n                            else if ((alarmCodeInt & 1024) == 1024) {\\n                                var alarm = 'ALMOV';\\n                            }\\n                            //No Motion Alert\\n                            else if ((alarmCodeInt & 2048) == 2048) {\\n                                var alarm = 'ALNM';\\n                            }\\n                            //SOS\\n                            else if ((alarmCodeInt & 4096) == 4096) {\\n                                var alarm = 'ALSOS';\\n                            }\\n                            // Side call button 1\\n                            else if ((alarmCodeInt & 8192) == 8192) {\\n                                var alarm = 'Side1';\\n                            }\\n                            // Side call button 2\\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                                /*AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\n                                configsToAck.push(configIds.ReadState.Charging);\\n                                //configs.AlertSettings.Welfare.Mode\\n                                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\n                                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'false');\\n                                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'true');\\n                                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'false');\\n                                    configsToAck.push(configIds.ReadState.Welfare);\\n                                }*/\\n                            }\\n                            //Battery no charging\\n                            else if ((alarmCodeInt & 65536) == 65536) {\\n                                var alarm = 'BATCF';\\n                                /* AddValue(configsToUpdate, configIds.ReadState.Charging, 'false');\\n                                 configsToAck.push(configIds.ReadState.Charging);\\n                                 if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\n                                     AddValue(configsToUpdate, configIds.ReadState.Welfare, 'true');\\n                                     //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'false');\\n                                     AddConfig(configsToSend, configIds.ReadState.Welfare, 'true');\\n                                     configsToAck.push(configIds.ReadState.Welfare);\\n                                 }*/\\n                            }\\n                            //Alert End\\n                            else if ((alarmCodeInt & 131072) == 131072) {\\n                                var alarm = 'ALA-F';\\n                                if (configs.Welfare !== undefined) {\\n                                    if (configs.Welfare.Mode == '1') {\\n                                        info = 'Recurrent';\\n                                    } else info = 'Amber';\\n                                }\\n                            }\\n                            //Amber Alert ON    Don`t know the dfference between ALA and ALA-O\\n                            else if ((alarmCodeInt & 262144) == 262144) {\\n                                var alarm = 'ALA';\\n                            }\\n                            // welfare check in\\n                            else if ((alarmCodeInt & 524288) == 524288) {\\n                                var alarm = 'WTS';\\n                                if (configs.Welfare !== undefined) {\\n                                    if (configs.Welfare.Mode == '1') {\\n                                        info = 'Recurrent';\\n                                    } else info = 'Amber';\\n                                }\\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\\n                            else if ((alarmCodeInt & 4194304) == 4194304) {\\n                                var alarm = 'ALA-W';\\n                                if (configs.Welfare !== undefined) {\\n                                    if (configs.Welfare.Mode == '1') {\\n                                        info = 'Recurrent';\\n                                    } else info = 'Amber';\\n                                }\\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 != '64') {\\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                            //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 = hex_to_ascii(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 != '64') {\\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 = (`Sentry-${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 = (`Sentry-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                            // HardCode to fix possible issue in protocol\\n                            // event_time = timestamp; \\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                            if ((statusInt & 16) == 16) {\\n                                statusDevice += 'Charging,';\\n                                // AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\n                                // configsToAck.push(configIds.ReadState.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) { //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 = hex2bin(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 = hex_to_ascii(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 = hex_to_ascii(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 = hex_to_ascii(value.substring(22, 22 + (2 * desc_leng)));\\n                                //descr = hex_to_ascii(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 = hex_to_ascii(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 != '64') {\\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 = (`Sentry-${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 != '64') {\\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 = (`Sentry-${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                //  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                // \\\"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,;\\\",\\n                if (alarmCode) {\\n                    messageForReceiver = (`Sentry-${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 = (`Sentry-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 = (`Sentry;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 = hex_to_ascii(value);\\n                            imei = serverParams.Imei;\\n                            AddValue(codeValues, \\\"imei\\\", imei);\\n                            AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\n                            messageForReceiver = (`Sentry;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 = (`Sentry;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 = hex_to_ascii(value.substring(0, value.length));\\n                            //var workMode = hexToDecimal(value);\\n                            //var workMode = hex_to_ascii(value.substring(0, value.length));\\n                            var workMode = 1234; // + value + \\\"end\\\";\\n                            //var workModeVal = 9;\\n                            //workMode = 'test10';\\n                            imei = serverParams.Imei;\\n                            messageForReceiver = (`Sentry;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 = hex_to_ascii(value.substring(0, value.length));\\n                            imei = serverParams.Imei;\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\n                            messageForReceiver = (`Sentry;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 = hex2bin(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 = hex2bin(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 = hex2bin(value.substring(0, 2)) + hex2bin(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                            var report;\\n                            switch (contactNumber) {\\n                                // Emergency Number\\n                                // [Value]:80 2B 33 34 36 33 35 36 30 37 39 33 30\\n                                //{\\\"number\\\":{\\\"call\\\":0,\\\"noCard\\\":0,\\\"number\\\":\\\"+34635607930\\\",\\\"enable\\\":1,\\\"sms\\\":0,\\\"index\\\":0}}\\n                                case '0':\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\n                                    if (tel.length < 6) { //if no telephone defined\\n                                        tel = '';\\n                                    }\\n                                    report = hex2bin(value.substring(0, 2)); // To find report mode Call &data or DAta only\\n                                    AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\n                                    AddValue(codeValues, \\\"ReportMode\\\", report.substring(2, 3));\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.ReportMode, report.substring(2, 3));\\n                                    configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\n                                    configsToAck.push(configIds.ReadAlertSettings.ReportMode);\\n                                    break;\\n                                    // Speed Dial Number\\n                                case '1':\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\n                                    if (tel.length < 6) { //if no telephone defined\\n                                        tel = '';\\n                                    }\\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 = hex_to_ascii(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 = hex_to_ascii(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 = hex_to_ascii(value.substring(0, value.length));\\n                            imei = serverParams.Imei;\\n                            break;\\n                        case '41': // APN Username\\n                            //no ACK need\\n                            //apn = apn + ',' + hex_to_ascii(value.substring(0, value.length));\\n                            break;\\n                        case '42': // APN Password\\n                            //no ACK need\\n                            //apn = apn + ',' + hex_to_ascii(value.substring(0, value.length));\\n                            messageForReceiver = (`Sentry;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 = hex_to_ascii(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 = (`Sentry;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 = (`Sentry;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 = hex2bin(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 = (`Sentry;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 '55': // Tilt Angle Alert\\n                            //[Value]:0A 00 1E 00\\n                            //{\\\"tiltAlert\\\":{\\\"angle\\\":30,\\\"time\\\":10,\\\"status\\\":0,\\\"dial\\\":0}}\\n                            var angle = hexToDecimal(value.substring(4, 6));\\n                            var timeout = hexToDecimal(value.substring(0, 2));\\n                            var status = hexToDecimal(value.substring(6, 8));\\n                            if (status == 0) angle = 0;\\n                            //var alertSetting = angle;\\n                            //imei = serverParams.Imei;\\n                            //messageForReceiver = (`Sentry;ACK-TILTANG;${imei};`);\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\n                            AddValue(codeValues, \\\"tiltangle\\\", angle);\\n                            AddValue(codeValues, \\\"tiltimeout\\\", timeout);\\n                            AddValue(codeValues, \\\"tiltstatus\\\", status);\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltTimeout, timeout);\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltAngle, angle);\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltTimeout);\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltAngle);\\n                            break;\\n                        case '56': //Fall down sensibility\\n                            // '00001100'\\n                            var fallStatus = hex2bin(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 = (`Sentry;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.ManDownSettings, sensibility);\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.EnableDisableManDownSettings, enalbleDisable);\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.Sensitivity, sesibityOptionValue);\\n                            //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\n                            configsToAck.push(configIds.ReadManDownSettings.EnableDisableManDownSettings);\\n                            configsToAck.push(configIds.ReadManDownSettings.Sensitivity);\\n                            break;\\n                        case '57': // Welfare\\n                            // [Value]:10 0E 00 80 58 02 00 80\\n                            //{\\\"welfareAlert\\\":{\\\"time\\\":600,\\\"value\\\":3600,\\\"status\\\":1,\\\"dial\\\":1}}\\n                            var welfareStatus = hex2bin(value.substring(6, 8)); // check status\\n                            var welfareValue = hexToDecimal(changeEndianness(value.substring(0, 6)));\\n                            var welfareTime = hexToDecimal(changeEndianness(value.substring(8, 14)));\\n                            var enalbleDisable = '';\\n                            if ((configs.ReadState.Charging == 'true') && (configs.Welfare.Mode == '1') && (configs.Welfare.EnableDisableWelfare == 'true')) { // Force Read to enable welfare when device is charging in recurrent mode\\n                                var sensibility = 'Enable, '\\n                                enalbleDisable = '1'\\n                            } else {\\n                                if (welfareStatus.substring(0, 1) == '1') {\\n                                    var sensibility = 'Enable, '\\n                                    enalbleDisable = '1'\\n                                } else {\\n                                    var sensibility = 'Disable, '\\n                                }\\n                            };\\n                            //var imei = serverParams.Imei;\\n                            //messageForReceiver = (`Sentry;ACK-WELFALERT;${imei};`);\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\n                            sensibility += ', ' + welfareValue / 60;\\n                            sensibility += ', ' + welfareTime / 60;\\n                            AddValue(codeValues, \\\"welfare\\\", sensibility);\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.EnableDisableReadWelfare, enalbleDisable);\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Prealarm, welfareTime / 60);\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Timeout, welfareValue / 60);\\n                            configsToAck.push(configIds.ReadWelfareSettings.EnableDisableReadWelfare);\\n                            configsToAck.push(configIds.ReadWelfareSettings.Prealarm);\\n                            configsToAck.push(configIds.ReadWelfareSettings.Timeout);\\n                            break;\\n                        case '73': //BeaconList\\n                            var beaconNumber = hexToDecimal(value.substring(1, 2));\\n                            var beaconStatus = hex2bin(value.substring(0, 1));\\n                            //if (beaconStatus.substring(4, 5) == '1') {\\n                            //    homeBeacon += ' Enable, '\\n                            //} else {\\n                            //    homeBeacon += ' Disable, '\\n                            //};\\n                            beaconStatus = hex_to_ascii(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 = (`Sentry;ACK-GDATA;${imei};`);\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\n                            AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\n                            configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\n                            break;\\n                        case '75': // Extra Enable control   Welfare Mode\\n                            //[Value]:80 00 00 10  last two digit for new/old welfare\\n                            //{\\\"extraControl\\\":{\\\"bit29\\\":0,\\\"bit27\\\":0,\\\"bit28\\\":1,\\\"bit25\\\":0,\\\"bit26\\\":0,\\\"flagValue\\\":268435584,\\\"bit23\\\":0,\\\"bit24\\\":0,\\\"bit21\\\":0,\\\"bit22\\\":0,\\\"bit20\\\":0,\\\"bit9\\\":0,\\\"bit18\\\":0,\\\"bit19\\\":0,\\\"bit7\\\":1,\\\"bit16\\\":0,\\\"bit8\\\":0,\\\"bit17\\\":0,\\\"bit5\\\":0,\\\"bit14\\\":0,\\\"bit6\\\":0,\\\"bit15\\\":0,\\\"bit3\\\":0,\\\"bit4\\\":0,\\\"bit1\\\":0,\\\"bit2\\\":0,\\\"bit0\\\":0,\\\"bit12\\\":0,\\\"bit13\\\":0,\\\"bit10\\\":0,\\\"bit11\\\":0,\\\"bit30\\\":0,\\\"bit31\\\":0}}\\n                            var extraStatus = hex2bin(value.substring(6, 7)).substring(7, 8);\\n                            //if (extraStatus.substring(7, 8) == '1') {\\n                            //    extra += ' Enable, '\\n                            //} else {\\n                            //    extra += ' Disable, '\\n                            //};\\n                            //beaconStatus = hex_to_ascii(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, \\\"welfare Mode\\\", extraStatus);\\n                            // messageForReceiver = (`Sentry;ACK-EXTRA;${imei};`);\\n                            // sendMessageToLocalhostNoWait(messageForReceiver);\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Mode, extraStatus);\\n                            configsToAck.push(configIds.ReadWelfareSettings.Mode);\\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 = hex_to_ascii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\n                                var wifiPassword = hex_to_ascii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\n                                var imei = serverParams.Imei;\\n                                messageForReceiver = (`Sentry;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 = hex2bin(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 = (`Sentry;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 = hex_to_ascii(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 = hex_to_ascii(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 = hex2bin(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 = hex_to_ascii(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 = (`Sentry-${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 = (`Sentry-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 = (`Sentry-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 = (`Sentry-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 = hex_to_ascii(rawFromBytes.substring(i, i + 30));\\n                AddValue(codeValues, \\\"imei\\\", imei);\\n            }\\n        }\\n    }\\n\\n    function ascii_to_hexa(str) { // ascii to hex \\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\\n    function 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\\n    function 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    }\\n\\n    function hex2bin(hex) { //\\n        return (parseInt(hex, 16).toString(2)).padStart(8, '0');\\n    }\\n\\n    function calculateCheckSum(payloadData) { // check if payload checksum is valid\\n        var checksum = byteStringToByteArray(payloadData);\\n        checksum = crc16byte(checksum);\\n        checksum = decimalToHex(checksum);\\n        checksum = ('0000' + checksum).slice(-4).toUpperCase();\\n        return changeEndianness(checksum);\\n    }\\n\\n    function 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\\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 decimalToHex(x) { // decimal to hex\\n        x = x.toString(16).toUpperCase();\\n        return x;\\n    }\\n\\n    function hex_to_ascii(str1) { // Hex to Ascii \\n        var hex = str1.toString();\\n        var str = '';\\n        for (var n = 0; n < hex.length; n += 2) {\\n            str += String.fromCharCode(parseInt(hex.substr(n, 2), 16));\\n        }\\n        return str;\\n    }\\n\\n    function hexToDecimalSigned(hex) { // hex to decimal\\n        if (hex.length % 2 != 0) {\\n            hex = \\\"0\\\" + hex;\\n        }\\n        var num = parseInt(hex, 16);\\n        var maxVal = Math.pow(2, hex.length / 2 * 8);\\n        if (num > maxVal / 2 - 1) {\\n            num = num - maxVal;\\n        }\\n        return num;\\n    }\\n\\n    function hexToDecimal(x) {\\n        x = parseInt(x, 16);\\n        return x;\\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 acceptance server the message ... ');\\n            console.log(str);\\n            server = '52.174.17.77';\\n        } else {\\n            server = '127.0.0.1';\\n        }\\n        var c = net.createConnection(5678, server);\\n        c.on('error', function(error) {\\n            c = net.createConnection(5678, server);\\n        });\\n        c.write(`${str}`);\\n        c.end();\\n    }\\n    // modify to return the object that contains your data\\n    return dataToReceiver;\\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":1744125470},{"Type":1,"NewValue":"{\"Id\":362,\"Name\":\"Access PS Sentry\",\"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    // Sentry protocol - please see variables and typical values in order below\\r\\n    // Sentry-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    // Sentry-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 N.\\r\\n    // Created: 01/01/2025\\r\\n    // Last modified: 07/04/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', 'Sentry');\\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 = (`Sentry-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 'BATCN': // Battery Charging - On\\r\\n                AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                configsToAck.push(configIds.ReadState.Charging);\\r\\n                //configs.AlertSettings.Welfare.Mode\\r\\n                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'false');\\r\\n                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'true');\\r\\n                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'false');\\r\\n                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                }\\r\\n                break;\\r\\n            case 'BATCF': // Battery Charging - Off\\r\\n                AddValue(configsToUpdate, configIds.ReadState.Charging, 'false');\\r\\n                configsToAck.push(configIds.ReadState.Charging);\\r\\n                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'true');\\r\\n                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'false');\\r\\n                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'true');\\r\\n                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                }\\r\\n                break;\\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 Sentry-')) {\\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 = (`Sentry-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 = (`Sentry;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 = (`Sentry;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 = (`Sentry-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    // 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 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\\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  ¿qué es fall OFF?\\r\\n                            if ((alarmCodeExtInt & 1) == 1) {\\r\\n                                var alarm = 'ALF-C'; // Fall-DownAlertending\\r\\n                            }\\r\\n                            // Welfare Check-out\\r\\n                            else if ((alarmCodeExtInt & 2) == 2) {\\r\\n                                var alarm = 'WSTP';\\r\\n                                if (configs.Welfare !== undefined) {\\r\\n                                    if (configs.Welfare.Mode == '1') {\\r\\n                                        info = 'Recurrent';\\r\\n                                    } else info = 'Amber';\\r\\n                                }\\r\\n                            }\\r\\n                            //Geo 5 in\\r\\n                            //else if ((alarmCodeInt & 16) == 16) {\\r\\n                            //    var alarm = 'BATL';\\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 Alert\\r\\n                            else if ((alarmCodeInt & 8) == 8) {\\r\\n                                var alarm = 'TLT';\\r\\n                            }\\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 Alert\\r\\n                            else if ((alarmCodeInt & 256) == 256) {\\r\\n                                var alarm = 'PWRF';\\r\\n                            }\\r\\n                            //Power On Alert\\r\\n                            else if ((alarmCodeInt & 512) == 512) {\\r\\n                                var alarm = 'PWRN';\\r\\n                            }\\r\\n                            //Motion Alert\\r\\n                            else if ((alarmCodeInt & 1024) == 1024) {\\r\\n                                var alarm = 'ALMOV';\\r\\n                            }\\r\\n                            //No Motion Alert\\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                            }\\r\\n                            // Side call button 1\\r\\n                            else if ((alarmCodeInt & 8192) == 8192) {\\r\\n                                var alarm = 'Side1';\\r\\n                            }\\r\\n                            // Side call button 2\\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                                /*AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                                configsToAck.push(configIds.ReadState.Charging);\\r\\n                                //configs.AlertSettings.Welfare.Mode\\r\\n                                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'false');\\r\\n                                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'true');\\r\\n                                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'false');\\r\\n                                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                                }*/\\r\\n                            }\\r\\n                            //Battery no charging\\r\\n                            else if ((alarmCodeInt & 65536) == 65536) {\\r\\n                                var alarm = 'BATCF';\\r\\n                                /* AddValue(configsToUpdate, configIds.ReadState.Charging, 'false');\\r\\n                                 configsToAck.push(configIds.ReadState.Charging);\\r\\n                                 if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                                     AddValue(configsToUpdate, configIds.ReadState.Welfare, 'true');\\r\\n                                     //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'false');\\r\\n                                     AddConfig(configsToSend, configIds.ReadState.Welfare, 'true');\\r\\n                                     configsToAck.push(configIds.ReadState.Welfare);\\r\\n                                 }*/\\r\\n                            }\\r\\n                            //Alert End\\r\\n                            else if ((alarmCodeInt & 131072) == 131072) {\\r\\n                                var alarm = 'ALA-F';\\r\\n                                if (configs.Welfare !== undefined) {\\r\\n                                    if (configs.Welfare.Mode == '1') {\\r\\n                                        info = 'Recurrent';\\r\\n                                    } else info = 'Amber';\\r\\n                                }\\r\\n                            }\\r\\n                            //Amber Alert ON    Don`t know the dfference between ALA and ALA-O\\r\\n                            else if ((alarmCodeInt & 262144) == 262144) {\\r\\n                                var alarm = 'ALA';\\r\\n                            }\\r\\n                            // welfare check in\\r\\n                            else if ((alarmCodeInt & 524288) == 524288) {\\r\\n                                var alarm = 'WTS';\\r\\n                                if (configs.Welfare !== undefined) {\\r\\n                                    if (configs.Welfare.Mode == '1') {\\r\\n                                        info = 'Recurrent';\\r\\n                                    } else info = 'Amber';\\r\\n                                }\\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\\r\\n                            else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n                                var alarm = 'ALA-W';\\r\\n                                if (configs.Welfare !== undefined) {\\r\\n                                    if (configs.Welfare.Mode == '1') {\\r\\n                                        info = 'Recurrent';\\r\\n                                    } else info = 'Amber';\\r\\n                                }\\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 != '64') {\\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 != '64') {\\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 = (`Sentry-${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 = (`Sentry-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                            if ((statusInt & 16) == 16) {\\r\\n                                statusDevice += 'Charging,';\\r\\n                                // AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                                // configsToAck.push(configIds.ReadState.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 != '64') {\\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 = (`Sentry-${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 != '64') {\\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 = (`Sentry-${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 = (`Sentry-${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 = (`Sentry-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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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                            var report;\\r\\n                            switch (contactNumber) {\\r\\n                                // Emergency Number\\r\\n                                // [Value]:80 2B 33 34 36 33 35 36 30 37 39 33 30\\r\\n                                //{\\\"number\\\":{\\\"call\\\":0,\\\"noCard\\\":0,\\\"number\\\":\\\"+34635607930\\\",\\\"enable\\\":1,\\\"sms\\\":0,\\\"index\\\":0}}\\r\\n                                case '0':\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.length < 6) { //if no telephone defined\\r\\n                                        tel = '';\\r\\n                                    }\\r\\n                                    report = hex2bin(value.substring(0, 2)); // To find report mode Call &data or DAta only\\r\\n                                    AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                                    AddValue(codeValues, \\\"ReportMode\\\", report.substring(2, 3));\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.ReportMode, report.substring(2, 3));\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.ReportMode);\\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                                    if (tel.length < 6) { //if no telephone defined\\r\\n                                        tel = '';\\r\\n                                    }\\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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 '55': // Tilt Angle Alert\\r\\n                            //[Value]:0A 00 1E 00\\r\\n                            //{\\\"tiltAlert\\\":{\\\"angle\\\":30,\\\"time\\\":10,\\\"status\\\":0,\\\"dial\\\":0}}\\r\\n                            var angle = hexToDecimal(value.substring(4, 6));\\r\\n                            var timeout = hexToDecimal(value.substring(0, 2));\\r\\n                            var status = hexToDecimal(value.substring(6, 8));\\r\\n                            if (status == 0) angle = 0;\\r\\n                            //var alertSetting = angle;\\r\\n                            //imei = serverParams.Imei;\\r\\n                            //messageForReceiver = (`Sentry;ACK-TILTANG;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"tiltangle\\\", angle);\\r\\n                            AddValue(codeValues, \\\"tiltimeout\\\", timeout);\\r\\n                            AddValue(codeValues, \\\"tiltstatus\\\", status);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltTimeout, timeout);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltAngle, angle);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltTimeout);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltAngle);\\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 = (`Sentry;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.ManDownSettings, sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.EnableDisableManDownSettings, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.Sensitivity, sesibityOptionValue);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.EnableDisableManDownSettings);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.Sensitivity);\\r\\n                            break;\\r\\n                        case '57': // Welfare\\r\\n                            // [Value]:10 0E 00 80 58 02 00 80\\r\\n                            //{\\\"welfareAlert\\\":{\\\"time\\\":600,\\\"value\\\":3600,\\\"status\\\":1,\\\"dial\\\":1}}\\r\\n                            var welfareStatus = hex2bin(value.substring(6, 8)); // check status\\r\\n                            var welfareValue = hexToDecimal(changeEndianness(value.substring(0, 6)));\\r\\n                            var welfareTime = hexToDecimal(changeEndianness(value.substring(8, 14)));\\r\\n                            var enalbleDisable = '';\\r\\n                            if ((configs.ReadState.Charging == 'true') && (configs.Welfare.Mode == '1') && (configs.Welfare.EnableDisableWelfare == 'true')) { // Force Read to enable welfare when device is charging in recurrent mode\\r\\n                                var sensibility = 'Enable, '\\r\\n                                enalbleDisable = '1'\\r\\n                            } else {\\r\\n                                if (welfareStatus.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                            };\\r\\n                            //var imei = serverParams.Imei;\\r\\n                            //messageForReceiver = (`Sentry;ACK-WELFALERT;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            sensibility += ', ' + welfareValue / 60;\\r\\n                            sensibility += ', ' + welfareTime / 60;\\r\\n                            AddValue(codeValues, \\\"welfare\\\", sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.EnableDisableReadWelfare, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Prealarm, welfareTime / 60);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Timeout, welfareValue / 60);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.EnableDisableReadWelfare);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Prealarm);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Timeout);\\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 = (`Sentry;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 '75': // Extra Enable control   Welfare Mode\\r\\n                            //[Value]:80 00 00 10  last two digit for new/old welfare\\r\\n                            //{\\\"extraControl\\\":{\\\"bit29\\\":0,\\\"bit27\\\":0,\\\"bit28\\\":1,\\\"bit25\\\":0,\\\"bit26\\\":0,\\\"flagValue\\\":268435584,\\\"bit23\\\":0,\\\"bit24\\\":0,\\\"bit21\\\":0,\\\"bit22\\\":0,\\\"bit20\\\":0,\\\"bit9\\\":0,\\\"bit18\\\":0,\\\"bit19\\\":0,\\\"bit7\\\":1,\\\"bit16\\\":0,\\\"bit8\\\":0,\\\"bit17\\\":0,\\\"bit5\\\":0,\\\"bit14\\\":0,\\\"bit6\\\":0,\\\"bit15\\\":0,\\\"bit3\\\":0,\\\"bit4\\\":0,\\\"bit1\\\":0,\\\"bit2\\\":0,\\\"bit0\\\":0,\\\"bit12\\\":0,\\\"bit13\\\":0,\\\"bit10\\\":0,\\\"bit11\\\":0,\\\"bit30\\\":0,\\\"bit31\\\":0}}\\r\\n                            var extraStatus = hex2bin(value.substring(6, 7)).substring(7, 8);\\r\\n                            //if (extraStatus.substring(7, 8) == '1') {\\r\\n                            //    extra += ' Enable, '\\r\\n                            //} else {\\r\\n                            //    extra += ' 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, \\\"welfare Mode\\\", extraStatus);\\r\\n                            // messageForReceiver = (`Sentry;ACK-EXTRA;${imei};`);\\r\\n                            // sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Mode, extraStatus);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Mode);\\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 = (`Sentry;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 = (`Sentry;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 = (`Sentry-${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 = (`Sentry-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 = (`Sentry-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 = (`Sentry-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(...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 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":1744132192},{"Type":1,"NewValue":"{\"Id\":362,\"Name\":\"Access PS Sentry\",\"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    // Sentry protocol - please see variables and typical values in order below\\r\\n    // Sentry-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    // Sentry-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 N.\\r\\n    // Created: 01/01/2025\\r\\n    // Last modified: 09/04/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', 'Sentry');\\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 = (`Sentry-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        var messageForReceiver;\\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        var message = rawFromBytes;\\r\\n        // Check if total lenght of the complete message is higher than total lenght of the first message\\r\\n        // to know if the message includes more than one\\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 longitud = message.length - 16;\\r\\n        // Loop to decode multi msg, includes \\\"AB\\\" more than one time\\r\\n        //const matches = message.match(/AB/g);\\r\\n        //if (matches && matches.length > 1) {\\r\\n        if (total_length != longitud) { //if true then the msg contains more than one msg (possible bug of the device)\\r\\n            const multiack = message.split('AB');\\r\\n            for (let i = 1; i < multiack.length; i++) {\\r\\n                message = 'AB' + multiack[i];\\r\\n                debug(message);\\r\\n                decoder(message);\\r\\n            }\\r\\n        } else decoder(message); // it contains only one msg\\r\\n        /*if (message.includes('AB00030008C7')) {// IF multiACK\\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); */\\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 'BATCN': // Battery Charging - On\\r\\n                AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                configsToAck.push(configIds.ReadState.Charging);\\r\\n                //configs.AlertSettings.Welfare.Mode\\r\\n                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'false');\\r\\n                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'true');\\r\\n                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'false');\\r\\n                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                }\\r\\n                break;\\r\\n            case 'BATCF': // Battery Charging - Off\\r\\n                AddValue(configsToUpdate, configIds.ReadState.Charging, 'false');\\r\\n                configsToAck.push(configIds.ReadState.Charging);\\r\\n                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'true');\\r\\n                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'false');\\r\\n                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'true');\\r\\n                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                }\\r\\n                break;\\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 Sentry-')) {\\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 = (`Sentry-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 = (`Sentry;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 = (`Sentry;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 = (`Sentry-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    // 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 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\\r\\n    function decoder(str) { // decode rawdata\\r\\n        // CARE Decoder\\r\\n        // AddValue(codeValues, 'Message : ', str);\\r\\n        var message = str;\\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                            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  ¿qué es fall OFF?\\r\\n                            if ((alarmCodeExtInt & 1) == 1) {\\r\\n                                var alarm = 'ALF-C'; // Fall-DownAlertending\\r\\n                            }\\r\\n                            // Welfare Check-out\\r\\n                            else if ((alarmCodeExtInt & 2) == 2) {\\r\\n                                var alarm = 'WSTP';\\r\\n                                if (configs.Welfare !== undefined) {\\r\\n                                    if (configs.Welfare.Mode == '1') {\\r\\n                                        info = 'Recurrent';\\r\\n                                    } else info = 'Amber';\\r\\n                                }\\r\\n                            }\\r\\n                            //Geo 5 in\\r\\n                            //else if ((alarmCodeInt & 16) == 16) {\\r\\n                            //    var alarm = 'BATL';\\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 Alert\\r\\n                            else if ((alarmCodeInt & 8) == 8) {\\r\\n                                var alarm = 'TLT';\\r\\n                            }\\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 Alert\\r\\n                            else if ((alarmCodeInt & 256) == 256) {\\r\\n                                var alarm = 'PWRF';\\r\\n                            }\\r\\n                            //Power On Alert\\r\\n                            else if ((alarmCodeInt & 512) == 512) {\\r\\n                                var alarm = 'PWRN';\\r\\n                            }\\r\\n                            //Motion Alert\\r\\n                            else if ((alarmCodeInt & 1024) == 1024) {\\r\\n                                var alarm = 'ALMOV';\\r\\n                            }\\r\\n                            //No Motion Alert\\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                            }\\r\\n                            // Side call button 1\\r\\n                            else if ((alarmCodeInt & 8192) == 8192) {\\r\\n                                var alarm = 'Side1';\\r\\n                            }\\r\\n                            // Side call button 2\\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                                /*AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                                configsToAck.push(configIds.ReadState.Charging);\\r\\n                                //configs.AlertSettings.Welfare.Mode\\r\\n                                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'false');\\r\\n                                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'true');\\r\\n                                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'false');\\r\\n                                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                                }*/\\r\\n                            }\\r\\n                            //Battery no charging\\r\\n                            else if ((alarmCodeInt & 65536) == 65536) {\\r\\n                                var alarm = 'BATCF';\\r\\n                                /* AddValue(configsToUpdate, configIds.ReadState.Charging, 'false');\\r\\n                                 configsToAck.push(configIds.ReadState.Charging);\\r\\n                                 if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                                     AddValue(configsToUpdate, configIds.ReadState.Welfare, 'true');\\r\\n                                     //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'false');\\r\\n                                     AddConfig(configsToSend, configIds.ReadState.Welfare, 'true');\\r\\n                                     configsToAck.push(configIds.ReadState.Welfare);\\r\\n                                 }*/\\r\\n                            }\\r\\n                            //Alert End\\r\\n                            else if ((alarmCodeInt & 131072) == 131072) {\\r\\n                                var alarm = 'ALA-F';\\r\\n                                if (configs.Welfare !== undefined) {\\r\\n                                    if (configs.Welfare.Mode == '1') {\\r\\n                                        info = 'Recurrent';\\r\\n                                    } else info = 'Amber';\\r\\n                                }\\r\\n                            }\\r\\n                            //Amber Alert ON    Don`t know the dfference between ALA and ALA-O\\r\\n                            else if ((alarmCodeInt & 262144) == 262144) {\\r\\n                                var alarm = 'ALA';\\r\\n                            }\\r\\n                            // welfare check in\\r\\n                            else if ((alarmCodeInt & 524288) == 524288) {\\r\\n                                var alarm = 'WTS';\\r\\n                                if (configs.Welfare !== undefined) {\\r\\n                                    if (configs.Welfare.Mode == '1') {\\r\\n                                        info = 'Recurrent';\\r\\n                                    } else info = 'Amber';\\r\\n                                }\\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\\r\\n                            else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n                                var alarm = 'ALA-W';\\r\\n                                if (configs.Welfare !== undefined) {\\r\\n                                    if (configs.Welfare.Mode == '1') {\\r\\n                                        info = 'Recurrent';\\r\\n                                    } else info = 'Amber';\\r\\n                                }\\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 != '64') {\\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 != '64') {\\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 = (`Sentry-${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 = (`Sentry-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                            if ((statusInt & 16) == 16) {\\r\\n                                statusDevice += 'Charging,';\\r\\n                                // AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                                // configsToAck.push(configIds.ReadState.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 != '64') {\\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 = (`Sentry-${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 != '64') {\\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 = (`Sentry-${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 = (`Sentry-${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 = (`Sentry-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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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                            var report;\\r\\n                            switch (contactNumber) {\\r\\n                                // Emergency Number\\r\\n                                // [Value]:80 2B 33 34 36 33 35 36 30 37 39 33 30\\r\\n                                //{\\\"number\\\":{\\\"call\\\":0,\\\"noCard\\\":0,\\\"number\\\":\\\"+34635607930\\\",\\\"enable\\\":1,\\\"sms\\\":0,\\\"index\\\":0}}\\r\\n                                case '0':\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.length < 6) { //if no telephone defined\\r\\n                                        tel = '';\\r\\n                                    }\\r\\n                                    report = hex2bin(value.substring(0, 2)); // To find report mode Call &data or DAta only\\r\\n                                    AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                                    AddValue(codeValues, \\\"ReportMode\\\", report.substring(2, 3));\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.ReportMode, report.substring(2, 3));\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.ReportMode);\\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                                    if (tel.length < 6) { //if no telephone defined\\r\\n                                        tel = '';\\r\\n                                    }\\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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 '55': // Tilt Angle Alert\\r\\n                            //[Value]:0A 00 1E 00\\r\\n                            //{\\\"tiltAlert\\\":{\\\"angle\\\":30,\\\"time\\\":10,\\\"status\\\":0,\\\"dial\\\":0}}\\r\\n                            var angle = hexToDecimal(value.substring(4, 6));\\r\\n                            var timeout = hexToDecimal(value.substring(0, 2));\\r\\n                            var status = hexToDecimal(value.substring(6, 8));\\r\\n                            if (status == 0) angle = 0;\\r\\n                            //var alertSetting = angle;\\r\\n                            //imei = serverParams.Imei;\\r\\n                            //messageForReceiver = (`Sentry;ACK-TILTANG;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"tiltangle\\\", angle);\\r\\n                            AddValue(codeValues, \\\"tiltimeout\\\", timeout);\\r\\n                            AddValue(codeValues, \\\"tiltstatus\\\", status);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltTimeout, timeout);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltAngle, angle);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltTimeout);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltAngle);\\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 = (`Sentry;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.ManDownSettings, sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.EnableDisableManDownSettings, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.Sensitivity, sesibityOptionValue);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.EnableDisableManDownSettings);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.Sensitivity);\\r\\n                            break;\\r\\n                        case '57': // Welfare\\r\\n                            // [Value]:10 0E 00 80 58 02 00 80\\r\\n                            //{\\\"welfareAlert\\\":{\\\"time\\\":600,\\\"value\\\":3600,\\\"status\\\":1,\\\"dial\\\":1}}\\r\\n                            var welfareStatus = hex2bin(value.substring(6, 8)); // check status\\r\\n                            var welfareValue = hexToDecimal(changeEndianness(value.substring(0, 6)));\\r\\n                            var welfareTime = hexToDecimal(changeEndianness(value.substring(8, 14)));\\r\\n                            var enalbleDisable = '';\\r\\n                            if ((configs.ReadState.Charging == 'true') && (configs.Welfare.Mode == '1') && (configs.Welfare.EnableDisableWelfare == 'true')) { // Force Read to enable welfare when device is charging in recurrent mode\\r\\n                                var sensibility = 'Enable, '\\r\\n                                enalbleDisable = '1'\\r\\n                            } else {\\r\\n                                if (welfareStatus.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                            };\\r\\n                            //var imei = serverParams.Imei;\\r\\n                            //messageForReceiver = (`Sentry;ACK-WELFALERT;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            sensibility += ', ' + welfareValue / 60;\\r\\n                            sensibility += ', ' + welfareTime / 60;\\r\\n                            AddValue(codeValues, \\\"welfare\\\", sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.EnableDisableReadWelfare, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Prealarm, welfareTime / 60);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Timeout, welfareValue / 60);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.EnableDisableReadWelfare);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Prealarm);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Timeout);\\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 = (`Sentry;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 '75': // Extra Enable control   Welfare Mode\\r\\n                            //[Value]:80 00 00 10  last two digit for new/old welfare\\r\\n                            //{\\\"extraControl\\\":{\\\"bit29\\\":0,\\\"bit27\\\":0,\\\"bit28\\\":1,\\\"bit25\\\":0,\\\"bit26\\\":0,\\\"flagValue\\\":268435584,\\\"bit23\\\":0,\\\"bit24\\\":0,\\\"bit21\\\":0,\\\"bit22\\\":0,\\\"bit20\\\":0,\\\"bit9\\\":0,\\\"bit18\\\":0,\\\"bit19\\\":0,\\\"bit7\\\":1,\\\"bit16\\\":0,\\\"bit8\\\":0,\\\"bit17\\\":0,\\\"bit5\\\":0,\\\"bit14\\\":0,\\\"bit6\\\":0,\\\"bit15\\\":0,\\\"bit3\\\":0,\\\"bit4\\\":0,\\\"bit1\\\":0,\\\"bit2\\\":0,\\\"bit0\\\":0,\\\"bit12\\\":0,\\\"bit13\\\":0,\\\"bit10\\\":0,\\\"bit11\\\":0,\\\"bit30\\\":0,\\\"bit31\\\":0}}\\r\\n                            var extraStatus = hex2bin(value.substring(6, 7)).substring(7, 8);\\r\\n                            //if (extraStatus.substring(7, 8) == '1') {\\r\\n                            //    extra += ' Enable, '\\r\\n                            //} else {\\r\\n                            //    extra += ' 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, \\\"welfare Mode\\\", extraStatus);\\r\\n                            // messageForReceiver = (`Sentry;ACK-EXTRA;${imei};`);\\r\\n                            // sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Mode, extraStatus);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Mode);\\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 = (`Sentry;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 = (`Sentry;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 = (`Sentry-${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 = (`Sentry-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 = (`Sentry-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 = (`Sentry-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(...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 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":1744226719},{"Type":1,"NewValue":"{\"Id\":362,\"Name\":\"Access PS Sentry\",\"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    // Sentry protocol - please see variables and typical values in order below\\r\\n    // Sentry-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    // Sentry-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 N.\\r\\n    // Created: 01/01/2025\\r\\n    // Last modified: 09/04/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', 'Sentry');\\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 = (`Sentry-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        var messageForReceiver;\\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        var message = rawFromBytes;\\r\\n        // Check if total lenght of the complete message is higher than total lenght of the first message\\r\\n        // to know if the message includes more than one\\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 longitud = message.length - 16;\\r\\n        // Loop to decode multi msg, includes \\\"AB\\\" more than one time\\r\\n        //const matches = message.match(/AB/g);\\r\\n        //if (matches && matches.length > 1) {\\r\\n        if (total_length != longitud) { //if true then the msg contains more than one msg (possible bug of the device)\\r\\n            const multiack = message.split('AB');\\r\\n            for (let i = 1; i < multiack.length; i++) {\\r\\n                message = 'AB' + multiack[i];\\r\\n                debug(message);\\r\\n                decoder(message);\\r\\n            }\\r\\n        } else decoder(message); // it contains only one msg\\r\\n        /*if (message.includes('AB00030008C7')) {// IF multiACK\\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); */\\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 'BATCN': // Battery Charging - On\\r\\n                AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                configsToAck.push(configIds.ReadState.Charging);\\r\\n                //configs.AlertSettings.Welfare.Mode\\r\\n                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'false');\\r\\n                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'true');\\r\\n                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'false');\\r\\n                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                }\\r\\n                break;\\r\\n            case 'BATCF': // Battery Charging - Off\\r\\n                AddValue(configsToUpdate, configIds.ReadState.Charging, 'false');\\r\\n                configsToAck.push(configIds.ReadState.Charging);\\r\\n                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'true');\\r\\n                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'false');\\r\\n                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'true');\\r\\n                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                }\\r\\n                break;\\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 Sentry-')) {\\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 = (`Sentry-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 = (`Sentry;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 = (`Sentry;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 = (`Sentry-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    // 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 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\\r\\n    function decoder(str) { // decode rawdata\\r\\n        // CARE Decoder\\r\\n        // AddValue(codeValues, 'Message : ', str);\\r\\n        var message = str;\\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                            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  ¿qué es fall OFF?\\r\\n                            if ((alarmCodeExtInt & 1) == 1) {\\r\\n                                var alarm = 'ALF-C'; // Fall-DownAlertending\\r\\n                            }\\r\\n                            // Welfare Check-out\\r\\n                            else if ((alarmCodeExtInt & 2) == 2) {\\r\\n                                var alarm = 'WSTP';\\r\\n                                if (configs.Welfare !== undefined) {\\r\\n                                    if (configs.Welfare.Mode == '1') {\\r\\n                                        info = 'Recurrent';\\r\\n                                    } else info = 'Amber';\\r\\n                                }\\r\\n                            }\\r\\n                            //Geo 5 in\\r\\n                            //else if ((alarmCodeInt & 16) == 16) {\\r\\n                            //    var alarm = 'BATL';\\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 Alert\\r\\n                            else if ((alarmCodeInt & 8) == 8) {\\r\\n                                var alarm = 'TLT';\\r\\n                            }\\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 Alert\\r\\n                            else if ((alarmCodeInt & 256) == 256) {\\r\\n                                var alarm = 'PWRF';\\r\\n                            }\\r\\n                            //Power On Alert\\r\\n                            else if ((alarmCodeInt & 512) == 512) {\\r\\n                                var alarm = 'PWRN';\\r\\n                            }\\r\\n                            //Motion Alert\\r\\n                            else if ((alarmCodeInt & 1024) == 1024) {\\r\\n                                var alarm = 'ALMOV';\\r\\n                            }\\r\\n                            //No Motion Alert\\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                            }\\r\\n                            // Side call button 1\\r\\n                            else if ((alarmCodeInt & 8192) == 8192) {\\r\\n                                var alarm = 'Side1';\\r\\n                            }\\r\\n                            // Side call button 2\\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                                /*AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                                configsToAck.push(configIds.ReadState.Charging);\\r\\n                                //configs.AlertSettings.Welfare.Mode\\r\\n                                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'false');\\r\\n                                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'true');\\r\\n                                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'false');\\r\\n                                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                                }*/\\r\\n                            }\\r\\n                            //Battery no charging\\r\\n                            else if ((alarmCodeInt & 65536) == 65536) {\\r\\n                                var alarm = 'BATCF';\\r\\n                                /* AddValue(configsToUpdate, configIds.ReadState.Charging, 'false');\\r\\n                                 configsToAck.push(configIds.ReadState.Charging);\\r\\n                                 if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                                     AddValue(configsToUpdate, configIds.ReadState.Welfare, 'true');\\r\\n                                     //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'false');\\r\\n                                     AddConfig(configsToSend, configIds.ReadState.Welfare, 'true');\\r\\n                                     configsToAck.push(configIds.ReadState.Welfare);\\r\\n                                 }*/\\r\\n                            }\\r\\n                            //Alert End\\r\\n                            else if ((alarmCodeInt & 131072) == 131072) {\\r\\n                                var alarm = 'ALA-F';\\r\\n                                if (configs.Welfare !== undefined) {\\r\\n                                    if (configs.Welfare.Mode == '1') {\\r\\n                                        info = 'Recurrent';\\r\\n                                    } else info = 'Amber';\\r\\n                                }\\r\\n                            }\\r\\n                            //Amber Alert ON    Don`t know the dfference between ALA and ALA-O\\r\\n                            else if ((alarmCodeInt & 262144) == 262144) {\\r\\n                                var alarm = 'ALA';\\r\\n                            }\\r\\n                            // welfare check in\\r\\n                            else if ((alarmCodeInt & 524288) == 524288) {\\r\\n                                var alarm = 'WTS';\\r\\n                                if (configs.Welfare !== undefined) {\\r\\n                                    if (configs.Welfare.Mode == '1') {\\r\\n                                        info = 'Recurrent';\\r\\n                                    } else info = 'Amber';\\r\\n                                }\\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\\r\\n                            else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n                                var alarm = 'ALA-W';\\r\\n                                if (configs.Welfare !== undefined) {\\r\\n                                    if (configs.Welfare.Mode == '1') {\\r\\n                                        info = 'Recurrent';\\r\\n                                    } else info = 'Amber';\\r\\n                                }\\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 != '64') {\\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                                    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 != '64') {\\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 = (`Sentry-${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 = (`Sentry-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                            if ((statusInt & 16) == 16) {\\r\\n                                statusDevice += 'Charging,';\\r\\n                                // AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                                // configsToAck.push(configIds.ReadState.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 != '64') {\\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 = (`Sentry-${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 != '64') {\\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 = (`Sentry-${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 = (`Sentry-${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 = (`Sentry-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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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                            var report;\\r\\n                            switch (contactNumber) {\\r\\n                                // Emergency Number\\r\\n                                // [Value]:80 2B 33 34 36 33 35 36 30 37 39 33 30\\r\\n                                //{\\\"number\\\":{\\\"call\\\":0,\\\"noCard\\\":0,\\\"number\\\":\\\"+34635607930\\\",\\\"enable\\\":1,\\\"sms\\\":0,\\\"index\\\":0}}\\r\\n                                case '0':\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.length < 6) { //if no telephone defined\\r\\n                                        tel = '';\\r\\n                                    }\\r\\n                                    report = hex2bin(value.substring(0, 2)); // To find report mode Call &data or DAta only\\r\\n                                    AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                                    AddValue(codeValues, \\\"ReportMode\\\", report.substring(2, 3));\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.ReportMode, report.substring(2, 3));\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.ReportMode);\\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                                    if (tel.length < 6) { //if no telephone defined\\r\\n                                        tel = '';\\r\\n                                    }\\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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 '55': // Tilt Angle Alert\\r\\n                            //[Value]:0A 00 1E 00\\r\\n                            //{\\\"tiltAlert\\\":{\\\"angle\\\":30,\\\"time\\\":10,\\\"status\\\":0,\\\"dial\\\":0}}\\r\\n                            var angle = hexToDecimal(value.substring(4, 6));\\r\\n                            var timeout = hexToDecimal(value.substring(0, 2));\\r\\n                            var status = hexToDecimal(value.substring(6, 8));\\r\\n                            if (status == 0) angle = 0;\\r\\n                            //var alertSetting = angle;\\r\\n                            //imei = serverParams.Imei;\\r\\n                            //messageForReceiver = (`Sentry;ACK-TILTANG;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"tiltangle\\\", angle);\\r\\n                            AddValue(codeValues, \\\"tiltimeout\\\", timeout);\\r\\n                            AddValue(codeValues, \\\"tiltstatus\\\", status);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltTimeout, timeout);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltAngle, angle);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltTimeout);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltAngle);\\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 = (`Sentry;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.ManDownSettings, sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.EnableDisableManDownSettings, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.Sensitivity, sesibityOptionValue);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.EnableDisableManDownSettings);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.Sensitivity);\\r\\n                            break;\\r\\n                        case '57': // Welfare\\r\\n                            // [Value]:10 0E 00 80 58 02 00 80\\r\\n                            //{\\\"welfareAlert\\\":{\\\"time\\\":600,\\\"value\\\":3600,\\\"status\\\":1,\\\"dial\\\":1}}\\r\\n                            var welfareStatus = hex2bin(value.substring(6, 8)); // check status\\r\\n                            var welfareValue = hexToDecimal(changeEndianness(value.substring(0, 6)));\\r\\n                            var welfareTime = hexToDecimal(changeEndianness(value.substring(8, 14)));\\r\\n                            var enalbleDisable = '';\\r\\n                            if ((configs.ReadState.Charging == 'true') && (configs.Welfare.Mode == '1') && (configs.Welfare.EnableDisableWelfare == 'true')) { // Force Read to enable welfare when device is charging in recurrent mode\\r\\n                                var sensibility = 'Enable, '\\r\\n                                enalbleDisable = '1'\\r\\n                            } else {\\r\\n                                if (welfareStatus.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                            };\\r\\n                            //var imei = serverParams.Imei;\\r\\n                            //messageForReceiver = (`Sentry;ACK-WELFALERT;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            sensibility += ', ' + welfareValue / 60;\\r\\n                            sensibility += ', ' + welfareTime / 60;\\r\\n                            AddValue(codeValues, \\\"welfare\\\", sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.EnableDisableReadWelfare, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Prealarm, welfareTime / 60);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Timeout, welfareValue / 60);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.EnableDisableReadWelfare);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Prealarm);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Timeout);\\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 = (`Sentry;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 '75': // Extra Enable control   Welfare Mode\\r\\n                            //[Value]:80 00 00 10  last two digit for new/old welfare\\r\\n                            //{\\\"extraControl\\\":{\\\"bit29\\\":0,\\\"bit27\\\":0,\\\"bit28\\\":1,\\\"bit25\\\":0,\\\"bit26\\\":0,\\\"flagValue\\\":268435584,\\\"bit23\\\":0,\\\"bit24\\\":0,\\\"bit21\\\":0,\\\"bit22\\\":0,\\\"bit20\\\":0,\\\"bit9\\\":0,\\\"bit18\\\":0,\\\"bit19\\\":0,\\\"bit7\\\":1,\\\"bit16\\\":0,\\\"bit8\\\":0,\\\"bit17\\\":0,\\\"bit5\\\":0,\\\"bit14\\\":0,\\\"bit6\\\":0,\\\"bit15\\\":0,\\\"bit3\\\":0,\\\"bit4\\\":0,\\\"bit1\\\":0,\\\"bit2\\\":0,\\\"bit0\\\":0,\\\"bit12\\\":0,\\\"bit13\\\":0,\\\"bit10\\\":0,\\\"bit11\\\":0,\\\"bit30\\\":0,\\\"bit31\\\":0}}\\r\\n                            var extraStatus = hex2bin(value.substring(6, 7)).substring(7, 8);\\r\\n                            //if (extraStatus.substring(7, 8) == '1') {\\r\\n                            //    extra += ' Enable, '\\r\\n                            //} else {\\r\\n                            //    extra += ' 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, \\\"welfare Mode\\\", extraStatus);\\r\\n                            // messageForReceiver = (`Sentry;ACK-EXTRA;${imei};`);\\r\\n                            // sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Mode, extraStatus);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Mode);\\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 = (`Sentry;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 = (`Sentry;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                                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 = 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 = (`Sentry-${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 = (`Sentry-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 = (`Sentry-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 = (`Sentry-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(...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 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":1744278684},{"Type":1,"NewValue":"{\"Id\":362,\"Name\":\"Access PS Sentry\",\"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    // Sentry protocol - please see variables and typical values in order below\\r\\n    // Sentry-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    // Sentry-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 N.\\r\\n    // Created: 01/01/2025\\r\\n    // Last modified: 09/04/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', 'Sentry');\\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 = (`Sentry-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        var messageForReceiver;\\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        var message = rawFromBytes;\\r\\n        // Check if total lenght of the complete message is higher than total lenght of the first message\\r\\n        // to know if the message includes more than one\\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 longitud = message.length - 16;\\r\\n        // Loop to decode multi msg, includes \\\"AB\\\" more than one time\\r\\n        //const matches = message.match(/AB/g);\\r\\n        //if (matches && matches.length > 1) {\\r\\n        if (total_length != longitud) { //if true then the msg contains more than one msg (possible bug of the device)\\r\\n            const multiack = message.split('AB');\\r\\n            for (let i = 1; i < multiack.length; i++) {\\r\\n                message = 'AB' + multiack[i];\\r\\n                debug(message);\\r\\n                decoder(message);\\r\\n            }\\r\\n        } else decoder(message); // it contains only one msg\\r\\n        /*if (message.includes('AB00030008C7')) {// IF multiACK\\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); */\\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 'BATCN': // Battery Charging - On\\r\\n                AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                configsToAck.push(configIds.ReadState.Charging);\\r\\n                //configs.AlertSettings.Welfare.Mode\\r\\n                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'false');\\r\\n                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'true');\\r\\n                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'false');\\r\\n                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                }\\r\\n                break;\\r\\n            case 'BATCF': // Battery Charging - Off\\r\\n                AddValue(configsToUpdate, configIds.ReadState.Charging, 'false');\\r\\n                configsToAck.push(configIds.ReadState.Charging);\\r\\n                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'true');\\r\\n                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'false');\\r\\n                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'true');\\r\\n                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                }\\r\\n                break;\\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 Sentry-')) {\\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 = (`Sentry-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 = (`Sentry;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 = (`Sentry;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 = (`Sentry-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    // 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 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\\r\\n    function decoder(str) { // decode rawdata\\r\\n        // CARE Decoder\\r\\n        // AddValue(codeValues, 'Message : ', str);\\r\\n        var message = str;\\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                            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  ¿qué es fall OFF?\\r\\n                            if ((alarmCodeExtInt & 1) == 1) {\\r\\n                                var alarm = 'ALF-C'; // Fall-DownAlertending\\r\\n                            }\\r\\n                            // Welfare Check-out\\r\\n                            else if ((alarmCodeExtInt & 2) == 2) {\\r\\n                                var alarm = 'WSTP';\\r\\n                                if (configs.Welfare !== undefined) {\\r\\n                                    if (configs.Welfare.Mode == '1') {\\r\\n                                        info = 'Recurrent';\\r\\n                                    } else info = 'Amber';\\r\\n                                }\\r\\n                            }\\r\\n                            //Geo 5 in\\r\\n                            //else if ((alarmCodeInt & 16) == 16) {\\r\\n                            //    var alarm = 'BATL';\\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 Alert\\r\\n                            else if ((alarmCodeInt & 8) == 8) {\\r\\n                                var alarm = 'TLT';\\r\\n                            }\\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 Alert\\r\\n                            else if ((alarmCodeInt & 256) == 256) {\\r\\n                                var alarm = 'PWRF';\\r\\n                            }\\r\\n                            //Power On Alert\\r\\n                            else if ((alarmCodeInt & 512) == 512) {\\r\\n                                var alarm = 'PWRN';\\r\\n                            }\\r\\n                            //Motion Alert\\r\\n                            else if ((alarmCodeInt & 1024) == 1024) {\\r\\n                                var alarm = 'ALMOV';\\r\\n                            }\\r\\n                            //No Motion Alert\\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                            }\\r\\n                            // Side call button 1\\r\\n                            else if ((alarmCodeInt & 8192) == 8192) {\\r\\n                                var alarm = 'Side1';\\r\\n                            }\\r\\n                            // Side call button 2\\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                                /*AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                                configsToAck.push(configIds.ReadState.Charging);\\r\\n                                //configs.AlertSettings.Welfare.Mode\\r\\n                                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'false');\\r\\n                                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'true');\\r\\n                                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'false');\\r\\n                                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                                }*/\\r\\n                            }\\r\\n                            //Battery no charging\\r\\n                            else if ((alarmCodeInt & 65536) == 65536) {\\r\\n                                var alarm = 'BATCF';\\r\\n                                /* AddValue(configsToUpdate, configIds.ReadState.Charging, 'false');\\r\\n                                 configsToAck.push(configIds.ReadState.Charging);\\r\\n                                 if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                                     AddValue(configsToUpdate, configIds.ReadState.Welfare, 'true');\\r\\n                                     //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'false');\\r\\n                                     AddConfig(configsToSend, configIds.ReadState.Welfare, 'true');\\r\\n                                     configsToAck.push(configIds.ReadState.Welfare);\\r\\n                                 }*/\\r\\n                            }\\r\\n                            //Alert End\\r\\n                            else if ((alarmCodeInt & 131072) == 131072) {\\r\\n                                var alarm = 'ALA-F';\\r\\n                                if (configs.Welfare !== undefined) {\\r\\n                                    if (configs.Welfare.Mode == '1') {\\r\\n                                        info = 'Recurrent';\\r\\n                                    } else info = 'Amber';\\r\\n                                }\\r\\n                            }\\r\\n                            //Amber Alert ON    Don`t know the dfference between ALA and ALA-O\\r\\n                            else if ((alarmCodeInt & 262144) == 262144) {\\r\\n                                var alarm = 'ALA';\\r\\n                            }\\r\\n                            // welfare check in\\r\\n                            else if ((alarmCodeInt & 524288) == 524288) {\\r\\n                                var alarm = 'WTS';\\r\\n                                if (configs.Welfare !== undefined) {\\r\\n                                    if (configs.Welfare.Mode == '1') {\\r\\n                                        info = 'Recurrent';\\r\\n                                    } else info = 'Amber';\\r\\n                                }\\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\\r\\n                            else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n                                var alarm = 'ALA-W';\\r\\n                                if (configs.Welfare !== undefined) {\\r\\n                                    if (configs.Welfare.Mode == '1') {\\r\\n                                        info = 'Recurrent';\\r\\n                                    } else info = 'Amber';\\r\\n                                }\\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 != '64') {\\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                                    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 != '64') {\\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 = (`Sentry-${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 = (`Sentry-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                            if ((statusInt & 16) == 16) {\\r\\n                                statusDevice += 'Charging,';\\r\\n                                // AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                                // configsToAck.push(configIds.ReadState.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 != '64') {\\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 = (`Sentry-${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 != '64') {\\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 = (`Sentry-${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 = (`Sentry-${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 = (`Sentry-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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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                            var report;\\r\\n                            switch (contactNumber) {\\r\\n                                // Emergency Number\\r\\n                                // [Value]:80 2B 33 34 36 33 35 36 30 37 39 33 30\\r\\n                                //{\\\"number\\\":{\\\"call\\\":0,\\\"noCard\\\":0,\\\"number\\\":\\\"+34635607930\\\",\\\"enable\\\":1,\\\"sms\\\":0,\\\"index\\\":0}}\\r\\n                                case '0':\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.length < 6) { //if no telephone defined\\r\\n                                        tel = '';\\r\\n                                    }\\r\\n                                    report = hex2bin(value.substring(0, 2)); // To find report mode Call &data or DAta only\\r\\n                                    AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                                    AddValue(codeValues, \\\"ReportMode\\\", report.substring(2, 3));\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.ReportMode, report.substring(2, 3));\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.ReportMode);\\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                                    if (tel.length < 6) { //if no telephone defined\\r\\n                                        tel = '';\\r\\n                                    }\\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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 '55': // Tilt Angle Alert\\r\\n                            //[Value]:0A 00 1E 00\\r\\n                            //{\\\"tiltAlert\\\":{\\\"angle\\\":30,\\\"time\\\":10,\\\"status\\\":0,\\\"dial\\\":0}}\\r\\n                            var angle = hexToDecimal(value.substring(4, 6));\\r\\n                            var timeout = hexToDecimal(value.substring(0, 2));\\r\\n                            var status = hexToDecimal(value.substring(6, 8));\\r\\n                            if (status == 0) angle = 0;\\r\\n                            //var alertSetting = angle;\\r\\n                            //imei = serverParams.Imei;\\r\\n                            //messageForReceiver = (`Sentry;ACK-TILTANG;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"tiltangle\\\", angle);\\r\\n                            AddValue(codeValues, \\\"tiltimeout\\\", timeout);\\r\\n                            AddValue(codeValues, \\\"tiltstatus\\\", status);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltTimeout, timeout);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltAngle, angle);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltTimeout);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltAngle);\\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 = (`Sentry;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.ManDownSettings, sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.EnableDisableManDownSettings, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.Sensitivity, sesibityOptionValue);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.EnableDisableManDownSettings);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.Sensitivity);\\r\\n                            break;\\r\\n                        case '57': // Welfare\\r\\n                            // [Value]:10 0E 00 80 58 02 00 80\\r\\n                            //{\\\"welfareAlert\\\":{\\\"time\\\":600,\\\"value\\\":3600,\\\"status\\\":1,\\\"dial\\\":1}}\\r\\n                            var welfareStatus = hex2bin(value.substring(6, 8)); // check status\\r\\n                            var welfareValue = hexToDecimal(changeEndianness(value.substring(0, 6)));\\r\\n                            var welfareTime = hexToDecimal(changeEndianness(value.substring(8, 14)));\\r\\n                            var enalbleDisable = '';\\r\\n                            if ((configs.ReadState.Charging == 'true') && (configs.Welfare.Mode == '1') && (configs.Welfare.EnableDisableWelfare == 'true')) { // Force Read to enable welfare when device is charging in recurrent mode\\r\\n                                var sensibility = 'Enable, '\\r\\n                                enalbleDisable = '1'\\r\\n                            } else {\\r\\n                                if (welfareStatus.substring(0, 1) == '1') {\\r\\n                                    var sensibility = 'Enable, '\\r\\n                                    enalbleDisable = '1'\\r\\n                                } else {\\r\\n                                    var sensibility = 'Disable, '\\r\\n                                    enalbleDisable = '0'\\r\\n                                }\\r\\n                            };\\r\\n                            //var imei = serverParams.Imei;\\r\\n                            //messageForReceiver = (`Sentry;ACK-WELFALERT;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            sensibility += welfareValue / 60;\\r\\n                            sensibility += ', ' + welfareTime / 60;\\r\\n                            AddValue(codeValues, \\\"welfare\\\", sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.EnableDisableReadWelfare, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Prealarm, welfareTime / 60);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Timeout, welfareValue / 60);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.EnableDisableReadWelfare);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Prealarm);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Timeout);\\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 = (`Sentry;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 '75': // Extra Enable control   Welfare Mode\\r\\n                            //[Value]:80 00 00 10  last two digit for new/old welfare\\r\\n                            //{\\\"extraControl\\\":{\\\"bit29\\\":0,\\\"bit27\\\":0,\\\"bit28\\\":1,\\\"bit25\\\":0,\\\"bit26\\\":0,\\\"flagValue\\\":268435584,\\\"bit23\\\":0,\\\"bit24\\\":0,\\\"bit21\\\":0,\\\"bit22\\\":0,\\\"bit20\\\":0,\\\"bit9\\\":0,\\\"bit18\\\":0,\\\"bit19\\\":0,\\\"bit7\\\":1,\\\"bit16\\\":0,\\\"bit8\\\":0,\\\"bit17\\\":0,\\\"bit5\\\":0,\\\"bit14\\\":0,\\\"bit6\\\":0,\\\"bit15\\\":0,\\\"bit3\\\":0,\\\"bit4\\\":0,\\\"bit1\\\":0,\\\"bit2\\\":0,\\\"bit0\\\":0,\\\"bit12\\\":0,\\\"bit13\\\":0,\\\"bit10\\\":0,\\\"bit11\\\":0,\\\"bit30\\\":0,\\\"bit31\\\":0}}\\r\\n                            var extraStatus = hex2bin(value.substring(6, 7)).substring(7, 8);\\r\\n                            //if (extraStatus.substring(7, 8) == '1') {\\r\\n                            //    extra += ' Enable, '\\r\\n                            //} else {\\r\\n                            //    extra += ' 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, \\\"welfare Mode\\\", extraStatus);\\r\\n                            // messageForReceiver = (`Sentry;ACK-EXTRA;${imei};`);\\r\\n                            // sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Mode, extraStatus);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Mode);\\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 = (`Sentry;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 = (`Sentry;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                                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 = 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 = (`Sentry-${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 = (`Sentry-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 = (`Sentry-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 = (`Sentry-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(...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 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":1744282084},{"Type":1,"NewValue":"{\"Id\":362,\"Name\":\"Access PS Sentry\",\"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    // Sentry protocol - please see variables and typical values in order below\\r\\n    // Sentry-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    // Sentry-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 N.\\r\\n    // Created: 01/01/2025\\r\\n    // Last modified: 09/04/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', 'Sentry');\\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 = (`Sentry-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        var messageForReceiver;\\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        var message = rawFromBytes;\\r\\n        // Check if total lenght of the complete message is higher than total lenght of the first message\\r\\n        // to know if the message includes more than one\\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 longitud = message.length - 16;\\r\\n        // Loop to decode multi msg, includes \\\"AB\\\" more than one time\\r\\n        //const matches = message.match(/AB/g);\\r\\n        //if (matches && matches.length > 1) {\\r\\n        if (total_length != longitud) { //if true then the msg contains more than one msg (possible bug of the device)\\r\\n            const multiack = message.split('AB');\\r\\n            for (let i = 1; i < multiack.length; i++) {\\r\\n                message = 'AB' + multiack[i];\\r\\n                debug(message);\\r\\n                decoder(message);\\r\\n            }\\r\\n        } else decoder(message); // it contains only one msg\\r\\n        /*if (message.includes('AB00030008C7')) {// IF multiACK\\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); */\\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 'BATCN': // Battery Charging - On\\r\\n                AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                configsToAck.push(configIds.ReadState.Charging);\\r\\n                //configs.AlertSettings.Welfare.Mode\\r\\n                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'false');\\r\\n                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'true');\\r\\n                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'false');\\r\\n                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                }\\r\\n                break;\\r\\n            case 'BATCF': // Battery Charging - Off\\r\\n                AddValue(configsToUpdate, configIds.ReadState.Charging, 'false');\\r\\n                configsToAck.push(configIds.ReadState.Charging);\\r\\n                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'true');\\r\\n                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'false');\\r\\n                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'true');\\r\\n                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                }\\r\\n                break;\\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 Sentry-')) {\\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 = (`Sentry-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 = (`Sentry;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 = (`Sentry;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 = (`Sentry-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    // 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 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\\r\\n    function decoder(str) { // decode rawdata\\r\\n        // CARE Decoder\\r\\n        // AddValue(codeValues, 'Message : ', str);\\r\\n        var message = str;\\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                            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  ¿qué es fall OFF?\\r\\n                            if ((alarmCodeExtInt & 1) == 1) {\\r\\n                                var alarm = 'ALF-C'; // Fall-DownAlertending\\r\\n                            }\\r\\n                            // Welfare Check-out\\r\\n                            else if ((alarmCodeExtInt & 2) == 2) {\\r\\n                                var alarm = 'WSTP';\\r\\n                                if (configs.Welfare !== undefined) {\\r\\n                                    if (configs.Welfare.Mode == '1') {\\r\\n                                        info = 'Recurrent';\\r\\n                                    } else info = 'Amber';\\r\\n                                }\\r\\n                            }\\r\\n                            //Geo 5 in\\r\\n                            //else if ((alarmCodeInt & 16) == 16) {\\r\\n                            //    var alarm = 'BATL';\\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 Alert\\r\\n                            else if ((alarmCodeInt & 8) == 8) {\\r\\n                                var alarm = 'TLT';\\r\\n                            }\\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 Alert\\r\\n                            else if ((alarmCodeInt & 256) == 256) {\\r\\n                                var alarm = 'PWRF';\\r\\n                            }\\r\\n                            //Power On Alert\\r\\n                            else if ((alarmCodeInt & 512) == 512) {\\r\\n                                var alarm = 'PWRN';\\r\\n                            }\\r\\n                            //Motion Alert\\r\\n                            else if ((alarmCodeInt & 1024) == 1024) {\\r\\n                                var alarm = 'ALMOV';\\r\\n                            }\\r\\n                            //No Motion Alert\\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                            }\\r\\n                            // Side call button 1\\r\\n                            else if ((alarmCodeInt & 8192) == 8192) {\\r\\n                                var alarm = 'Side1';\\r\\n                            }\\r\\n                            // Side call button 2\\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                                /*AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                                configsToAck.push(configIds.ReadState.Charging);\\r\\n                                //configs.AlertSettings.Welfare.Mode\\r\\n                                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'false');\\r\\n                                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'true');\\r\\n                                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'false');\\r\\n                                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                                }*/\\r\\n                            }\\r\\n                            //Battery no charging\\r\\n                            else if ((alarmCodeInt & 65536) == 65536) {\\r\\n                                var alarm = 'BATCF';\\r\\n                                /* AddValue(configsToUpdate, configIds.ReadState.Charging, 'false');\\r\\n                                 configsToAck.push(configIds.ReadState.Charging);\\r\\n                                 if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                                     AddValue(configsToUpdate, configIds.ReadState.Welfare, 'true');\\r\\n                                     //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'false');\\r\\n                                     AddConfig(configsToSend, configIds.ReadState.Welfare, 'true');\\r\\n                                     configsToAck.push(configIds.ReadState.Welfare);\\r\\n                                 }*/\\r\\n                            }\\r\\n                            //Alert End\\r\\n                            else if ((alarmCodeInt & 131072) == 131072) {\\r\\n                                var alarm = 'ALA-F';\\r\\n                                if (configs.Welfare !== undefined) {\\r\\n                                    if (configs.Welfare.Mode == '1') {\\r\\n                                        info = 'Recurrent';\\r\\n                                    } else info = 'Amber';\\r\\n                                }\\r\\n                            }\\r\\n                            //Amber Alert ON    Don`t know the dfference between ALA and ALA-O\\r\\n                            else if ((alarmCodeInt & 262144) == 262144) {\\r\\n                                var alarm = 'ALA';\\r\\n                            }\\r\\n                            // welfare check in\\r\\n                            else if ((alarmCodeInt & 524288) == 524288) {\\r\\n                                var alarm = 'WTS';\\r\\n                                if (configs.Welfare !== undefined) {\\r\\n                                    if (configs.Welfare.Mode == '1') {\\r\\n                                        info = 'Recurrent';\\r\\n                                    } else info = 'Amber';\\r\\n                                }\\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\\r\\n                            else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n                                var alarm = 'ALA-W';\\r\\n                                if (configs.Welfare !== undefined) {\\r\\n                                    if (configs.Welfare.Mode == '1') {\\r\\n                                        info = 'Recurrent';\\r\\n                                    } else info = 'Amber';\\r\\n                                }\\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 != '64') {\\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                                    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 != '64') {\\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 = (`Sentry-${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 = (`Sentry-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                            if ((statusInt & 16) == 16) {\\r\\n                                statusDevice += 'Charging,';\\r\\n                                // AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                                // configsToAck.push(configIds.ReadState.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 != '64') {\\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 = (`Sentry-${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 != '64') {\\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 = (`Sentry-${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 = (`Sentry-${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 = (`Sentry-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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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                            var report;\\r\\n                            switch (contactNumber) {\\r\\n                                // Emergency Number\\r\\n                                // [Value]:80 2B 33 34 36 33 35 36 30 37 39 33 30\\r\\n                                //{\\\"number\\\":{\\\"call\\\":0,\\\"noCard\\\":0,\\\"number\\\":\\\"+34635607930\\\",\\\"enable\\\":1,\\\"sms\\\":0,\\\"index\\\":0}}\\r\\n                                case '0':\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.length < 6) { //if no telephone defined\\r\\n                                        tel = '';\\r\\n                                    }\\r\\n                                    report = hex2bin(value.substring(0, 2)); // To find report mode Call &data or DAta only\\r\\n                                    AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                                    AddValue(codeValues, \\\"ReportMode\\\", report.substring(2, 3));\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.ReportMode, report.substring(2, 3));\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.ReportMode);\\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                                    if (tel.length < 6) { //if no telephone defined\\r\\n                                        tel = '';\\r\\n                                    }\\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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 '55': // Tilt Angle Alert\\r\\n                            //[Value]:0A 00 1E 00\\r\\n                            //{\\\"tiltAlert\\\":{\\\"angle\\\":30,\\\"time\\\":10,\\\"status\\\":0,\\\"dial\\\":0}}\\r\\n                            var angle = hexToDecimal(value.substring(4, 6));\\r\\n                            var timeout = hexToDecimal(value.substring(0, 2));\\r\\n                            var status = hexToDecimal(value.substring(6, 8));\\r\\n                            if (status == 0) angle = 0;\\r\\n                            //var alertSetting = angle;\\r\\n                            //imei = serverParams.Imei;\\r\\n                            //messageForReceiver = (`Sentry;ACK-TILTANG;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"tiltangle\\\", angle);\\r\\n                            AddValue(codeValues, \\\"tiltimeout\\\", timeout);\\r\\n                            AddValue(codeValues, \\\"tiltstatus\\\", status);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltTimeout, timeout);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltAngle, angle);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltTimeout);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltAngle);\\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 = (`Sentry;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.ManDownSettings, sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.EnableDisableManDownSettings, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.Sensitivity, sesibityOptionValue);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.EnableDisableManDownSettings);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.Sensitivity);\\r\\n                            break;\\r\\n                        case '57': // Welfare\\r\\n                            // [Value]:10 0E 00 80 58 02 00 80\\r\\n                            //{\\\"welfareAlert\\\":{\\\"time\\\":600,\\\"value\\\":3600,\\\"status\\\":1,\\\"dial\\\":1}}\\r\\n                            var welfareStatus = hex2bin(value.substring(6, 8)); // check status\\r\\n                            var welfareValue = hexToDecimal(changeEndianness(value.substring(0, 6)));\\r\\n                            var welfareTime = hexToDecimal(changeEndianness(value.substring(8, 14)));\\r\\n                            var enalbleDisable = '';\\r\\n                            if ((configs.ReadState.Charging == 'true') && (configs.Welfare.Mode == '1') && (configs.Welfare.EnableDisableWelfare == 'true')) { // Force Read to enable welfare when device is charging in recurrent mode\\r\\n                                var sensibility = 'Enable, '\\r\\n                                enalbleDisable = '1'\\r\\n                            } else {\\r\\n                                if (welfareStatus.substring(0, 1) == '1') {\\r\\n                                    var sensibility = 'Enable, '\\r\\n                                    enalbleDisable = '1'\\r\\n                                } else {\\r\\n                                    var sensibility = 'Disable, '\\r\\n                                    //enalbleDisable = '0'\\r\\n                                }\\r\\n                            };\\r\\n                            //var imei = serverParams.Imei;\\r\\n                            //messageForReceiver = (`Sentry;ACK-WELFALERT;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            sensibility += welfareValue / 60;\\r\\n                            sensibility += ', ' + welfareTime / 60;\\r\\n                            AddValue(codeValues, \\\"welfare\\\", sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.EnableDisableReadWelfare, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Prealarm, welfareTime / 60);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Timeout, welfareValue / 60);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.EnableDisableReadWelfare);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Prealarm);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Timeout);\\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 = (`Sentry;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 '75': // Extra Enable control   Welfare Mode\\r\\n                            //[Value]:80 00 00 10  last two digit for new/old welfare\\r\\n                            //{\\\"extraControl\\\":{\\\"bit29\\\":0,\\\"bit27\\\":0,\\\"bit28\\\":1,\\\"bit25\\\":0,\\\"bit26\\\":0,\\\"flagValue\\\":268435584,\\\"bit23\\\":0,\\\"bit24\\\":0,\\\"bit21\\\":0,\\\"bit22\\\":0,\\\"bit20\\\":0,\\\"bit9\\\":0,\\\"bit18\\\":0,\\\"bit19\\\":0,\\\"bit7\\\":1,\\\"bit16\\\":0,\\\"bit8\\\":0,\\\"bit17\\\":0,\\\"bit5\\\":0,\\\"bit14\\\":0,\\\"bit6\\\":0,\\\"bit15\\\":0,\\\"bit3\\\":0,\\\"bit4\\\":0,\\\"bit1\\\":0,\\\"bit2\\\":0,\\\"bit0\\\":0,\\\"bit12\\\":0,\\\"bit13\\\":0,\\\"bit10\\\":0,\\\"bit11\\\":0,\\\"bit30\\\":0,\\\"bit31\\\":0}}\\r\\n                            var extraStatus = hex2bin(value.substring(6, 7)).substring(7, 8);\\r\\n                            //if (extraStatus.substring(7, 8) == '1') {\\r\\n                            //    extra += ' Enable, '\\r\\n                            //} else {\\r\\n                            //    extra += ' 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, \\\"welfare Mode\\\", extraStatus);\\r\\n                            // messageForReceiver = (`Sentry;ACK-EXTRA;${imei};`);\\r\\n                            // sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Mode, extraStatus);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Mode);\\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 = (`Sentry;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 = (`Sentry;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                                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 = 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 = (`Sentry-${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 = (`Sentry-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 = (`Sentry-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 = (`Sentry-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(...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 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":1744282700},{"Type":1,"NewValue":"{\"Id\":362,\"Name\":\"Access PS Sentry\",\"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    // Sentry protocol - please see variables and typical values in order below\\r\\n    // Sentry-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    // Sentry-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 N.\\r\\n    // Created: 01/01/2025\\r\\n    // Last modified: 11/04/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', 'Sentry');\\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 = (`Sentry-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        var messageForReceiver;\\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        var message = rawFromBytes;\\r\\n        // Check if total lenght of the complete message is higher than total lenght of the first message\\r\\n        // to know if the message includes more than one\\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 longitud = message.length - 16;\\r\\n        // Loop to decode multi msg, includes \\\"AB\\\" more than one time\\r\\n        //const matches = message.match(/AB/g);\\r\\n        //if (matches && matches.length > 1) {\\r\\n        if (total_length != longitud) { //if true then the msg contains more than one msg (possible bug of the device)\\r\\n            const multiack = message.split('AB');\\r\\n            for (let i = 1; i < multiack.length; i++) {\\r\\n                message = 'AB' + multiack[i];\\r\\n                debug(message);\\r\\n                decoder(message);\\r\\n            }\\r\\n        } else decoder(message); // it contains only one msg\\r\\n        /*if (message.includes('AB00030008C7')) {// IF multiACK\\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); */\\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 'BATCN': // Battery Charging - On\\r\\n                AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                configsToAck.push(configIds.ReadState.Charging);\\r\\n                //configs.AlertSettings.Welfare.Mode\\r\\n                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'false');\\r\\n                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'true');\\r\\n                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'false');\\r\\n                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                }\\r\\n                break;\\r\\n            case 'BATCF': // Battery Charging - Off\\r\\n                AddValue(configsToUpdate, configIds.ReadState.Charging, 'false');\\r\\n                configsToAck.push(configIds.ReadState.Charging);\\r\\n                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'true');\\r\\n                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'false');\\r\\n                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'true');\\r\\n                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                }\\r\\n                break;\\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 Sentry-')) {\\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 = (`Sentry-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 = (`Sentry;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 = (`Sentry;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 = (`Sentry-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    // 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 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\\r\\n    function decoder(str) { // decode rawdata\\r\\n        // CARE Decoder\\r\\n        // AddValue(codeValues, 'Message : ', str);\\r\\n        var message = str;\\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                            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  ¿qué es fall OFF?\\r\\n                            if ((alarmCodeExtInt & 1) == 1) {\\r\\n                                var alarm = 'ALF-C'; // Fall-DownAlertending\\r\\n                            }\\r\\n                            // Welfare Check-out\\r\\n                            else if ((alarmCodeExtInt & 2) == 2) {\\r\\n                                var alarm = 'WSTP';\\r\\n                                if (configs.Welfare !== undefined) {\\r\\n                                    if (configs.Welfare.Mode == '1') {\\r\\n                                        info = 'Recurrent';\\r\\n                                    } else info = 'Amber';\\r\\n                                }\\r\\n                            }\\r\\n                            //Geo 5 in\\r\\n                            //else if ((alarmCodeInt & 16) == 16) {\\r\\n                            //    var alarm = 'BATL';\\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 Alert\\r\\n                            else if ((alarmCodeInt & 8) == 8) {\\r\\n                                var alarm = 'TLT';\\r\\n                            }\\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 Alert\\r\\n                            else if ((alarmCodeInt & 256) == 256) {\\r\\n                                var alarm = 'PWRF';\\r\\n                            }\\r\\n                            //Power On Alert\\r\\n                            else if ((alarmCodeInt & 512) == 512) {\\r\\n                                var alarm = 'PWRN';\\r\\n                            }\\r\\n                            //Motion Alert\\r\\n                            else if ((alarmCodeInt & 1024) == 1024) {\\r\\n                                var alarm = 'ALMOV';\\r\\n                            }\\r\\n                            //No Motion Alert\\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                            }\\r\\n                            // Side call button 1\\r\\n                            else if ((alarmCodeInt & 8192) == 8192) {\\r\\n                                var alarm = 'Side1';\\r\\n                            }\\r\\n                            // Side call button 2\\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                                /*AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                                configsToAck.push(configIds.ReadState.Charging);\\r\\n                                //configs.AlertSettings.Welfare.Mode\\r\\n                                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'false');\\r\\n                                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'true');\\r\\n                                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'false');\\r\\n                                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                                }*/\\r\\n                            }\\r\\n                            //Battery no charging\\r\\n                            else if ((alarmCodeInt & 65536) == 65536) {\\r\\n                                var alarm = 'BATCF';\\r\\n                                /* AddValue(configsToUpdate, configIds.ReadState.Charging, 'false');\\r\\n                                 configsToAck.push(configIds.ReadState.Charging);\\r\\n                                 if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                                     AddValue(configsToUpdate, configIds.ReadState.Welfare, 'true');\\r\\n                                     //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'false');\\r\\n                                     AddConfig(configsToSend, configIds.ReadState.Welfare, 'true');\\r\\n                                     configsToAck.push(configIds.ReadState.Welfare);\\r\\n                                 }*/\\r\\n                            }\\r\\n                            //Alert End\\r\\n                            else if ((alarmCodeInt & 131072) == 131072) {\\r\\n                                var alarm = 'ALA-F';\\r\\n                                if (configs.Welfare !== undefined) {\\r\\n                                    if (configs.Welfare.Mode == '1') {\\r\\n                                        info = 'Recurrent';\\r\\n                                    } else info = 'Amber';\\r\\n                                }\\r\\n                            }\\r\\n                            //Amber Alert ON    Don`t know the dfference between ALA and ALA-O\\r\\n                            else if ((alarmCodeInt & 262144) == 262144) {\\r\\n                                var alarm = 'ALA';\\r\\n                            }\\r\\n                            // welfare check in\\r\\n                            else if ((alarmCodeInt & 524288) == 524288) {\\r\\n                                var alarm = 'WTS';\\r\\n                                if (configs.Welfare !== undefined) {\\r\\n                                    if (configs.Welfare.Mode == '1') {\\r\\n                                        info = 'Recurrent';\\r\\n                                    } else info = 'Amber';\\r\\n                                }\\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\\r\\n                            else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n                                var alarm = 'ALA-W';\\r\\n                                if (configs.Welfare !== undefined) {\\r\\n                                    if (configs.Welfare.Mode == '1') {\\r\\n                                        info = 'Recurrent';\\r\\n                                    } else info = 'Amber';\\r\\n                                }\\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 != '64') {\\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                                    //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 != '64') {\\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 = (`Sentry-${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 = (`Sentry-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                            if ((statusInt & 16) == 16) {\\r\\n                                statusDevice += 'Charging,';\\r\\n                                // AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                                // configsToAck.push(configIds.ReadState.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 != '64') {\\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 = (`Sentry-${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 != '64') {\\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 = (`Sentry-${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 = (`Sentry-${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 = (`Sentry-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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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                            var report;\\r\\n                            switch (contactNumber) {\\r\\n                                // Emergency Number\\r\\n                                // [Value]:80 2B 33 34 36 33 35 36 30 37 39 33 30\\r\\n                                //{\\\"number\\\":{\\\"call\\\":0,\\\"noCard\\\":0,\\\"number\\\":\\\"+34635607930\\\",\\\"enable\\\":1,\\\"sms\\\":0,\\\"index\\\":0}}\\r\\n                                case '0':\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.length < 6) { //if no telephone defined\\r\\n                                        tel = '';\\r\\n                                    }\\r\\n                                    report = hex2bin(value.substring(0, 2)); // To find report mode Call &data or DAta only\\r\\n                                    AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                                    AddValue(codeValues, \\\"ReportMode\\\", report.substring(2, 3));\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.ReportMode, report.substring(2, 3));\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.ReportMode);\\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                                    if (tel.length < 6) { //if no telephone defined\\r\\n                                        tel = '';\\r\\n                                    }\\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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 '55': // Tilt Angle Alert\\r\\n                            //[Value]:0A 00 1E 00\\r\\n                            //{\\\"tiltAlert\\\":{\\\"angle\\\":30,\\\"time\\\":10,\\\"status\\\":0,\\\"dial\\\":0}}\\r\\n                            var angle = hexToDecimal(value.substring(4, 6));\\r\\n                            var timeout = hexToDecimal(value.substring(0, 2));\\r\\n                            var status = hexToDecimal(value.substring(6, 8));\\r\\n                            if (status == 0) angle = 0;\\r\\n                            //var alertSetting = angle;\\r\\n                            //imei = serverParams.Imei;\\r\\n                            //messageForReceiver = (`Sentry;ACK-TILTANG;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"tiltangle\\\", angle);\\r\\n                            AddValue(codeValues, \\\"tiltimeout\\\", timeout);\\r\\n                            AddValue(codeValues, \\\"tiltstatus\\\", status);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltTimeout, timeout);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltAngle, angle);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltTimeout);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltAngle);\\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 = (`Sentry;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.ManDownSettings, sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.EnableDisableManDownSettings, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.Sensitivity, sesibityOptionValue);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.EnableDisableManDownSettings);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.Sensitivity);\\r\\n                            break;\\r\\n                        case '57': // Welfare\\r\\n                            // [Value]:10 0E 00 80 58 02 00 80\\r\\n                            //{\\\"welfareAlert\\\":{\\\"time\\\":600,\\\"value\\\":3600,\\\"status\\\":1,\\\"dial\\\":1}}\\r\\n                            var welfareStatus = hex2bin(value.substring(6, 8)); // check status\\r\\n                            var welfareValue = hexToDecimal(changeEndianness(value.substring(0, 6)));\\r\\n                            var welfareTime = hexToDecimal(changeEndianness(value.substring(8, 14)));\\r\\n                            var enalbleDisable = '';\\r\\n                            if ((configs.ReadState.Charging == 'true') && (configs.Welfare.Mode == '1') && (configs.Welfare.EnableDisableWelfare == 'true')) { // Force Read to enable welfare when device is charging in recurrent mode\\r\\n                                var sensibility = 'Enable, '\\r\\n                                enalbleDisable = '1'\\r\\n                            } else {\\r\\n                                if (welfareStatus.substring(0, 1) == '1') {\\r\\n                                    var sensibility = 'Enable, '\\r\\n                                    enalbleDisable = '1'\\r\\n                                } else {\\r\\n                                    var sensibility = 'Disable, '\\r\\n                                    //enalbleDisable = '0'\\r\\n                                }\\r\\n                            };\\r\\n                            //var imei = serverParams.Imei;\\r\\n                            //messageForReceiver = (`Sentry;ACK-WELFALERT;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            sensibility += welfareValue / 60;\\r\\n                            sensibility += ', ' + welfareTime / 60;\\r\\n                            AddValue(codeValues, \\\"welfare\\\", sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.EnableDisableReadWelfare, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Prealarm, welfareTime / 60);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Timeout, welfareValue / 60);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.EnableDisableReadWelfare);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Prealarm);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Timeout);\\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 = (`Sentry;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 '75': // Extra Enable control   Welfare Mode\\r\\n                            //[Value]:80 00 00 10  last two digit for new/old welfare\\r\\n                            //{\\\"extraControl\\\":{\\\"bit29\\\":0,\\\"bit27\\\":0,\\\"bit28\\\":1,\\\"bit25\\\":0,\\\"bit26\\\":0,\\\"flagValue\\\":268435584,\\\"bit23\\\":0,\\\"bit24\\\":0,\\\"bit21\\\":0,\\\"bit22\\\":0,\\\"bit20\\\":0,\\\"bit9\\\":0,\\\"bit18\\\":0,\\\"bit19\\\":0,\\\"bit7\\\":1,\\\"bit16\\\":0,\\\"bit8\\\":0,\\\"bit17\\\":0,\\\"bit5\\\":0,\\\"bit14\\\":0,\\\"bit6\\\":0,\\\"bit15\\\":0,\\\"bit3\\\":0,\\\"bit4\\\":0,\\\"bit1\\\":0,\\\"bit2\\\":0,\\\"bit0\\\":0,\\\"bit12\\\":0,\\\"bit13\\\":0,\\\"bit10\\\":0,\\\"bit11\\\":0,\\\"bit30\\\":0,\\\"bit31\\\":0}}\\r\\n                            var extraStatus = hex2bin(value.substring(6, 7)).substring(7, 8);\\r\\n                            //if (extraStatus.substring(7, 8) == '1') {\\r\\n                            //    extra += ' Enable, '\\r\\n                            //} else {\\r\\n                            //    extra += ' 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, \\\"welfare Mode\\\", extraStatus);\\r\\n                            // messageForReceiver = (`Sentry;ACK-EXTRA;${imei};`);\\r\\n                            // sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Mode, extraStatus);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Mode);\\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 = (`Sentry;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 = (`Sentry;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                                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 = 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 = (`Sentry-${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 = (`Sentry-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 = (`Sentry-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 = (`Sentry-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(...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 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":1744367069},{"Type":1,"NewValue":"{\"Id\":362,\"Name\":\"Access PS Sentry\",\"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    // Sentry protocol - please see variables and typical values in order below\\r\\n    // Sentry-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    // Sentry-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 N.\\r\\n    // Created: 01/01/2025\\r\\n    // Last modified: 11/04/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', 'Sentry');\\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 = (`Sentry-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        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        // Check if total lenght of the complete message is higher than total lenght of the first message\\r\\n        // to know if the message includes more than one\\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 longitud = message.length - 16;\\r\\n        // Loop to decode multi msg, includes \\\"AB\\\" more than one time\\r\\n        //const matches = message.match(/AB/g);\\r\\n        //if (matches && matches.length > 1) {\\r\\n        if (total_length != longitud) { //if true then the msg contains more than one msg (possible bug of the device)\\r\\n            const multiack = message.split('AB');\\r\\n            for (let i = 1; i < multiack.length; i++) {\\r\\n                message = 'AB' + multiack[i];\\r\\n                debug(message);\\r\\n                decoder(message);\\r\\n            }\\r\\n        } else decoder(message); // it contains only one msg\\r\\n        /*if (message.includes('AB00030008C7')) {// IF multiACK\\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); */\\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 'BATCN': // Battery Charging - On\\r\\n                AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                configsToAck.push(configIds.ReadState.Charging);\\r\\n                //configs.AlertSettings.Welfare.Mode\\r\\n                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'false');\\r\\n                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'true');\\r\\n                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'false');\\r\\n                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                }\\r\\n                break;\\r\\n            case 'BATCF': // Battery Charging - Off\\r\\n                AddValue(configsToUpdate, configIds.ReadState.Charging, 'false');\\r\\n                configsToAck.push(configIds.ReadState.Charging);\\r\\n                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'true');\\r\\n                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'false');\\r\\n                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'true');\\r\\n                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                }\\r\\n                break;\\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 Sentry-')) {\\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 = (`Sentry-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 = (`Sentry;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 = (`Sentry;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 = (`Sentry-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    // 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        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\\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                            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  ¿qué es fall OFF?\\r\\n                            if ((alarmCodeExtInt & 1) == 1) {\\r\\n                                var alarm = 'ALF-C'; // Fall-DownAlertending\\r\\n                            }\\r\\n                            // Welfare Check-out\\r\\n                            else if ((alarmCodeExtInt & 2) == 2) {\\r\\n                                var alarm = 'WSTP';\\r\\n                                if (configs.Welfare !== undefined) {\\r\\n                                    if (configs.Welfare.Mode == '1') {\\r\\n                                        info = 'Recurrent';\\r\\n                                    } else info = 'Amber';\\r\\n                                }\\r\\n                            }\\r\\n                            //Geo 5 in\\r\\n                            //else if ((alarmCodeInt & 16) == 16) {\\r\\n                            //    var alarm = 'BATL';\\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 Alert\\r\\n                            else if ((alarmCodeInt & 8) == 8) {\\r\\n                                var alarm = 'TLT';\\r\\n                            }\\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 Alert\\r\\n                            else if ((alarmCodeInt & 256) == 256) {\\r\\n                                var alarm = 'PWRF';\\r\\n                            }\\r\\n                            //Power On Alert\\r\\n                            else if ((alarmCodeInt & 512) == 512) {\\r\\n                                var alarm = 'PWRN';\\r\\n                            }\\r\\n                            //Motion Alert\\r\\n                            else if ((alarmCodeInt & 1024) == 1024) {\\r\\n                                var alarm = 'ALMOV';\\r\\n                            }\\r\\n                            //No Motion Alert\\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                            }\\r\\n                            // Side call button 1\\r\\n                            else if ((alarmCodeInt & 8192) == 8192) {\\r\\n                                var alarm = 'Side1';\\r\\n                            }\\r\\n                            // Side call button 2\\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                                /*AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                                configsToAck.push(configIds.ReadState.Charging);\\r\\n                                //configs.AlertSettings.Welfare.Mode\\r\\n                                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'false');\\r\\n                                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'true');\\r\\n                                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'false');\\r\\n                                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                                }*/\\r\\n                            }\\r\\n                            //Battery no charging\\r\\n                            else if ((alarmCodeInt & 65536) == 65536) {\\r\\n                                var alarm = 'BATCF';\\r\\n                                /* AddValue(configsToUpdate, configIds.ReadState.Charging, 'false');\\r\\n                                 configsToAck.push(configIds.ReadState.Charging);\\r\\n                                 if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                                     AddValue(configsToUpdate, configIds.ReadState.Welfare, 'true');\\r\\n                                     //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'false');\\r\\n                                     AddConfig(configsToSend, configIds.ReadState.Welfare, 'true');\\r\\n                                     configsToAck.push(configIds.ReadState.Welfare);\\r\\n                                 }*/\\r\\n                            }\\r\\n                            //Alert End\\r\\n                            else if ((alarmCodeInt & 131072) == 131072) {\\r\\n                                var alarm = 'ALA-F';\\r\\n                                if (configs.Welfare !== undefined) {\\r\\n                                    if (configs.Welfare.Mode == '1') {\\r\\n                                        info = 'Recurrent';\\r\\n                                    } else info = 'Amber';\\r\\n                                }\\r\\n                            }\\r\\n                            //Amber Alert ON    Don`t know the dfference between ALA and ALA-O\\r\\n                            else if ((alarmCodeInt & 262144) == 262144) {\\r\\n                                var alarm = 'ALA';\\r\\n                            }\\r\\n                            // welfare check in\\r\\n                            else if ((alarmCodeInt & 524288) == 524288) {\\r\\n                                var alarm = 'WTS';\\r\\n                                if (configs.Welfare !== undefined) {\\r\\n                                    if (configs.Welfare.Mode == '1') {\\r\\n                                        info = 'Recurrent';\\r\\n                                    } else info = 'Amber';\\r\\n                                }\\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\\r\\n                            else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n                                var alarm = 'ALA-W';\\r\\n                                if (configs.Welfare !== undefined) {\\r\\n                                    if (configs.Welfare.Mode == '1') {\\r\\n                                        info = 'Recurrent';\\r\\n                                    } else info = 'Amber';\\r\\n                                }\\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 != '64') {\\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                                    //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 != '64') {\\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 = (`Sentry-${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 = (`Sentry-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                            if ((statusInt & 16) == 16) {\\r\\n                                statusDevice += 'Charging,';\\r\\n                                // AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                                // configsToAck.push(configIds.ReadState.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 != '64') {\\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 = (`Sentry-${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 != '64') {\\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 = (`Sentry-${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 = (`Sentry-${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 = (`Sentry-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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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                            var report;\\r\\n                            switch (contactNumber) {\\r\\n                                // Emergency Number\\r\\n                                // [Value]:80 2B 33 34 36 33 35 36 30 37 39 33 30\\r\\n                                //{\\\"number\\\":{\\\"call\\\":0,\\\"noCard\\\":0,\\\"number\\\":\\\"+34635607930\\\",\\\"enable\\\":1,\\\"sms\\\":0,\\\"index\\\":0}}\\r\\n                                case '0':\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.length < 6) { //if no telephone defined\\r\\n                                        tel = '';\\r\\n                                    }\\r\\n                                    report = hex2bin(value.substring(0, 2)); // To find report mode Call &data or DAta only\\r\\n                                    AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                                    AddValue(codeValues, \\\"ReportMode\\\", report.substring(2, 3));\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.ReportMode, report.substring(2, 3));\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.ReportMode);\\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                                    if (tel.length < 6) { //if no telephone defined\\r\\n                                        tel = '';\\r\\n                                    }\\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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 '55': // Tilt Angle Alert\\r\\n                            //[Value]:0A 00 1E 00\\r\\n                            //{\\\"tiltAlert\\\":{\\\"angle\\\":30,\\\"time\\\":10,\\\"status\\\":0,\\\"dial\\\":0}}\\r\\n                            var angle = hexToDecimal(value.substring(4, 6));\\r\\n                            var timeout = hexToDecimal(value.substring(0, 2));\\r\\n                            var status = hexToDecimal(value.substring(6, 8));\\r\\n                            if (status == 0) angle = 0;\\r\\n                            //var alertSetting = angle;\\r\\n                            //imei = serverParams.Imei;\\r\\n                            //messageForReceiver = (`Sentry;ACK-TILTANG;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"tiltangle\\\", angle);\\r\\n                            AddValue(codeValues, \\\"tiltimeout\\\", timeout);\\r\\n                            AddValue(codeValues, \\\"tiltstatus\\\", status);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltTimeout, timeout);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltAngle, angle);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltTimeout);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltAngle);\\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 = (`Sentry;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.ManDownSettings, sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.EnableDisableManDownSettings, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.Sensitivity, sesibityOptionValue);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.EnableDisableManDownSettings);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.Sensitivity);\\r\\n                            break;\\r\\n                        case '57': // Welfare\\r\\n                            // [Value]:10 0E 00 80 58 02 00 80\\r\\n                            //{\\\"welfareAlert\\\":{\\\"time\\\":600,\\\"value\\\":3600,\\\"status\\\":1,\\\"dial\\\":1}}\\r\\n                            var welfareStatus = hex2bin(value.substring(6, 8)); // check status\\r\\n                            var welfareValue = hexToDecimal(changeEndianness(value.substring(0, 6)));\\r\\n                            var welfareTime = hexToDecimal(changeEndianness(value.substring(8, 14)));\\r\\n                            var enalbleDisable = '';\\r\\n                            if ((configs.ReadState.Charging == 'true') && (configs.Welfare.Mode == '1') && (configs.Welfare.EnableDisableWelfare == 'true')) { // Force Read to enable welfare when device is charging in recurrent mode\\r\\n                                var sensibility = 'Enable, '\\r\\n                                enalbleDisable = '1'\\r\\n                            } else {\\r\\n                                if (welfareStatus.substring(0, 1) == '1') {\\r\\n                                    var sensibility = 'Enable, '\\r\\n                                    enalbleDisable = '1'\\r\\n                                } else {\\r\\n                                    var sensibility = 'Disable, '\\r\\n                                    //enalbleDisable = '0'\\r\\n                                }\\r\\n                            };\\r\\n                            //var imei = serverParams.Imei;\\r\\n                            //messageForReceiver = (`Sentry;ACK-WELFALERT;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            sensibility += welfareValue / 60;\\r\\n                            sensibility += ', ' + welfareTime / 60;\\r\\n                            AddValue(codeValues, \\\"welfare\\\", sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.EnableDisableReadWelfare, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Prealarm, welfareTime / 60);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Timeout, welfareValue / 60);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.EnableDisableReadWelfare);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Prealarm);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Timeout);\\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 = (`Sentry;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 '75': // Extra Enable control   Welfare Mode\\r\\n                            //[Value]:80 00 00 10  last two digit for new/old welfare\\r\\n                            //{\\\"extraControl\\\":{\\\"bit29\\\":0,\\\"bit27\\\":0,\\\"bit28\\\":1,\\\"bit25\\\":0,\\\"bit26\\\":0,\\\"flagValue\\\":268435584,\\\"bit23\\\":0,\\\"bit24\\\":0,\\\"bit21\\\":0,\\\"bit22\\\":0,\\\"bit20\\\":0,\\\"bit9\\\":0,\\\"bit18\\\":0,\\\"bit19\\\":0,\\\"bit7\\\":1,\\\"bit16\\\":0,\\\"bit8\\\":0,\\\"bit17\\\":0,\\\"bit5\\\":0,\\\"bit14\\\":0,\\\"bit6\\\":0,\\\"bit15\\\":0,\\\"bit3\\\":0,\\\"bit4\\\":0,\\\"bit1\\\":0,\\\"bit2\\\":0,\\\"bit0\\\":0,\\\"bit12\\\":0,\\\"bit13\\\":0,\\\"bit10\\\":0,\\\"bit11\\\":0,\\\"bit30\\\":0,\\\"bit31\\\":0}}\\r\\n                            var extraStatus = hex2bin(value.substring(6, 7)).substring(7, 8);\\r\\n                            //if (extraStatus.substring(7, 8) == '1') {\\r\\n                            //    extra += ' Enable, '\\r\\n                            //} else {\\r\\n                            //    extra += ' 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, \\\"welfare Mode\\\", extraStatus);\\r\\n                            // messageForReceiver = (`Sentry;ACK-EXTRA;${imei};`);\\r\\n                            // sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Mode, extraStatus);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Mode);\\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 = (`Sentry;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 = (`Sentry;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                            //    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 = 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 = (`Sentry-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 = (`Sentry-${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 = (`Sentry-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 = (`Sentry-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 = (`Sentry-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(...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 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":1744387710},{"Type":1,"NewValue":"{\"Id\":362,\"Name\":\"Access PS Sentry\",\"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    // Sentry protocol - please see variables and typical values in order below\\r\\n    // Sentry-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    // Sentry-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 N.\\r\\n    // Created: 01/01/2025\\r\\n    // Last modified: 11/04/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', 'Sentry');\\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 = (`Sentry-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        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        // Check if total lenght of the complete message is higher than total lenght of the first message\\r\\n        // to know if the message includes more than one\\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 longitud = message.length - 16;\\r\\n        // Loop to decode multi msg, includes \\\"AB\\\" more than one time\\r\\n        //const matches = message.match(/AB/g);\\r\\n        //if (matches && matches.length > 1) {\\r\\n        if (total_length != longitud) { //if true then the msg contains more than one msg (possible bug of the device)\\r\\n            const multiack = message.split('AB');\\r\\n            for (let i = 1; i < multiack.length; i++) {\\r\\n                message = 'AB' + multiack[i];\\r\\n                debug(message);\\r\\n                decoder(message);\\r\\n            }\\r\\n        } else decoder(message); // it contains only one msg\\r\\n        /*if (message.includes('AB00030008C7')) {// IF multiACK\\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); */\\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 'BATCN': // Battery Charging - On\\r\\n                AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                configsToAck.push(configIds.ReadState.Charging);\\r\\n                //configs.AlertSettings.Welfare.Mode\\r\\n                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'false');\\r\\n                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'true');\\r\\n                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'false');\\r\\n                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                }\\r\\n                break;\\r\\n            case 'BATCF': // Battery Charging - Off\\r\\n                AddValue(configsToUpdate, configIds.ReadState.Charging, 'false');\\r\\n                configsToAck.push(configIds.ReadState.Charging);\\r\\n                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'true');\\r\\n                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'false');\\r\\n                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'true');\\r\\n                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                }\\r\\n                break;\\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 Sentry-')) {\\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 = (`Sentry-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 = (`Sentry;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 = (`Sentry;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 = (`Sentry-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    // 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        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\\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                            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  ¿qué es fall OFF?\\r\\n                            if ((alarmCodeExtInt & 1) == 1) {\\r\\n                                var alarm = 'ALF-C'; // Fall-DownAlertending\\r\\n                            }\\r\\n                            // Welfare Check-out\\r\\n                            else if ((alarmCodeExtInt & 2) == 2) {\\r\\n                                var alarm = 'WSTP';\\r\\n                                if (configs.Welfare !== undefined) {\\r\\n                                    if (configs.Welfare.Mode == '1') {\\r\\n                                        info = 'Recurrent';\\r\\n                                    } else info = 'Amber';\\r\\n                                }\\r\\n                            }\\r\\n                            //Geo 5 in\\r\\n                            //else if ((alarmCodeInt & 16) == 16) {\\r\\n                            //    var alarm = 'BATL';\\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 Alert\\r\\n                            else if ((alarmCodeInt & 8) == 8) {\\r\\n                                var alarm = 'TLT';\\r\\n                            }\\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 Alert\\r\\n                            else if ((alarmCodeInt & 256) == 256) {\\r\\n                                var alarm = 'PWRF';\\r\\n                            }\\r\\n                            //Power On Alert\\r\\n                            else if ((alarmCodeInt & 512) == 512) {\\r\\n                                var alarm = 'PWRN';\\r\\n                            }\\r\\n                            //Motion Alert\\r\\n                            else if ((alarmCodeInt & 1024) == 1024) {\\r\\n                                var alarm = 'ALMOV';\\r\\n                            }\\r\\n                            //No Motion Alert\\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                            }\\r\\n                            // Side call button 1\\r\\n                            else if ((alarmCodeInt & 8192) == 8192) {\\r\\n                                var alarm = 'Side1';\\r\\n                            }\\r\\n                            // Side call button 2\\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                                /*AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                                configsToAck.push(configIds.ReadState.Charging);\\r\\n                                //configs.AlertSettings.Welfare.Mode\\r\\n                                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'false');\\r\\n                                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'true');\\r\\n                                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'false');\\r\\n                                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                                }*/\\r\\n                            }\\r\\n                            //Battery no charging\\r\\n                            else if ((alarmCodeInt & 65536) == 65536) {\\r\\n                                var alarm = 'BATCF';\\r\\n                                /* AddValue(configsToUpdate, configIds.ReadState.Charging, 'false');\\r\\n                                 configsToAck.push(configIds.ReadState.Charging);\\r\\n                                 if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                                     AddValue(configsToUpdate, configIds.ReadState.Welfare, 'true');\\r\\n                                     //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'false');\\r\\n                                     AddConfig(configsToSend, configIds.ReadState.Welfare, 'true');\\r\\n                                     configsToAck.push(configIds.ReadState.Welfare);\\r\\n                                 }*/\\r\\n                            }\\r\\n                            //Alert End\\r\\n                            else if ((alarmCodeInt & 131072) == 131072) {\\r\\n                                var alarm = 'ALA-F';\\r\\n                                info = 'Alarm Finished';\\r\\n                                //if (configs.Welfare !== undefined) {\\r\\n                                //    if (configs.Welfare.Mode == '1') {\\r\\n                                //        info = 'Recurrent';\\r\\n                                //    } else info = 'Amber';\\r\\n                                //}\\r\\n                            }\\r\\n                            //Amber Alert ON    Don`t know the dfference between ALA and ALA-O\\r\\n                            else if ((alarmCodeInt & 262144) == 262144) {\\r\\n                                var alarm = 'ALA';\\r\\n                            }\\r\\n                            // welfare check in\\r\\n                            else if ((alarmCodeInt & 524288) == 524288) {\\r\\n                                var alarm = 'WTS';\\r\\n                                if (configs.Welfare !== undefined) {\\r\\n                                    if (configs.Welfare.Mode == '1') {\\r\\n                                        info = 'Recurrent';\\r\\n                                    } else info = 'Amber';\\r\\n                                }\\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\\r\\n                            else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n                                var alarm = 'ALA-W';\\r\\n                                if (configs.Welfare !== undefined) {\\r\\n                                    if (configs.Welfare.Mode == '1') {\\r\\n                                        info = 'Recurrent';\\r\\n                                    } else info = 'Amber';\\r\\n                                }\\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 != '64') {\\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                                    //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 != '64') {\\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 = (`Sentry-${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 = (`Sentry-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                            if ((statusInt & 16) == 16) {\\r\\n                                statusDevice += 'Charging,';\\r\\n                                // AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                                // configsToAck.push(configIds.ReadState.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 != '64') {\\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 = (`Sentry-${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 != '64') {\\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 = (`Sentry-${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 = (`Sentry-${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 = (`Sentry-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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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                            var report;\\r\\n                            switch (contactNumber) {\\r\\n                                // Emergency Number\\r\\n                                // [Value]:80 2B 33 34 36 33 35 36 30 37 39 33 30\\r\\n                                //{\\\"number\\\":{\\\"call\\\":0,\\\"noCard\\\":0,\\\"number\\\":\\\"+34635607930\\\",\\\"enable\\\":1,\\\"sms\\\":0,\\\"index\\\":0}}\\r\\n                                case '0':\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.length < 6) { //if no telephone defined\\r\\n                                        tel = '';\\r\\n                                    }\\r\\n                                    report = hex2bin(value.substring(0, 2)); // To find report mode Call &data or DAta only\\r\\n                                    AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                                    AddValue(codeValues, \\\"ReportMode\\\", report.substring(2, 3));\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.ReportMode, report.substring(2, 3));\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.ReportMode);\\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                                    if (tel.length < 6) { //if no telephone defined\\r\\n                                        tel = '';\\r\\n                                    }\\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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 '55': // Tilt Angle Alert\\r\\n                            //[Value]:0A 00 1E 00\\r\\n                            //{\\\"tiltAlert\\\":{\\\"angle\\\":30,\\\"time\\\":10,\\\"status\\\":0,\\\"dial\\\":0}}\\r\\n                            var angle = hexToDecimal(value.substring(4, 6));\\r\\n                            var timeout = hexToDecimal(value.substring(0, 2));\\r\\n                            var status = hexToDecimal(value.substring(6, 8));\\r\\n                            if (status == 0) angle = 0;\\r\\n                            //var alertSetting = angle;\\r\\n                            //imei = serverParams.Imei;\\r\\n                            //messageForReceiver = (`Sentry;ACK-TILTANG;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"tiltangle\\\", angle);\\r\\n                            AddValue(codeValues, \\\"tiltimeout\\\", timeout);\\r\\n                            AddValue(codeValues, \\\"tiltstatus\\\", status);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltTimeout, timeout);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltAngle, angle);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltTimeout);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltAngle);\\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 = (`Sentry;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.ManDownSettings, sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.EnableDisableManDownSettings, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.Sensitivity, sesibityOptionValue);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.EnableDisableManDownSettings);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.Sensitivity);\\r\\n                            break;\\r\\n                        case '57': // Welfare\\r\\n                            // [Value]:10 0E 00 80 58 02 00 80\\r\\n                            //{\\\"welfareAlert\\\":{\\\"time\\\":600,\\\"value\\\":3600,\\\"status\\\":1,\\\"dial\\\":1}}\\r\\n                            var welfareStatus = hex2bin(value.substring(6, 8)); // check status\\r\\n                            var welfareValue = hexToDecimal(changeEndianness(value.substring(0, 6)));\\r\\n                            var welfareTime = hexToDecimal(changeEndianness(value.substring(8, 14)));\\r\\n                            var enalbleDisable = '';\\r\\n                            if ((configs.ReadState.Charging == 'true') && (configs.Welfare.Mode == '1') && (configs.Welfare.EnableDisableWelfare == 'true')) { // Force Read to enable welfare when device is charging in recurrent mode\\r\\n                                var sensibility = 'Enable, '\\r\\n                                enalbleDisable = '1'\\r\\n                            } else {\\r\\n                                if (welfareStatus.substring(0, 1) == '1') {\\r\\n                                    var sensibility = 'Enable, '\\r\\n                                    enalbleDisable = '1'\\r\\n                                } else {\\r\\n                                    var sensibility = 'Disable, '\\r\\n                                    //enalbleDisable = '0'\\r\\n                                }\\r\\n                            };\\r\\n                            //var imei = serverParams.Imei;\\r\\n                            //messageForReceiver = (`Sentry;ACK-WELFALERT;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            sensibility += welfareValue / 60;\\r\\n                            sensibility += ', ' + welfareTime / 60;\\r\\n                            AddValue(codeValues, \\\"welfare\\\", sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.EnableDisableReadWelfare, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Prealarm, welfareTime / 60);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Timeout, welfareValue / 60);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.EnableDisableReadWelfare);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Prealarm);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Timeout);\\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 = (`Sentry;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 '75': // Extra Enable control   Welfare Mode\\r\\n                            //[Value]:80 00 00 10  last two digit for new/old welfare\\r\\n                            //{\\\"extraControl\\\":{\\\"bit29\\\":0,\\\"bit27\\\":0,\\\"bit28\\\":1,\\\"bit25\\\":0,\\\"bit26\\\":0,\\\"flagValue\\\":268435584,\\\"bit23\\\":0,\\\"bit24\\\":0,\\\"bit21\\\":0,\\\"bit22\\\":0,\\\"bit20\\\":0,\\\"bit9\\\":0,\\\"bit18\\\":0,\\\"bit19\\\":0,\\\"bit7\\\":1,\\\"bit16\\\":0,\\\"bit8\\\":0,\\\"bit17\\\":0,\\\"bit5\\\":0,\\\"bit14\\\":0,\\\"bit6\\\":0,\\\"bit15\\\":0,\\\"bit3\\\":0,\\\"bit4\\\":0,\\\"bit1\\\":0,\\\"bit2\\\":0,\\\"bit0\\\":0,\\\"bit12\\\":0,\\\"bit13\\\":0,\\\"bit10\\\":0,\\\"bit11\\\":0,\\\"bit30\\\":0,\\\"bit31\\\":0}}\\r\\n                            var extraStatus = hex2bin(value.substring(6, 7)).substring(7, 8);\\r\\n                            //if (extraStatus.substring(7, 8) == '1') {\\r\\n                            //    extra += ' Enable, '\\r\\n                            //} else {\\r\\n                            //    extra += ' 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, \\\"welfare Mode\\\", extraStatus);\\r\\n                            // messageForReceiver = (`Sentry;ACK-EXTRA;${imei};`);\\r\\n                            // sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Mode, extraStatus);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Mode);\\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 = (`Sentry;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 = (`Sentry;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                            //    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 = 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 = (`Sentry-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 = (`Sentry-${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 = (`Sentry-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 = (`Sentry-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 = (`Sentry-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(...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 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":1744734130},{"Type":1,"NewValue":"{\"Id\":362,\"Name\":\"Access PS Sentry\",\"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    // Sentry protocol - please see variables and typical values in order below\\r\\n    // Sentry-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    // Sentry-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 N.\\r\\n    // Created: 01/01/2025\\r\\n    // Last modified: 11/04/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', 'Sentry');\\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 = (`Sentry-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        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        // Check if total lenght of the complete message is higher than total lenght of the first message\\r\\n        // to know if the message includes more than one\\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 longitud = message.length - 16;\\r\\n        // Loop to decode multi msg, includes \\\"AB\\\" more than one time\\r\\n        //const matches = message.match(/AB/g);\\r\\n        //if (matches && matches.length > 1) {\\r\\n        if (total_length != longitud) { //if true then the msg contains more than one msg (possible bug of the device)\\r\\n            const multiack = message.split('AB');\\r\\n            for (let i = 1; i < multiack.length; i++) {\\r\\n                message = 'AB' + multiack[i];\\r\\n                debug(message);\\r\\n                decoder(message);\\r\\n            }\\r\\n        } else decoder(message); // it contains only one msg\\r\\n        /*if (message.includes('AB00030008C7')) {// IF multiACK\\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); */\\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 'BATCN': // Battery Charging - On\\r\\n                AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                configsToAck.push(configIds.ReadState.Charging);\\r\\n                //configs.AlertSettings.Welfare.Mode\\r\\n                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'false');\\r\\n                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'true');\\r\\n                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'false');\\r\\n                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                }\\r\\n                break;\\r\\n            case 'BATCF': // Battery Charging - Off\\r\\n                AddValue(configsToUpdate, configIds.ReadState.Charging, 'false');\\r\\n                configsToAck.push(configIds.ReadState.Charging);\\r\\n                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'true');\\r\\n                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'false');\\r\\n                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'true');\\r\\n                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                }\\r\\n                break;\\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 Sentry-')) {\\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 = (`Sentry-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 = (`Sentry;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 = (`Sentry;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 = (`Sentry-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    // 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        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\\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                            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  ¿qué es fall OFF?\\r\\n                            if ((alarmCodeExtInt & 1) == 1) {\\r\\n                                var alarm = 'ALF-C'; // Fall-DownAlertending\\r\\n                            }\\r\\n                            // Welfare Check-out\\r\\n                            else if ((alarmCodeExtInt & 2) == 2) {\\r\\n                                var alarm = 'WSTP';\\r\\n                                if (configs.Welfare !== undefined) {\\r\\n                                    if (configs.Welfare.Mode == '1') {\\r\\n                                        info = 'Recurrent';\\r\\n                                    } else info = 'Amber';\\r\\n                                }\\r\\n                            }\\r\\n                            //Geo 5 in\\r\\n                            //else if ((alarmCodeInt & 16) == 16) {\\r\\n                            //    var alarm = 'BATL';\\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 Alert\\r\\n                            else if ((alarmCodeInt & 8) == 8) {\\r\\n                                var alarm = 'TLT';\\r\\n                            }\\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 Alert\\r\\n                            else if ((alarmCodeInt & 256) == 256) {\\r\\n                                var alarm = 'PWRF';\\r\\n                            }\\r\\n                            //Power On Alert\\r\\n                            else if ((alarmCodeInt & 512) == 512) {\\r\\n                                var alarm = 'PWRN';\\r\\n                            }\\r\\n                            //Motion Alert\\r\\n                            else if ((alarmCodeInt & 1024) == 1024) {\\r\\n                                var alarm = 'ALMOV';\\r\\n                            }\\r\\n                            //No Motion Alert\\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                            }\\r\\n                            // Side call button 1\\r\\n                            else if ((alarmCodeInt & 8192) == 8192) {\\r\\n                                var alarm = 'Side1';\\r\\n                            }\\r\\n                            // Side call button 2\\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                                /*AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                                configsToAck.push(configIds.ReadState.Charging);\\r\\n                                //configs.AlertSettings.Welfare.Mode\\r\\n                                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'false');\\r\\n                                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'true');\\r\\n                                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'false');\\r\\n                                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                                }*/\\r\\n                            }\\r\\n                            //Battery no charging\\r\\n                            else if ((alarmCodeInt & 65536) == 65536) {\\r\\n                                var alarm = 'BATCF';\\r\\n                                /* AddValue(configsToUpdate, configIds.ReadState.Charging, 'false');\\r\\n                                 configsToAck.push(configIds.ReadState.Charging);\\r\\n                                 if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                                     AddValue(configsToUpdate, configIds.ReadState.Welfare, 'true');\\r\\n                                     //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'false');\\r\\n                                     AddConfig(configsToSend, configIds.ReadState.Welfare, 'true');\\r\\n                                     configsToAck.push(configIds.ReadState.Welfare);\\r\\n                                 }*/\\r\\n                            }\\r\\n                            //Alert End\\r\\n                            else if ((alarmCodeInt & 131072) == 131072) {\\r\\n                                var alarm = 'ALA-F';\\r\\n                                info = 'Alarm Finished';\\r\\n                                //if (configs.Welfare !== undefined) {\\r\\n                                //    if (configs.Welfare.Mode == '1') {\\r\\n                                //        info = 'Recurrent';\\r\\n                                //    } else info = 'Amber';\\r\\n                                //}\\r\\n                            }\\r\\n                            //Amber Alert ON    Don`t know the dfference between ALA and ALA-O\\r\\n                            else if ((alarmCodeInt & 262144) == 262144) {\\r\\n                                var alarm = 'ALA';\\r\\n                            }\\r\\n                            // welfare check in\\r\\n                            else if ((alarmCodeInt & 524288) == 524288) {\\r\\n                                var alarm = 'WTS';\\r\\n                                if (configs.Welfare !== undefined) {\\r\\n                                    if (configs.Welfare.Mode == '1') {\\r\\n                                        info = 'Recurrent';\\r\\n                                    } else info = 'Amber';\\r\\n                                }\\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\\r\\n                            else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n                                var alarm = 'ALA-W';\\r\\n                                if (configs.Welfare !== undefined) {\\r\\n                                    if (configs.Welfare.Mode == '1') {\\r\\n                                        info = 'Recurrent';\\r\\n                                    } else info = 'Amber';\\r\\n                                }\\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 != '64') {\\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                                    //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 != '64') {\\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 = (`Sentry-${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 = (`Sentry-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                            if ((statusInt & 16) == 16) {\\r\\n                                statusDevice += 'Charging,';\\r\\n                                // AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                                // configsToAck.push(configIds.ReadState.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 != '64') {\\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 = (`Sentry-${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 != '64') {\\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 = (`Sentry-${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 = (`Sentry-${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 = (`Sentry-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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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                                var allow = 'true';\\r\\n                            } else var allow = 'false';\\r\\n                            // To find LT setup\\r\\n                            if (statusPhone.substring(5, 6) == '1') { // 1 Enable\\r\\n                                var silentCall = 'true';\\r\\n                            } else var silentCall = '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                            AddValue(configsToUpdate, configIds.ReadProfiles.SilentCallMode, silentCall);\\r\\n                            //configsToAck.push(configIds.ReadSystemSettings.Statusphone);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AllowList);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AutoAnswer);\\r\\n                            configsToAck.push(configIds.ReadProfiles.SilentCallMode);\\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                            var report;\\r\\n                            switch (contactNumber) {\\r\\n                                // Emergency Number\\r\\n                                // [Value]:80 2B 33 34 36 33 35 36 30 37 39 33 30\\r\\n                                //{\\\"number\\\":{\\\"call\\\":0,\\\"noCard\\\":0,\\\"number\\\":\\\"+34635607930\\\",\\\"enable\\\":1,\\\"sms\\\":0,\\\"index\\\":0}}\\r\\n                                case '0':\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.length < 6) { //if no telephone defined\\r\\n                                        tel = '';\\r\\n                                    }\\r\\n                                    report = hex2bin(value.substring(0, 2)); // To find report mode Call &data or DAta only\\r\\n                                    AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                                    AddValue(codeValues, \\\"ReportMode\\\", report.substring(2, 3));\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.ReportMode, report.substring(2, 3));\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.ReportMode);\\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                                    if (tel.length < 6) { //if no telephone defined\\r\\n                                        tel = '';\\r\\n                                    }\\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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 '55': // Tilt Angle Alert\\r\\n                            //[Value]:0A 00 1E 00\\r\\n                            //{\\\"tiltAlert\\\":{\\\"angle\\\":30,\\\"time\\\":10,\\\"status\\\":0,\\\"dial\\\":0}}\\r\\n                            var angle = hexToDecimal(value.substring(4, 6));\\r\\n                            var timeout = hexToDecimal(value.substring(0, 2));\\r\\n                            var status = hexToDecimal(value.substring(6, 8));\\r\\n                            if (status == 0) angle = 0;\\r\\n                            //var alertSetting = angle;\\r\\n                            //imei = serverParams.Imei;\\r\\n                            //messageForReceiver = (`Sentry;ACK-TILTANG;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"tiltangle\\\", angle);\\r\\n                            AddValue(codeValues, \\\"tiltimeout\\\", timeout);\\r\\n                            AddValue(codeValues, \\\"tiltstatus\\\", status);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltTimeout, timeout);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltAngle, angle);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltTimeout);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltAngle);\\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 = (`Sentry;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.ManDownSettings, sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.EnableDisableManDownSettings, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.Sensitivity, sesibityOptionValue);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.EnableDisableManDownSettings);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.Sensitivity);\\r\\n                            break;\\r\\n                        case '57': // Welfare\\r\\n                            // [Value]:10 0E 00 80 58 02 00 80\\r\\n                            //{\\\"welfareAlert\\\":{\\\"time\\\":600,\\\"value\\\":3600,\\\"status\\\":1,\\\"dial\\\":1}}\\r\\n                            var welfareStatus = hex2bin(value.substring(6, 8)); // check status\\r\\n                            var welfareValue = hexToDecimal(changeEndianness(value.substring(0, 6)));\\r\\n                            var welfareTime = hexToDecimal(changeEndianness(value.substring(8, 14)));\\r\\n                            var enalbleDisable = '';\\r\\n                            if ((configs.ReadState.Charging == 'true') && (configs.Welfare.Mode == '1') && (configs.Welfare.EnableDisableWelfare == 'true')) { // Force Read to enable welfare when device is charging in recurrent mode\\r\\n                                var sensibility = 'Enable, '\\r\\n                                enalbleDisable = '1'\\r\\n                            } else {\\r\\n                                if (welfareStatus.substring(0, 1) == '1') {\\r\\n                                    var sensibility = 'Enable, '\\r\\n                                    enalbleDisable = '1'\\r\\n                                } else {\\r\\n                                    var sensibility = 'Disable, '\\r\\n                                    //enalbleDisable = '0'\\r\\n                                }\\r\\n                            };\\r\\n                            //var imei = serverParams.Imei;\\r\\n                            //messageForReceiver = (`Sentry;ACK-WELFALERT;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            sensibility += welfareValue / 60;\\r\\n                            sensibility += ', ' + welfareTime / 60;\\r\\n                            AddValue(codeValues, \\\"welfare\\\", sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.EnableDisableReadWelfare, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Prealarm, welfareTime / 60);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Timeout, welfareValue / 60);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.EnableDisableReadWelfare);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Prealarm);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Timeout);\\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 = (`Sentry;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 '75': // Extra Enable control   Welfare Mode\\r\\n                            //[Value]:80 00 00 10  last two digit for new/old welfare\\r\\n                            //{\\\"extraControl\\\":{\\\"bit29\\\":0,\\\"bit27\\\":0,\\\"bit28\\\":1,\\\"bit25\\\":0,\\\"bit26\\\":0,\\\"flagValue\\\":268435584,\\\"bit23\\\":0,\\\"bit24\\\":0,\\\"bit21\\\":0,\\\"bit22\\\":0,\\\"bit20\\\":0,\\\"bit9\\\":0,\\\"bit18\\\":0,\\\"bit19\\\":0,\\\"bit7\\\":1,\\\"bit16\\\":0,\\\"bit8\\\":0,\\\"bit17\\\":0,\\\"bit5\\\":0,\\\"bit14\\\":0,\\\"bit6\\\":0,\\\"bit15\\\":0,\\\"bit3\\\":0,\\\"bit4\\\":0,\\\"bit1\\\":0,\\\"bit2\\\":0,\\\"bit0\\\":0,\\\"bit12\\\":0,\\\"bit13\\\":0,\\\"bit10\\\":0,\\\"bit11\\\":0,\\\"bit30\\\":0,\\\"bit31\\\":0}}\\r\\n                            var extraStatus = hex2bin(value.substring(6, 7)).substring(7, 8);\\r\\n                            //if (extraStatus.substring(7, 8) == '1') {\\r\\n                            //    extra += ' Enable, '\\r\\n                            //} else {\\r\\n                            //    extra += ' 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, \\\"welfare Mode\\\", extraStatus);\\r\\n                            // messageForReceiver = (`Sentry;ACK-EXTRA;${imei};`);\\r\\n                            // sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Mode, extraStatus);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Mode);\\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 = (`Sentry;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 = (`Sentry;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                            //    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 = 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 = (`Sentry-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 = (`Sentry-${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 = (`Sentry-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 = (`Sentry-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 = (`Sentry-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(...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 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":1746732242},{"Type":1,"NewValue":"{\"Id\":362,\"Name\":\"Access PS Sentry\",\"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    // Sentry protocol - please see variables and typical values in order below\\r\\n    // Sentry-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    // Sentry-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 N.\\r\\n    // Created: 01/01/2025\\r\\n    // Last modified: 19/05/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', 'Sentry');\\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 = (`Sentry-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        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        // Check if total lenght of the complete message is higher than total lenght of the first message\\r\\n        // to know if the message includes more than one\\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 longitud = message.length - 16;\\r\\n        // Loop to decode multi msg, includes \\\"AB\\\" more than one time\\r\\n        //const matches = message.match(/AB/g);\\r\\n        //if (matches && matches.length > 1) {\\r\\n        if (total_length != longitud) { //if true then the msg contains more than one msg (possible bug of the device)\\r\\n            const multiack = message.split('AB');\\r\\n            for (let i = 1; i < multiack.length; i++) {\\r\\n                message = 'AB' + multiack[i];\\r\\n                debug(message);\\r\\n                decoder(message);\\r\\n            }\\r\\n        } else decoder(message); // it contains only one msg\\r\\n        /*if (message.includes('AB00030008C7')) {// IF multiACK\\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); */\\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 'BATCN': // Battery Charging - On\\r\\n                AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                configsToAck.push(configIds.ReadState.Charging);\\r\\n                //configs.AlertSettings.Welfare.Mode\\r\\n                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'false');\\r\\n                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'true');\\r\\n                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'false');\\r\\n                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                }\\r\\n                break;\\r\\n            case 'BATCF': // Battery Charging - Off\\r\\n                AddValue(configsToUpdate, configIds.ReadState.Charging, 'false');\\r\\n                configsToAck.push(configIds.ReadState.Charging);\\r\\n                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'true');\\r\\n                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'false');\\r\\n                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'true');\\r\\n                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                }\\r\\n                break;\\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 Sentry-')) {\\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 = (`Sentry-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 = (`Sentry;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 = (`Sentry;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 = (`Sentry-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    // 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        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\\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                            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  ¿qué es fall OFF?\\r\\n                            if ((alarmCodeExtInt & 1) == 1) {\\r\\n                                var alarm = 'ALF-C'; // Fall-DownAlertending\\r\\n                            }\\r\\n                            // Welfare Check-out\\r\\n                            else if ((alarmCodeExtInt & 2) == 2) {\\r\\n                                var alarm = 'WSTP';\\r\\n                                if (configs.Welfare !== undefined) {\\r\\n                                    if (configs.Welfare.Mode == '1') {\\r\\n                                        info = 'Recurrent';\\r\\n                                    } else info = 'Amber';\\r\\n                                }\\r\\n                            }\\r\\n                            //Geo 5 in\\r\\n                            //else if ((alarmCodeInt & 16) == 16) {\\r\\n                            //    var alarm = 'BATL';\\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 Alert\\r\\n                            else if ((alarmCodeInt & 8) == 8) {\\r\\n                                var alarm = 'TLT';\\r\\n                            }\\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 Alert\\r\\n                            else if ((alarmCodeInt & 256) == 256) {\\r\\n                                var alarm = 'PWRF';\\r\\n                            }\\r\\n                            //Power On Alert\\r\\n                            else if ((alarmCodeInt & 512) == 512) {\\r\\n                                var alarm = 'PWRN';\\r\\n                            }\\r\\n                            //Motion Alert\\r\\n                            else if ((alarmCodeInt & 1024) == 1024) {\\r\\n                                var alarm = 'ALMOV';\\r\\n                            }\\r\\n                            //No Motion Alert\\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                            }\\r\\n                            // Side call button 1\\r\\n                            else if ((alarmCodeInt & 8192) == 8192) {\\r\\n                                var alarm = 'Side1';\\r\\n                            }\\r\\n                            // Side call button 2\\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                                /*AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                                configsToAck.push(configIds.ReadState.Charging);\\r\\n                                //configs.AlertSettings.Welfare.Mode\\r\\n                                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'false');\\r\\n                                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'true');\\r\\n                                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'false');\\r\\n                                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                                }*/\\r\\n                            }\\r\\n                            //Battery no charging\\r\\n                            else if ((alarmCodeInt & 65536) == 65536) {\\r\\n                                var alarm = 'BATCF';\\r\\n                                /* AddValue(configsToUpdate, configIds.ReadState.Charging, 'false');\\r\\n                                 configsToAck.push(configIds.ReadState.Charging);\\r\\n                                 if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                                     AddValue(configsToUpdate, configIds.ReadState.Welfare, 'true');\\r\\n                                     //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'false');\\r\\n                                     AddConfig(configsToSend, configIds.ReadState.Welfare, 'true');\\r\\n                                     configsToAck.push(configIds.ReadState.Welfare);\\r\\n                                 }*/\\r\\n                            }\\r\\n                            //Alert End\\r\\n                            else if ((alarmCodeInt & 131072) == 131072) {\\r\\n                                var alarm = 'ALA-F';\\r\\n                                info = 'Alarm Finished';\\r\\n                                //if (configs.Welfare !== undefined) {\\r\\n                                //    if (configs.Welfare.Mode == '1') {\\r\\n                                //        info = 'Recurrent';\\r\\n                                //    } else info = 'Amber';\\r\\n                                //}\\r\\n                            }\\r\\n                            //Amber Alert ON    Don`t know the dfference between ALA and ALA-O\\r\\n                            else if ((alarmCodeInt & 262144) == 262144) {\\r\\n                                var alarm = 'ALA';\\r\\n                            }\\r\\n                            // welfare check in\\r\\n                            else if ((alarmCodeInt & 524288) == 524288) {\\r\\n                                var alarm = 'WTS';\\r\\n                                if (configs.Welfare !== undefined) {\\r\\n                                    if (configs.Welfare.Mode == '1') {\\r\\n                                        info = 'Recurrent';\\r\\n                                    } else info = 'Amber';\\r\\n                                }\\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\\r\\n                            else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n                                var alarm = 'ALA-W';\\r\\n                                if (configs.Welfare !== undefined) {\\r\\n                                    if (configs.Welfare.Mode == '1') {\\r\\n                                        info = 'Recurrent';\\r\\n                                    } else info = 'Amber';\\r\\n                                }\\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 != '64') {\\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                                    //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 != '64') {\\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 = (`Sentry-${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 = (`Sentry-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                            if ((statusInt & 16) == 16) {\\r\\n                                statusDevice += 'Charging,';\\r\\n                                // AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                                // configsToAck.push(configIds.ReadState.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 != '64') {\\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 = (`Sentry-${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 != '64') {\\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 = (`Sentry-${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 = (`Sentry-${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 = (`Sentry-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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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                                var allow = 'true';\\r\\n                            } else var allow = 'false';\\r\\n                            // To find LT setup\\r\\n                            if (statusPhone.substring(5, 6) == '1') { // 1 Enable\\r\\n                                var silentCall = 'true';\\r\\n                            } else var silentCall = '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                            AddValue(configsToUpdate, configIds.ReadProfiles.SilentCallMode, silentCall);\\r\\n                            //configsToAck.push(configIds.ReadSystemSettings.Statusphone);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AllowList);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AutoAnswer);\\r\\n                            configsToAck.push(configIds.ReadProfiles.SilentCallMode);\\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                            var report;\\r\\n                            switch (contactNumber) {\\r\\n                                // Emergency Number\\r\\n                                // [Value]:80 2B 33 34 36 33 35 36 30 37 39 33 30\\r\\n                                //{\\\"number\\\":{\\\"call\\\":0,\\\"noCard\\\":0,\\\"number\\\":\\\"+34635607930\\\",\\\"enable\\\":1,\\\"sms\\\":0,\\\"index\\\":0}}\\r\\n                                case '0':\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.length < 6) { //if no telephone defined\\r\\n                                        tel = '';\\r\\n                                    }\\r\\n                                    report = hex2bin(value.substring(0, 2)); // To find report mode Call &data or DAta only\\r\\n                                    AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                                    AddValue(codeValues, \\\"ReportMode\\\", report.substring(2, 3));\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.ReportMode, report.substring(2, 3));\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.ReportMode);\\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                                    if (tel.length < 6) { //if no telephone defined\\r\\n                                        tel = '';\\r\\n                                    }\\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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 '55': // Tilt Angle Alert\\r\\n                            //[Value]:0A 00 1E 00\\r\\n                            //{\\\"tiltAlert\\\":{\\\"angle\\\":30,\\\"time\\\":10,\\\"status\\\":0,\\\"dial\\\":0}}\\r\\n                            var angle = hexToDecimal(value.substring(4, 6));\\r\\n                            var timeout = hexToDecimal(value.substring(0, 2));\\r\\n                            var status = hexToDecimal(value.substring(6, 8));\\r\\n                            if (status == 0) angle = 0;\\r\\n                            //var alertSetting = angle;\\r\\n                            //imei = serverParams.Imei;\\r\\n                            //messageForReceiver = (`Sentry;ACK-TILTANG;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"tiltangle\\\", angle);\\r\\n                            AddValue(codeValues, \\\"tiltimeout\\\", timeout);\\r\\n                            AddValue(codeValues, \\\"tiltstatus\\\", status);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltTimeout, timeout);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltAngle, angle);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltTimeout);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltAngle);\\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 = (`Sentry;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.ManDownSettings, sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.EnableDisableManDownSettings, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.Sensitivity, sesibityOptionValue);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.EnableDisableManDownSettings);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.Sensitivity);\\r\\n                            break;\\r\\n                        case '57': // Welfare\\r\\n                            // [Value]:10 0E 00 80 58 02 00 80\\r\\n                            //{\\\"welfareAlert\\\":{\\\"time\\\":600,\\\"value\\\":3600,\\\"status\\\":1,\\\"dial\\\":1}}\\r\\n                            var welfareStatus = hex2bin(value.substring(6, 8)); // check status\\r\\n                            var welfareValue = hexToDecimal(changeEndianness(value.substring(0, 6)));\\r\\n                            var welfareTime = hexToDecimal(changeEndianness(value.substring(8, 14)));\\r\\n                            var enalbleDisable = '';\\r\\n                            if ((configs.ReadState.Charging == 'true') && (configs.Welfare.Mode == '1') && (configs.Welfare.EnableDisableWelfare == 'true')) { // Force Read to enable welfare when device is charging in recurrent mode\\r\\n                                var sensibility = 'Enable, '\\r\\n                                enalbleDisable = '1'\\r\\n                            } else {\\r\\n                                if (welfareStatus.substring(0, 1) == '1') {\\r\\n                                    var sensibility = 'Enable, '\\r\\n                                    enalbleDisable = '1'\\r\\n                                } else {\\r\\n                                    var sensibility = 'Disable, '\\r\\n                                    //enalbleDisable = '0'\\r\\n                                }\\r\\n                            };\\r\\n                            //var imei = serverParams.Imei;\\r\\n                            //messageForReceiver = (`Sentry;ACK-WELFALERT;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            sensibility += welfareValue / 60;\\r\\n                            sensibility += ', ' + welfareTime / 60;\\r\\n                            AddValue(codeValues, \\\"welfare\\\", sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.EnableDisableReadWelfare, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Prealarm, welfareTime / 60);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Timeout, welfareValue / 60);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.EnableDisableReadWelfare);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Prealarm);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Timeout);\\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 = (`Sentry;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 '75': // Extra Enable control   Welfare Mode\\r\\n                            //[Value]:80 00 00 10  last two digit for new/old welfare\\r\\n                            //{\\\"extraControl\\\":{\\\"bit29\\\":0,\\\"bit27\\\":0,\\\"bit28\\\":1,\\\"bit25\\\":0,\\\"bit26\\\":0,\\\"flagValue\\\":268435584,\\\"bit23\\\":0,\\\"bit24\\\":0,\\\"bit21\\\":0,\\\"bit22\\\":0,\\\"bit20\\\":0,\\\"bit9\\\":0,\\\"bit18\\\":0,\\\"bit19\\\":0,\\\"bit7\\\":1,\\\"bit16\\\":0,\\\"bit8\\\":0,\\\"bit17\\\":0,\\\"bit5\\\":0,\\\"bit14\\\":0,\\\"bit6\\\":0,\\\"bit15\\\":0,\\\"bit3\\\":0,\\\"bit4\\\":0,\\\"bit1\\\":0,\\\"bit2\\\":0,\\\"bit0\\\":0,\\\"bit12\\\":0,\\\"bit13\\\":0,\\\"bit10\\\":0,\\\"bit11\\\":0,\\\"bit30\\\":0,\\\"bit31\\\":0}}\\r\\n                            var extraStatus = hex2bin(value.substring(6, 7)).substring(7, 8);\\r\\n                            //if (extraStatus.substring(7, 8) == '1') {\\r\\n                            //    extra += ' Enable, '\\r\\n                            //} else {\\r\\n                            //    extra += ' 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, \\\"welfare Mode\\\", extraStatus);\\r\\n                            // messageForReceiver = (`Sentry;ACK-EXTRA;${imei};`);\\r\\n                            // sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Mode, extraStatus);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Mode);\\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 = (`Sentry;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                            var triggerMode = '';\\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                            triggerMode = status.substring(2, 3);\\r\\n                            if (triggerMode == '1') {\\r\\n                                alertSetting += 'Double Press, '\\r\\n                            } else {\\r\\n                                alertSetting += 'Long Press, '\\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 = (`Sentry;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.ReadIntefaceOptions.SpeedActivationDialButton, triggerMode);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n                            configsToAck.push(configIds.ReadIntefaceOptions.SpeedActivationDialButton);\\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                            //    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 = 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 = (`Sentry-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 = (`Sentry-${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 = (`Sentry-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 = (`Sentry-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 = (`Sentry-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(...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 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":1747657660},{"Type":1,"NewValue":"{\"Id\":362,\"Name\":\"Access PS Sentry\",\"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    // Sentry protocol - please see variables and typical values in order below\\r\\n    // Sentry-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    // Sentry-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 N.\\r\\n    // Created: 01/01/2025\\r\\n    // Last modified: 19/05/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', 'Sentry');\\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 = (`Sentry-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        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        // Check if total lenght of the complete message is higher than total lenght of the first message\\r\\n        // to know if the message includes more than one\\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 longitud = message.length - 16;\\r\\n        // Loop to decode multi msg, includes \\\"AB\\\" more than one time\\r\\n        //const matches = message.match(/AB/g);\\r\\n        //if (matches && matches.length > 1) {\\r\\n        if (total_length != longitud) { //if true then the msg contains more than one msg (possible bug of the device)\\r\\n            const multiack = message.split('AB');\\r\\n            for (let i = 1; i < multiack.length; i++) {\\r\\n                message = 'AB' + multiack[i];\\r\\n                debug(message);\\r\\n                decoder(message);\\r\\n            }\\r\\n        } else decoder(message); // it contains only one msg\\r\\n        /*if (message.includes('AB00030008C7')) {// IF multiACK\\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); */\\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 'BATCN': // Battery Charging - On\\r\\n                AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                configsToAck.push(configIds.ReadState.Charging);\\r\\n                //configs.AlertSettings.Welfare.Mode\\r\\n                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'false');\\r\\n                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'true');\\r\\n                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'false');\\r\\n                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                }\\r\\n                break;\\r\\n            case 'BATCF': // Battery Charging - Off\\r\\n                AddValue(configsToUpdate, configIds.ReadState.Charging, 'false');\\r\\n                configsToAck.push(configIds.ReadState.Charging);\\r\\n                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'true');\\r\\n                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'false');\\r\\n                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'true');\\r\\n                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                }\\r\\n                break;\\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 Sentry-')) {\\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 = (`Sentry-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 = (`Sentry;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 = (`Sentry;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 = (`Sentry-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    // 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        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\\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                            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  ¿qué es fall OFF?\\r\\n                            if ((alarmCodeExtInt & 1) == 1) {\\r\\n                                var alarm = 'ALF-C'; // Fall-DownAlertending\\r\\n                            }\\r\\n                            // Welfare Check-out\\r\\n                            else if ((alarmCodeExtInt & 2) == 2) {\\r\\n                                var alarm = 'WSTP';\\r\\n                                if (configs.Welfare !== undefined) {\\r\\n                                    if (configs.Welfare.Mode == '1') {\\r\\n                                        info = 'Recurrent';\\r\\n                                    } else info = 'Amber';\\r\\n                                }\\r\\n                            }\\r\\n                            //Geo 5 in\\r\\n                            //else if ((alarmCodeInt & 16) == 16) {\\r\\n                            //    var alarm = 'BATL';\\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 Alert\\r\\n                            else if ((alarmCodeInt & 8) == 8) {\\r\\n                                var alarm = 'TLT';\\r\\n                            }\\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 Alert\\r\\n                            else if ((alarmCodeInt & 256) == 256) {\\r\\n                                var alarm = 'PWRF';\\r\\n                            }\\r\\n                            //Power On Alert\\r\\n                            else if ((alarmCodeInt & 512) == 512) {\\r\\n                                var alarm = 'PWRN';\\r\\n                            }\\r\\n                            //Motion Alert\\r\\n                            else if ((alarmCodeInt & 1024) == 1024) {\\r\\n                                var alarm = 'ALMOV';\\r\\n                            }\\r\\n                            //No Motion Alert\\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                            }\\r\\n                            // Side call button 1\\r\\n                            else if ((alarmCodeInt & 8192) == 8192) {\\r\\n                                var alarm = 'Side1';\\r\\n                            }\\r\\n                            // Side call button 2\\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                                /*AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                                configsToAck.push(configIds.ReadState.Charging);\\r\\n                                //configs.AlertSettings.Welfare.Mode\\r\\n                                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'false');\\r\\n                                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'true');\\r\\n                                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'false');\\r\\n                                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                                }*/\\r\\n                            }\\r\\n                            //Battery no charging\\r\\n                            else if ((alarmCodeInt & 65536) == 65536) {\\r\\n                                var alarm = 'BATCF';\\r\\n                                /* AddValue(configsToUpdate, configIds.ReadState.Charging, 'false');\\r\\n                                 configsToAck.push(configIds.ReadState.Charging);\\r\\n                                 if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                                     AddValue(configsToUpdate, configIds.ReadState.Welfare, 'true');\\r\\n                                     //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'false');\\r\\n                                     AddConfig(configsToSend, configIds.ReadState.Welfare, 'true');\\r\\n                                     configsToAck.push(configIds.ReadState.Welfare);\\r\\n                                 }*/\\r\\n                            }\\r\\n                            //Alert End\\r\\n                            else if ((alarmCodeInt & 131072) == 131072) {\\r\\n                                var alarm = 'ALA-F';\\r\\n                                info = 'Alarm Finished';\\r\\n                                //if (configs.Welfare !== undefined) {\\r\\n                                //    if (configs.Welfare.Mode == '1') {\\r\\n                                //        info = 'Recurrent';\\r\\n                                //    } else info = 'Amber';\\r\\n                                //}\\r\\n                            }\\r\\n                            //Amber Alert ON    Don`t know the dfference between ALA and ALA-O\\r\\n                            else if ((alarmCodeInt & 262144) == 262144) {\\r\\n                                var alarm = 'ALA';\\r\\n                            }\\r\\n                            // welfare check in\\r\\n                            else if ((alarmCodeInt & 524288) == 524288) {\\r\\n                                var alarm = 'WTS';\\r\\n                                if (configs.Welfare !== undefined) {\\r\\n                                    if (configs.Welfare.Mode == '1') {\\r\\n                                        info = 'Recurrent';\\r\\n                                    } else info = 'Amber';\\r\\n                                }\\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\\r\\n                            else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n                                var alarm = 'ALA-W';\\r\\n                                if (configs.Welfare !== undefined) {\\r\\n                                    if (configs.Welfare.Mode == '1') {\\r\\n                                        info = 'Recurrent';\\r\\n                                    } else info = 'Amber';\\r\\n                                }\\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 != '64') {\\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                                    //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 != '64') {\\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 = (`Sentry-${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 = (`Sentry-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                            if ((statusInt & 16) == 16) {\\r\\n                                statusDevice += 'Charging,';\\r\\n                                // AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                                // configsToAck.push(configIds.ReadState.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 != '64') {\\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 = (`Sentry-${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 != '64') {\\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 = (`Sentry-${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 = (`Sentry-${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 = (`Sentry-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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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                                var allow = 'true';\\r\\n                            } else var allow = 'false';\\r\\n                            // To find LT setup\\r\\n                            if (statusPhone.substring(5, 6) == '1') { // 1 Enable\\r\\n                                var silentCall = 'true';\\r\\n                            } else var silentCall = '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                            AddValue(configsToUpdate, configIds.ReadProfiles.SilentCallMode, silentCall);\\r\\n                            //configsToAck.push(configIds.ReadSystemSettings.Statusphone);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AllowList);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AutoAnswer);\\r\\n                            configsToAck.push(configIds.ReadProfiles.SilentCallMode);\\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                            var report;\\r\\n                            switch (contactNumber) {\\r\\n                                // Emergency Number\\r\\n                                // [Value]:80 2B 33 34 36 33 35 36 30 37 39 33 30\\r\\n                                //{\\\"number\\\":{\\\"call\\\":0,\\\"noCard\\\":0,\\\"number\\\":\\\"+34635607930\\\",\\\"enable\\\":1,\\\"sms\\\":0,\\\"index\\\":0}}\\r\\n                                case '0':\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.length < 6) { //if no telephone defined\\r\\n                                        tel = '';\\r\\n                                    }\\r\\n                                    report = hex2bin(value.substring(0, 2)); // To find report mode Call &data or DAta only\\r\\n                                    AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                                    AddValue(codeValues, \\\"ReportMode\\\", report.substring(2, 3));\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.ReportMode, report.substring(2, 3));\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.ReportMode);\\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                                    if (tel.length < 6) { //if no telephone defined\\r\\n                                        tel = '';\\r\\n                                    }\\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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 '55': // Tilt Angle Alert\\r\\n                            //[Value]:0A 00 1E 00\\r\\n                            //{\\\"tiltAlert\\\":{\\\"angle\\\":30,\\\"time\\\":10,\\\"status\\\":0,\\\"dial\\\":0}}\\r\\n                            var angle = hexToDecimal(value.substring(4, 6));\\r\\n                            var timeout = hexToDecimal(value.substring(0, 2));\\r\\n                            var status = hexToDecimal(value.substring(6, 8));\\r\\n                            if (status == 0) angle = 0;\\r\\n                            //var alertSetting = angle;\\r\\n                            //imei = serverParams.Imei;\\r\\n                            //messageForReceiver = (`Sentry;ACK-TILTANG;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"tiltangle\\\", angle);\\r\\n                            AddValue(codeValues, \\\"tiltimeout\\\", timeout);\\r\\n                            AddValue(codeValues, \\\"tiltstatus\\\", status);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltTimeout, timeout);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltAngle, angle);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltTimeout);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltAngle);\\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 = (`Sentry;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.ManDownSettings, sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.EnableDisableManDownSettings, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.Sensitivity, sesibityOptionValue);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.EnableDisableManDownSettings);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.Sensitivity);\\r\\n                            break;\\r\\n                        case '57': // Welfare\\r\\n                            // [Value]:10 0E 00 80 58 02 00 80\\r\\n                            //{\\\"welfareAlert\\\":{\\\"time\\\":600,\\\"value\\\":3600,\\\"status\\\":1,\\\"dial\\\":1}}\\r\\n                            var welfareStatus = hex2bin(value.substring(6, 8)); // check status\\r\\n                            var welfareValue = hexToDecimal(changeEndianness(value.substring(0, 6)));\\r\\n                            var welfareTime = hexToDecimal(changeEndianness(value.substring(8, 14)));\\r\\n                            var enalbleDisable = '';\\r\\n                            if ((configs.ReadState.Charging == 'true') && (configs.Welfare.Mode == '1') && (configs.Welfare.EnableDisableWelfare == 'true')) { // Force Read to enable welfare when device is charging in recurrent mode\\r\\n                                var sensibility = 'Enable, '\\r\\n                                enalbleDisable = '1'\\r\\n                            } else {\\r\\n                                if (welfareStatus.substring(0, 1) == '1') {\\r\\n                                    var sensibility = 'Enable, '\\r\\n                                    enalbleDisable = '1'\\r\\n                                } else {\\r\\n                                    var sensibility = 'Disable, '\\r\\n                                    //enalbleDisable = '0'\\r\\n                                }\\r\\n                            };\\r\\n                            //var imei = serverParams.Imei;\\r\\n                            //messageForReceiver = (`Sentry;ACK-WELFALERT;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            sensibility += welfareValue / 60;\\r\\n                            sensibility += ', ' + welfareTime / 60;\\r\\n                            AddValue(codeValues, \\\"welfare\\\", sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.EnableDisableReadWelfare, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Prealarm, welfareTime / 60);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Timeout, welfareValue / 60);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.EnableDisableReadWelfare);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Prealarm);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Timeout);\\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 = (`Sentry;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 '75': // Extra Enable control   Welfare Mode\\r\\n                            //[Value]:80 00 00 10  last two digit for new/old welfare\\r\\n                            //{\\\"extraControl\\\":{\\\"bit29\\\":0,\\\"bit27\\\":0,\\\"bit28\\\":1,\\\"bit25\\\":0,\\\"bit26\\\":0,\\\"flagValue\\\":268435584,\\\"bit23\\\":0,\\\"bit24\\\":0,\\\"bit21\\\":0,\\\"bit22\\\":0,\\\"bit20\\\":0,\\\"bit9\\\":0,\\\"bit18\\\":0,\\\"bit19\\\":0,\\\"bit7\\\":1,\\\"bit16\\\":0,\\\"bit8\\\":0,\\\"bit17\\\":0,\\\"bit5\\\":0,\\\"bit14\\\":0,\\\"bit6\\\":0,\\\"bit15\\\":0,\\\"bit3\\\":0,\\\"bit4\\\":0,\\\"bit1\\\":0,\\\"bit2\\\":0,\\\"bit0\\\":0,\\\"bit12\\\":0,\\\"bit13\\\":0,\\\"bit10\\\":0,\\\"bit11\\\":0,\\\"bit30\\\":0,\\\"bit31\\\":0}}\\r\\n                            var extraStatus = hex2bin(value.substring(6, 7)).substring(7, 8);\\r\\n                            //if (extraStatus.substring(7, 8) == '1') {\\r\\n                            //    extra += ' Enable, '\\r\\n                            //} else {\\r\\n                            //    extra += ' 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, \\\"welfare Mode\\\", extraStatus);\\r\\n                            // messageForReceiver = (`Sentry;ACK-EXTRA;${imei};`);\\r\\n                            // sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Mode, extraStatus);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Mode);\\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 = (`Sentry;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                            var triggerMode = '';\\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                            triggerMode = status.substring(2, 3);\\r\\n                            if (triggerMode == '1') {\\r\\n                                alertSetting += 'Double Press, '\\r\\n                            } else {\\r\\n                                alertSetting += 'Long Press, '\\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 = (`Sentry;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.ReadInterfaceOptions.SpeedActivationDialButton, triggerMode);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n                            configsToAck.push(configIds.ReadInterfaceOptions.SpeedActivationDialButton);\\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                            //    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 = 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 = (`Sentry-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 = (`Sentry-${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 = (`Sentry-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 = (`Sentry-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 = (`Sentry-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(...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 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":1747658925},{"Type":1,"NewValue":"{\"Id\":362,\"Name\":\"Access PS Sentry\",\"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    // Sentry protocol - please see variables and typical values in order below\\r\\n    // Sentry-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    // Sentry-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 N.\\r\\n    // Created: 01/01/2025\\r\\n    // Last modified: 19/05/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', 'Sentry');\\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 = (`Sentry-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        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        // Check if total lenght of the complete message is higher than total lenght of the first message\\r\\n        // to know if the message includes more than one\\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 longitud = message.length - 16;\\r\\n        // Loop to decode multi msg, includes \\\"AB\\\" more than one time\\r\\n        //const matches = message.match(/AB/g);\\r\\n        //if (matches && matches.length > 1) {\\r\\n        if (total_length != longitud) { //if true then the msg contains more than one msg (possible bug of the device)\\r\\n            const multiack = message.split('AB');\\r\\n            for (let i = 1; i < multiack.length; i++) {\\r\\n                message = 'AB' + multiack[i];\\r\\n                debug(message);\\r\\n                decoder(message);\\r\\n            }\\r\\n        } else decoder(message); // it contains only one msg\\r\\n        /*if (message.includes('AB00030008C7')) {// IF multiACK\\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); */\\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 'BATCN': // Battery Charging - On\\r\\n                AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                configsToAck.push(configIds.ReadState.Charging);\\r\\n                //configs.AlertSettings.Welfare.Mode\\r\\n                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'false');\\r\\n                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'true');\\r\\n                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'false');\\r\\n                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                }\\r\\n                break;\\r\\n            case 'BATCF': // Battery Charging - Off\\r\\n                AddValue(configsToUpdate, configIds.ReadState.Charging, 'false');\\r\\n                configsToAck.push(configIds.ReadState.Charging);\\r\\n                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'true');\\r\\n                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'false');\\r\\n                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'true');\\r\\n                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                }\\r\\n                break;\\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 Sentry-')) {\\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 = (`Sentry-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 = (`Sentry;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 = (`Sentry;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 = (`Sentry-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    // 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        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\\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                            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  ¿qué es fall OFF?\\r\\n                            if ((alarmCodeExtInt & 1) == 1) {\\r\\n                                var alarm = 'ALF-C'; // Fall-DownAlertending\\r\\n                            }\\r\\n                            // Welfare Check-out\\r\\n                            else if ((alarmCodeExtInt & 2) == 2) {\\r\\n                                var alarm = 'WSTP';\\r\\n                                if (configs.Welfare !== undefined) {\\r\\n                                    if (configs.Welfare.Mode == '1') {\\r\\n                                        info = 'Recurrent';\\r\\n                                    } else info = 'Amber';\\r\\n                                }\\r\\n                            }\\r\\n                            //Geo 5 in\\r\\n                            //else if ((alarmCodeInt & 16) == 16) {\\r\\n                            //    var alarm = 'BATL';\\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 Alert\\r\\n                            else if ((alarmCodeInt & 8) == 8) {\\r\\n                                var alarm = 'TLT';\\r\\n                            }\\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 Alert\\r\\n                            else if ((alarmCodeInt & 256) == 256) {\\r\\n                                var alarm = 'PWRF';\\r\\n                            }\\r\\n                            //Power On Alert\\r\\n                            else if ((alarmCodeInt & 512) == 512) {\\r\\n                                var alarm = 'PWRN';\\r\\n                            }\\r\\n                            //Motion Alert\\r\\n                            else if ((alarmCodeInt & 1024) == 1024) {\\r\\n                                var alarm = 'ALMOV';\\r\\n                            }\\r\\n                            //No Motion Alert\\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                            }\\r\\n                            // Side call button 1\\r\\n                            else if ((alarmCodeInt & 8192) == 8192) {\\r\\n                                var alarm = 'Side1';\\r\\n                            }\\r\\n                            // Side call button 2\\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                                /*AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                                configsToAck.push(configIds.ReadState.Charging);\\r\\n                                //configs.AlertSettings.Welfare.Mode\\r\\n                                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'false');\\r\\n                                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'true');\\r\\n                                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'false');\\r\\n                                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                                }*/\\r\\n                            }\\r\\n                            //Battery no charging\\r\\n                            else if ((alarmCodeInt & 65536) == 65536) {\\r\\n                                var alarm = 'BATCF';\\r\\n                                /* AddValue(configsToUpdate, configIds.ReadState.Charging, 'false');\\r\\n                                 configsToAck.push(configIds.ReadState.Charging);\\r\\n                                 if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                                     AddValue(configsToUpdate, configIds.ReadState.Welfare, 'true');\\r\\n                                     //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'false');\\r\\n                                     AddConfig(configsToSend, configIds.ReadState.Welfare, 'true');\\r\\n                                     configsToAck.push(configIds.ReadState.Welfare);\\r\\n                                 }*/\\r\\n                            }\\r\\n                            //Alert End\\r\\n                            else if ((alarmCodeInt & 131072) == 131072) {\\r\\n                                var alarm = 'ALA-F';\\r\\n                                info = 'Alarm Finished';\\r\\n                                //if (configs.Welfare !== undefined) {\\r\\n                                //    if (configs.Welfare.Mode == '1') {\\r\\n                                //        info = 'Recurrent';\\r\\n                                //    } else info = 'Amber';\\r\\n                                //}\\r\\n                            }\\r\\n                            //Amber Alert ON    Don`t know the dfference between ALA and ALA-O\\r\\n                            else if ((alarmCodeInt & 262144) == 262144) {\\r\\n                                var alarm = 'ALA';\\r\\n                            }\\r\\n                            // welfare check in\\r\\n                            else if ((alarmCodeInt & 524288) == 524288) {\\r\\n                                var alarm = 'WTS';\\r\\n                                if (configs.Welfare !== undefined) {\\r\\n                                    if (configs.Welfare.Mode == '1') {\\r\\n                                        info = 'Recurrent';\\r\\n                                    } else info = 'Amber';\\r\\n                                }\\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\\r\\n                            else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n                                var alarm = 'ALA-W';\\r\\n                                if (configs.Welfare !== undefined) {\\r\\n                                    if (configs.Welfare.Mode == '1') {\\r\\n                                        info = 'Recurrent';\\r\\n                                    } else info = 'Amber';\\r\\n                                }\\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 != '64') {\\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                                    //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 != '64') {\\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 = (`Sentry-${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 = (`Sentry-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                            if ((statusInt & 16) == 16) {\\r\\n                                statusDevice += 'Charging,';\\r\\n                                // AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                                // configsToAck.push(configIds.ReadState.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 != '64') {\\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 = (`Sentry-${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 != '64') {\\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 = (`Sentry-${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 = (`Sentry-${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 = (`Sentry-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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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                                var allow = 'true';\\r\\n                            } else var allow = 'false';\\r\\n                            // To find LT setup\\r\\n                            if (statusPhone.substring(5, 6) == '1') { // 1 Enable\\r\\n                                var silentCall = 'true';\\r\\n                            } else var silentCall = '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                            AddValue(configsToUpdate, configIds.ReadProfiles.SilentCallMode, silentCall);\\r\\n                            //configsToAck.push(configIds.ReadSystemSettings.Statusphone);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AllowList);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AutoAnswer);\\r\\n                            configsToAck.push(configIds.ReadProfiles.SilentCallMode);\\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                            var report;\\r\\n                            switch (contactNumber) {\\r\\n                                // Emergency Number\\r\\n                                // [Value]:80 2B 33 34 36 33 35 36 30 37 39 33 30\\r\\n                                //{\\\"number\\\":{\\\"call\\\":0,\\\"noCard\\\":0,\\\"number\\\":\\\"+34635607930\\\",\\\"enable\\\":1,\\\"sms\\\":0,\\\"index\\\":0}}\\r\\n                                case '0':\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.length < 6) { //if no telephone defined\\r\\n                                        tel = '';\\r\\n                                    }\\r\\n                                    report = hex2bin(value.substring(0, 2)); // To find report mode Call &data or DAta only\\r\\n                                    AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                                    AddValue(codeValues, \\\"ReportMode\\\", report.substring(2, 3));\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.ReportMode, report.substring(2, 3));\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.ReportMode);\\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                                    if (tel.length < 6) { //if no telephone defined\\r\\n                                        tel = '';\\r\\n                                    }\\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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 '55': // Tilt Angle Alert\\r\\n                            //[Value]:0A 00 1E 00\\r\\n                            //{\\\"tiltAlert\\\":{\\\"angle\\\":30,\\\"time\\\":10,\\\"status\\\":0,\\\"dial\\\":0}}\\r\\n                            var angle = hexToDecimal(value.substring(4, 6));\\r\\n                            var timeout = hexToDecimal(value.substring(0, 2));\\r\\n                            var status = hexToDecimal(value.substring(6, 8));\\r\\n                            if (status == 0) angle = 0;\\r\\n                            //var alertSetting = angle;\\r\\n                            //imei = serverParams.Imei;\\r\\n                            //messageForReceiver = (`Sentry;ACK-TILTANG;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"tiltangle\\\", angle);\\r\\n                            AddValue(codeValues, \\\"tiltimeout\\\", timeout);\\r\\n                            AddValue(codeValues, \\\"tiltstatus\\\", status);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltTimeout, timeout);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltAngle, angle);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltTimeout);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltAngle);\\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 = (`Sentry;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.ManDownSettings, sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.EnableDisableManDownSettings, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.Sensitivity, sesibityOptionValue);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.EnableDisableManDownSettings);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.Sensitivity);\\r\\n                            break;\\r\\n                        case '57': // Welfare\\r\\n                            // [Value]:10 0E 00 80 58 02 00 80\\r\\n                            //{\\\"welfareAlert\\\":{\\\"time\\\":600,\\\"value\\\":3600,\\\"status\\\":1,\\\"dial\\\":1}}\\r\\n                            var welfareStatus = hex2bin(value.substring(6, 8)); // check status\\r\\n                            var welfareValue = hexToDecimal(changeEndianness(value.substring(0, 6)));\\r\\n                            var welfareTime = hexToDecimal(changeEndianness(value.substring(8, 14)));\\r\\n                            var enalbleDisable = '';\\r\\n                            if ((configs.ReadState.Charging == 'true') && (configs.Welfare.Mode == '1') && (configs.Welfare.EnableDisableWelfare == 'true')) { // Force Read to enable welfare when device is charging in recurrent mode\\r\\n                                var sensibility = 'Enable, '\\r\\n                                enalbleDisable = '1'\\r\\n                            } else {\\r\\n                                if (welfareStatus.substring(0, 1) == '1') {\\r\\n                                    var sensibility = 'Enable, '\\r\\n                                    enalbleDisable = '1'\\r\\n                                } else {\\r\\n                                    var sensibility = 'Disable, '\\r\\n                                    //enalbleDisable = '0'\\r\\n                                }\\r\\n                            };\\r\\n                            //var imei = serverParams.Imei;\\r\\n                            //messageForReceiver = (`Sentry;ACK-WELFALERT;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            sensibility += welfareValue / 60;\\r\\n                            sensibility += ', ' + welfareTime / 60;\\r\\n                            AddValue(codeValues, \\\"welfare\\\", sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.EnableDisableReadWelfare, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Prealarm, welfareTime / 60);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Timeout, welfareValue / 60);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.EnableDisableReadWelfare);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Prealarm);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Timeout);\\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 = (`Sentry;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 '75': // Extra Enable control   Welfare Mode\\r\\n                            //[Value]:80 00 00 10  last two digit for new/old welfare\\r\\n                            //{\\\"extraControl\\\":{\\\"bit29\\\":0,\\\"bit27\\\":0,\\\"bit28\\\":1,\\\"bit25\\\":0,\\\"bit26\\\":0,\\\"flagValue\\\":268435584,\\\"bit23\\\":0,\\\"bit24\\\":0,\\\"bit21\\\":0,\\\"bit22\\\":0,\\\"bit20\\\":0,\\\"bit9\\\":0,\\\"bit18\\\":0,\\\"bit19\\\":0,\\\"bit7\\\":1,\\\"bit16\\\":0,\\\"bit8\\\":0,\\\"bit17\\\":0,\\\"bit5\\\":0,\\\"bit14\\\":0,\\\"bit6\\\":0,\\\"bit15\\\":0,\\\"bit3\\\":0,\\\"bit4\\\":0,\\\"bit1\\\":0,\\\"bit2\\\":0,\\\"bit0\\\":0,\\\"bit12\\\":0,\\\"bit13\\\":0,\\\"bit10\\\":0,\\\"bit11\\\":0,\\\"bit30\\\":0,\\\"bit31\\\":0}}\\r\\n                            var extraStatus = hex2bin(value.substring(6, 7)).substring(7, 8);\\r\\n                            //if (extraStatus.substring(7, 8) == '1') {\\r\\n                            //    extra += ' Enable, '\\r\\n                            //} else {\\r\\n                            //    extra += ' 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, \\\"welfare Mode\\\", extraStatus);\\r\\n                            // messageForReceiver = (`Sentry;ACK-EXTRA;${imei};`);\\r\\n                            // sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Mode, extraStatus);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Mode);\\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 = (`Sentry;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                            var triggerMode = '';\\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                            triggerMode = status.substring(2, 3);\\r\\n                            if (triggerMode == '1') {\\r\\n                                alertSetting += 'Double Press, '\\r\\n                            } else {\\r\\n                                alertSetting += 'Long Press, '\\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 = (`Sentry;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.ReadInterfaceOptions.SpeedActivationDialButton, triggerMode);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n                            configsToAck.push(configIds.ReadInterfaceOptions.SpeedActivationDialButton);\\r\\n                            break;\\r\\n                        case '20': // SOS Button Settings\\r\\n                            // [Length]:03 [Key]:20 [Value]:7B 9E {\\\"sosButton\\\":{\\\"mode\\\":0,\\\"feedBack\\\":3,\\\"task\\\":15,\\\"time\\\":30,\\\"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                            var triggerMode = '';\\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                            triggerMode = status.substring(2, 3);\\r\\n                            if (triggerMode == '1') {\\r\\n                                alertSetting += 'Double Press, '\\r\\n                            } else {\\r\\n                                alertSetting += 'Long Press, '\\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 = (`Sentry;ACK-SPEED;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"sos\\\", alertSetting);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadInterfaceOptions.SOSActivationButton, triggerMode);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            //configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n                            configsToAck.push(configIds.ReadInterfaceOptions.SOSActivationButton);\\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                            //    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 = 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 = (`Sentry-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 = (`Sentry-${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 = (`Sentry-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 = (`Sentry-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 = (`Sentry-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(...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 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":1747660364},{"Type":1,"NewValue":"{\"Id\":362,\"Name\":\"Access PS Sentry\",\"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    // Sentry protocol - please see variables and typical values in order below\\r\\n    // Sentry-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    // Sentry-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 N.\\r\\n    // Created: 01/01/2025\\r\\n    // Last modified: 04/06/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', 'Sentry');\\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 = (`Sentry-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        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        // Check if total lenght of the complete message is higher than total lenght of the first message\\r\\n        // to know if the message includes more than one\\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 longitud = message.length - 16;\\r\\n        // Loop to decode multi msg, includes \\\"AB\\\" more than one time\\r\\n        //const matches = message.match(/AB/g);\\r\\n        //if (matches && matches.length > 1) {\\r\\n        if (total_length != longitud) { //if true then the msg contains more than one msg (possible bug of the device)\\r\\n            const multiack = message.split('AB');\\r\\n            for (let i = 1; i < multiack.length; i++) {\\r\\n                message = 'AB' + multiack[i];\\r\\n                debug(message);\\r\\n                decoder(message);\\r\\n            }\\r\\n        } else decoder(message); // it contains only one msg\\r\\n        /*if (message.includes('AB00030008C7')) {// IF multiACK\\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); */\\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 'BATCN': // Battery Charging - On\\r\\n                AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                configsToAck.push(configIds.ReadState.Charging);\\r\\n                //configs.AlertSettings.Welfare.Mode\\r\\n                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'false');\\r\\n                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'true');\\r\\n                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'false');\\r\\n                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                }\\r\\n                break;\\r\\n            case 'BATCF': // Battery Charging - Off\\r\\n                AddValue(configsToUpdate, configIds.ReadState.Charging, 'false');\\r\\n                configsToAck.push(configIds.ReadState.Charging);\\r\\n                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'true');\\r\\n                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'false');\\r\\n                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'true');\\r\\n                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                }\\r\\n                break;\\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 Sentry-')) {\\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 = (`Sentry-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 = (`Sentry;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 = (`Sentry;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 = (`Sentry-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    // 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        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\\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                            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  ¿qué es fall OFF?\\r\\n                            if ((alarmCodeExtInt & 1) == 1) {\\r\\n                                var alarm = 'ALF-C'; // Fall-DownAlertending\\r\\n                            }\\r\\n                            // Welfare Check-out\\r\\n                            else if ((alarmCodeExtInt & 2) == 2) {\\r\\n                                var alarm = 'WSTP';\\r\\n                                if (configs.Welfare !== undefined) {\\r\\n                                    if (configs.Welfare.Mode == '1') {\\r\\n                                        info = 'Recurrent';\\r\\n                                    } else info = 'Amber';\\r\\n                                }\\r\\n                            }\\r\\n                            //Geo 5 in\\r\\n                            //else if ((alarmCodeInt & 16) == 16) {\\r\\n                            //    var alarm = 'BATL';\\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 Alert\\r\\n                            else if ((alarmCodeInt & 8) == 8) {\\r\\n                                var alarm = 'TLT';\\r\\n                            }\\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 Alert\\r\\n                            else if ((alarmCodeInt & 256) == 256) {\\r\\n                                var alarm = 'PWRF';\\r\\n                            }\\r\\n                            //Power On Alert\\r\\n                            else if ((alarmCodeInt & 512) == 512) {\\r\\n                                var alarm = 'PWRN';\\r\\n                            }\\r\\n                            //Motion Alert\\r\\n                            else if ((alarmCodeInt & 1024) == 1024) {\\r\\n                                var alarm = 'ALMOV';\\r\\n                            }\\r\\n                            //No Motion Alert\\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                            }\\r\\n                            // Side call button 1\\r\\n                            else if ((alarmCodeInt & 8192) == 8192) {\\r\\n                                var alarm = 'Side1';\\r\\n                            }\\r\\n                            // Side call button 2\\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                                /*AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                                configsToAck.push(configIds.ReadState.Charging);\\r\\n                                //configs.AlertSettings.Welfare.Mode\\r\\n                                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'false');\\r\\n                                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'true');\\r\\n                                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'false');\\r\\n                                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                                }*/\\r\\n                            }\\r\\n                            //Battery no charging\\r\\n                            else if ((alarmCodeInt & 65536) == 65536) {\\r\\n                                var alarm = 'BATCF';\\r\\n                                /* AddValue(configsToUpdate, configIds.ReadState.Charging, 'false');\\r\\n                                 configsToAck.push(configIds.ReadState.Charging);\\r\\n                                 if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                                     AddValue(configsToUpdate, configIds.ReadState.Welfare, 'true');\\r\\n                                     //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'false');\\r\\n                                     AddConfig(configsToSend, configIds.ReadState.Welfare, 'true');\\r\\n                                     configsToAck.push(configIds.ReadState.Welfare);\\r\\n                                 }*/\\r\\n                            }\\r\\n                            //Alert End\\r\\n                            else if ((alarmCodeInt & 131072) == 131072) {\\r\\n                                var alarm = 'ALA-F';\\r\\n                                info = 'Alarm Finished';\\r\\n                                //if (configs.Welfare !== undefined) {\\r\\n                                //    if (configs.Welfare.Mode == '1') {\\r\\n                                //        info = 'Recurrent';\\r\\n                                //    } else info = 'Amber';\\r\\n                                //}\\r\\n                            }\\r\\n                            //Amber Alert ON    Don`t know the dfference between ALA and ALA-O\\r\\n                            else if ((alarmCodeInt & 262144) == 262144) {\\r\\n                                var alarm = 'ALA';\\r\\n                            }\\r\\n                            // welfare check in\\r\\n                            else if ((alarmCodeInt & 524288) == 524288) {\\r\\n                                var alarm = 'WTS';\\r\\n                                if (configs.Welfare !== undefined) {\\r\\n                                    if (configs.Welfare.Mode == '1') {\\r\\n                                        info = 'Recurrent';\\r\\n                                    } else info = 'Amber';\\r\\n                                }\\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\\r\\n                            else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n                                var alarm = 'ALA-W';\\r\\n                                if (configs.Welfare !== undefined) {\\r\\n                                    if (configs.Welfare.Mode == '1') {\\r\\n                                        info = 'Recurrent';\\r\\n                                    } else info = 'Amber';\\r\\n                                }\\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 != '64') {\\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                                    //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 != '64') {\\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 = (`Sentry-${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 = (`Sentry-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                            if ((statusInt & 16) == 16) {\\r\\n                                statusDevice += 'Charging,';\\r\\n                                // AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                                // configsToAck.push(configIds.ReadState.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 != '64') {\\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 = (`Sentry-${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 != '64') {\\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 = (`Sentry-${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 = (`Sentry-${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 = (`Sentry-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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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                                var allow = 'true';\\r\\n                            } else var allow = 'false';\\r\\n                            // To find LT setup\\r\\n                            if (statusPhone.substring(5, 6) == '1') { // 1 Enable\\r\\n                                var silentCall = 'true';\\r\\n                            } else var silentCall = '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                            AddValue(configsToUpdate, configIds.ReadProfiles.SilentCallMode, silentCall);\\r\\n                            //configsToAck.push(configIds.ReadSystemSettings.Statusphone);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AllowList);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AutoAnswer);\\r\\n                            configsToAck.push(configIds.ReadProfiles.SilentCallMode);\\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                            var report;\\r\\n                            switch (contactNumber) {\\r\\n                                // Emergency Number\\r\\n                                // [Value]:80 2B 33 34 36 33 35 36 30 37 39 33 30\\r\\n                                //{\\\"number\\\":{\\\"call\\\":0,\\\"noCard\\\":0,\\\"number\\\":\\\"+34635607930\\\",\\\"enable\\\":1,\\\"sms\\\":0,\\\"index\\\":0}}\\r\\n                                case '0':\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.length < 6) { //if no telephone defined\\r\\n                                        tel = '';\\r\\n                                    }\\r\\n                                    report = hex2bin(value.substring(0, 2)); // To find report mode Call &data or DAta only\\r\\n                                    AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                                    AddValue(codeValues, \\\"ReportMode\\\", report.substring(2, 3));\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.ReportMode, report.substring(2, 3));\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.ReportMode);\\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                                    if (tel.length < 6) { //if no telephone defined\\r\\n                                        tel = '';\\r\\n                                    }\\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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 '55': // Tilt Angle Alert\\r\\n                            //[Value]:0A 00 1E 00\\r\\n                            //{\\\"tiltAlert\\\":{\\\"angle\\\":30,\\\"time\\\":10,\\\"status\\\":0,\\\"dial\\\":0}}\\r\\n                            var angle = hexToDecimal(value.substring(4, 6));\\r\\n                            var timeout = hexToDecimal(value.substring(0, 2));\\r\\n                            var status = hexToDecimal(value.substring(6, 8));\\r\\n                            if (status == 0) angle = 0;\\r\\n                            //var alertSetting = angle;\\r\\n                            //imei = serverParams.Imei;\\r\\n                            //messageForReceiver = (`Sentry;ACK-TILTANG;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"tiltangle\\\", angle);\\r\\n                            AddValue(codeValues, \\\"tiltimeout\\\", timeout);\\r\\n                            AddValue(codeValues, \\\"tiltstatus\\\", status);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltTimeout, timeout);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltAngle, angle);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltTimeout);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltAngle);\\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 = (`Sentry;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.ManDownSettings, sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.EnableDisableManDownSettings, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.Sensitivity, sesibityOptionValue);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.EnableDisableManDownSettings);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.Sensitivity);\\r\\n                            break;\\r\\n                        case '57': // Welfare\\r\\n                            // [Value]:10 0E 00 80 58 02 00 80\\r\\n                            //{\\\"welfareAlert\\\":{\\\"time\\\":600,\\\"value\\\":3600,\\\"status\\\":1,\\\"dial\\\":1}}\\r\\n                            var welfareStatus = hex2bin(value.substring(6, 8)); // check status\\r\\n                            var welfareValue = hexToDecimal(changeEndianness(value.substring(0, 6)));\\r\\n                            var welfareTime = hexToDecimal(changeEndianness(value.substring(8, 14)));\\r\\n                            var enalbleDisable = '';\\r\\n                            if ((configs.ReadState.Charging == 'true') && (configs.Welfare.Mode == '1') && (configs.Welfare.EnableDisableWelfare == 'true')) { // Force Read to enable welfare when device is charging in recurrent mode\\r\\n                                var sensibility = 'Enable, '\\r\\n                                enalbleDisable = '1'\\r\\n                            } else {\\r\\n                                if (welfareStatus.substring(0, 1) == '1') {\\r\\n                                    var sensibility = 'Enable, '\\r\\n                                    enalbleDisable = '1'\\r\\n                                } else {\\r\\n                                    var sensibility = 'Disable, '\\r\\n                                    //enalbleDisable = '0'\\r\\n                                }\\r\\n                            };\\r\\n                            //var imei = serverParams.Imei;\\r\\n                            //messageForReceiver = (`Sentry;ACK-WELFALERT;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            sensibility += welfareValue / 60;\\r\\n                            sensibility += ', ' + welfareTime / 60;\\r\\n                            AddValue(codeValues, \\\"welfare\\\", sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.EnableDisableReadWelfare, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Prealarm, welfareTime / 60);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Timeout, welfareValue / 60);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.EnableDisableReadWelfare);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Prealarm);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Timeout);\\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 = (`Sentry;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 '75': // Extra Enable control   Welfare Mode\\r\\n                            //[Value]:80 00 00 10  last two digit for new/old welfare\\r\\n                            //{\\\"extraControl\\\":{\\\"bit29\\\":0,\\\"bit27\\\":0,\\\"bit28\\\":1,\\\"bit25\\\":0,\\\"bit26\\\":0,\\\"flagValue\\\":268435584,\\\"bit23\\\":0,\\\"bit24\\\":0,\\\"bit21\\\":0,\\\"bit22\\\":0,\\\"bit20\\\":0,\\\"bit9\\\":0,\\\"bit18\\\":0,\\\"bit19\\\":0,\\\"bit7\\\":1,\\\"bit16\\\":0,\\\"bit8\\\":0,\\\"bit17\\\":0,\\\"bit5\\\":0,\\\"bit14\\\":0,\\\"bit6\\\":0,\\\"bit15\\\":0,\\\"bit3\\\":0,\\\"bit4\\\":0,\\\"bit1\\\":0,\\\"bit2\\\":0,\\\"bit0\\\":0,\\\"bit12\\\":0,\\\"bit13\\\":0,\\\"bit10\\\":0,\\\"bit11\\\":0,\\\"bit30\\\":0,\\\"bit31\\\":0}}\\r\\n                            var extraStatus = hex2bin(value.substring(6, 7)).substring(7, 8);\\r\\n                            //if (extraStatus.substring(7, 8) == '1') {\\r\\n                            //    extra += ' Enable, '\\r\\n                            //} else {\\r\\n                            //    extra += ' 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, \\\"welfare Mode\\\", extraStatus);\\r\\n                            // messageForReceiver = (`Sentry;ACK-EXTRA;${imei};`);\\r\\n                            // sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Mode, extraStatus);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Mode);\\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 = (`Sentry;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                            var triggerMode = '';\\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                            triggerMode = status.substring(2, 3);\\r\\n                            if (triggerMode == '1') {\\r\\n                                alertSetting += 'Double Press, '\\r\\n                            } else {\\r\\n                                alertSetting += 'Long Press, '\\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 = (`Sentry;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.ReadInterfaceOptions.SpeedActivationDialButton, triggerMode);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n                            configsToAck.push(configIds.ReadInterfaceOptions.SpeedActivationDialButton);\\r\\n                            break;\\r\\n                        case '20': // SOS Button Settings\\r\\n                            // [Length]:03 [Key]:20 [Value]:7B 9E {\\\"sosButton\\\":{\\\"mode\\\":0,\\\"feedBack\\\":3,\\\"task\\\":15,\\\"time\\\":30,\\\"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                            var triggerMode = '';\\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                            triggerMode = status.substring(2, 3);\\r\\n                            if (triggerMode == '1') {\\r\\n                                alertSetting += 'Double Press, '\\r\\n                            } else {\\r\\n                                alertSetting += 'Long Press, '\\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 = (`Sentry;ACK-SPEED;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"sos\\\", alertSetting);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadInterfaceOptions.SOSActivationButton, triggerMode);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            //configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n                            configsToAck.push(configIds.ReadInterfaceOptions.SOSActivationButton);\\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                                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 = 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 = (`Sentry-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 = (`Sentry-${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 = (`Sentry-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 = (`Sentry-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 = (`Sentry-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(...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 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":1749055850},{"Type":1,"NewValue":"{\"Id\":362,\"Name\":\"Access PS Sentry\",\"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    // Sentry protocol - please see variables and typical values in order below\\r\\n    // Sentry-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    // Sentry-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 N.\\r\\n    // Created: 01/01/2025\\r\\n    // Last modified: 04/06/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', 'Sentry');\\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 = (`Sentry-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        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        // Check if total lenght of the complete message is higher than total lenght of the first message\\r\\n        // to know if the message includes more than one\\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 longitud = message.length - 16;\\r\\n        // Loop to decode multi msg, includes \\\"AB\\\" more than one time\\r\\n        //const matches = message.match(/AB/g);\\r\\n        //if (matches && matches.length > 1) {\\r\\n        if (total_length != longitud) { //if true then the msg contains more than one msg (possible bug of the device)\\r\\n            const multiack = message.split('AB');\\r\\n            for (let i = 1; i < multiack.length; i++) {\\r\\n                message = 'AB' + multiack[i];\\r\\n                debug(message);\\r\\n                decoder(message);\\r\\n            }\\r\\n        } else decoder(message); // it contains only one msg\\r\\n        /*if (message.includes('AB00030008C7')) {// IF multiACK\\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); */\\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 'BATCN': // Battery Charging - On\\r\\n                AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                configsToAck.push(configIds.ReadState.Charging);\\r\\n                //configs.AlertSettings.Welfare.Mode\\r\\n                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'false');\\r\\n                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'true');\\r\\n                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'false');\\r\\n                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                }\\r\\n                break;\\r\\n            case 'BATCF': // Battery Charging - Off\\r\\n                AddValue(configsToUpdate, configIds.ReadState.Charging, 'false');\\r\\n                configsToAck.push(configIds.ReadState.Charging);\\r\\n                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'true');\\r\\n                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'false');\\r\\n                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'true');\\r\\n                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                }\\r\\n                break;\\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 Sentry-')) {\\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 = (`Sentry-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 = (`Sentry;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 = (`Sentry;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 = (`Sentry-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    // 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        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\\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                            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  ¿qué es fall OFF?\\r\\n                            if ((alarmCodeExtInt & 1) == 1) {\\r\\n                                var alarm = 'ALF-C'; // Fall-DownAlertending\\r\\n                            }\\r\\n                            // Welfare Check-out\\r\\n                            else if ((alarmCodeExtInt & 2) == 2) {\\r\\n                                var alarm = 'WSTP';\\r\\n                                if (configs.Welfare !== undefined) {\\r\\n                                    if (configs.Welfare.Mode == '1') {\\r\\n                                        info = 'Recurrent';\\r\\n                                    } else info = 'Amber';\\r\\n                                }\\r\\n                            }\\r\\n                            //Geo 5 in\\r\\n                            //else if ((alarmCodeInt & 16) == 16) {\\r\\n                            //    var alarm = 'BATL';\\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 Alert\\r\\n                            else if ((alarmCodeInt & 8) == 8) {\\r\\n                                var alarm = 'TLT';\\r\\n                            }\\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 Alert\\r\\n                            else if ((alarmCodeInt & 256) == 256) {\\r\\n                                var alarm = 'PWRF';\\r\\n                            }\\r\\n                            //Power On Alert\\r\\n                            else if ((alarmCodeInt & 512) == 512) {\\r\\n                                var alarm = 'PWRN';\\r\\n                            }\\r\\n                            //Motion Alert\\r\\n                            else if ((alarmCodeInt & 1024) == 1024) {\\r\\n                                var alarm = 'ALMOV';\\r\\n                            }\\r\\n                            //No Motion Alert\\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                            }\\r\\n                            // Side call button 1\\r\\n                            else if ((alarmCodeInt & 8192) == 8192) {\\r\\n                                var alarm = 'Side1';\\r\\n                            }\\r\\n                            // Side call button 2\\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                                /*AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                                configsToAck.push(configIds.ReadState.Charging);\\r\\n                                //configs.AlertSettings.Welfare.Mode\\r\\n                                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'false');\\r\\n                                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'true');\\r\\n                                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'false');\\r\\n                                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                                }*/\\r\\n                            }\\r\\n                            //Battery no charging\\r\\n                            else if ((alarmCodeInt & 65536) == 65536) {\\r\\n                                var alarm = 'BATCF';\\r\\n                                /* AddValue(configsToUpdate, configIds.ReadState.Charging, 'false');\\r\\n                                 configsToAck.push(configIds.ReadState.Charging);\\r\\n                                 if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                                     AddValue(configsToUpdate, configIds.ReadState.Welfare, 'true');\\r\\n                                     //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'false');\\r\\n                                     AddConfig(configsToSend, configIds.ReadState.Welfare, 'true');\\r\\n                                     configsToAck.push(configIds.ReadState.Welfare);\\r\\n                                 }*/\\r\\n                            }\\r\\n                            //Alert End\\r\\n                            else if ((alarmCodeInt & 131072) == 131072) {\\r\\n                                var alarm = 'ALA-F';\\r\\n                                info = 'Alarm Finished';\\r\\n                                //if (configs.Welfare !== undefined) {\\r\\n                                //    if (configs.Welfare.Mode == '1') {\\r\\n                                //        info = 'Recurrent';\\r\\n                                //    } else info = 'Amber';\\r\\n                                //}\\r\\n                            }\\r\\n                            //Amber Alert ON    Don`t know the dfference between ALA and ALA-O\\r\\n                            else if ((alarmCodeInt & 262144) == 262144) {\\r\\n                                var alarm = 'ALA';\\r\\n                            }\\r\\n                            // welfare check in\\r\\n                            else if ((alarmCodeInt & 524288) == 524288) {\\r\\n                                var alarm = 'WTS';\\r\\n                                if (configs.Welfare !== undefined) {\\r\\n                                    if (configs.Welfare.Mode == '1') {\\r\\n                                        info = 'Recurrent';\\r\\n                                    } else info = 'Amber';\\r\\n                                }\\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\\r\\n                            else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n                                var alarm = 'ALA-W';\\r\\n                                if (configs.Welfare !== undefined) {\\r\\n                                    if (configs.Welfare.Mode == '1') {\\r\\n                                        info = 'Recurrent';\\r\\n                                    } else info = 'Amber';\\r\\n                                }\\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 != '64') {\\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                                    //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 != '64') {\\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 = (`Sentry-${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 = (`Sentry-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                            if ((statusInt & 16) == 16) {\\r\\n                                statusDevice += 'Charging,';\\r\\n                                // AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                                // configsToAck.push(configIds.ReadState.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 != '64') {\\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 = (`Sentry-${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 != '64') {\\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 = (`Sentry-${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 = (`Sentry-${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 = (`Sentry-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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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                                var allow = 'true';\\r\\n                            } else var allow = 'false';\\r\\n                            // To find LT setup\\r\\n                            if (statusPhone.substring(5, 6) == '1') { // 1 Enable\\r\\n                                var silentCall = 'true';\\r\\n                            } else var silentCall = '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                            AddValue(configsToUpdate, configIds.ReadProfiles.SilentCallMode, silentCall);\\r\\n                            //configsToAck.push(configIds.ReadSystemSettings.Statusphone);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AllowList);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AutoAnswer);\\r\\n                            configsToAck.push(configIds.ReadProfiles.SilentCallMode);\\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                            var report;\\r\\n                            switch (contactNumber) {\\r\\n                                // Emergency Number\\r\\n                                // [Value]:80 2B 33 34 36 33 35 36 30 37 39 33 30\\r\\n                                //{\\\"number\\\":{\\\"call\\\":0,\\\"noCard\\\":0,\\\"number\\\":\\\"+34635607930\\\",\\\"enable\\\":1,\\\"sms\\\":0,\\\"index\\\":0}}\\r\\n                                case '0':\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.length < 6) { //if no telephone defined\\r\\n                                        tel = '';\\r\\n                                    }\\r\\n                                    report = hex2bin(value.substring(0, 2)); // To find report mode Call &data or DAta only\\r\\n                                    AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                                    AddValue(codeValues, \\\"ReportMode\\\", report.substring(2, 3));\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.ReportMode, report.substring(2, 3));\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.ReportMode);\\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                                    if (tel.length < 6) { //if no telephone defined\\r\\n                                        tel = '';\\r\\n                                    }\\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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 '55': // Tilt Angle Alert\\r\\n                            //[Value]:0A 00 1E 00\\r\\n                            //{\\\"tiltAlert\\\":{\\\"angle\\\":30,\\\"time\\\":10,\\\"status\\\":0,\\\"dial\\\":0}}\\r\\n                            var angle = hexToDecimal(value.substring(4, 6));\\r\\n                            var timeout = hexToDecimal(value.substring(0, 2));\\r\\n                            var status = hexToDecimal(value.substring(6, 8));\\r\\n                            if (status == 0) angle = 0;\\r\\n                            //var alertSetting = angle;\\r\\n                            //imei = serverParams.Imei;\\r\\n                            //messageForReceiver = (`Sentry;ACK-TILTANG;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"tiltangle\\\", angle);\\r\\n                            AddValue(codeValues, \\\"tiltimeout\\\", timeout);\\r\\n                            AddValue(codeValues, \\\"tiltstatus\\\", status);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltTimeout, timeout);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltAngle, angle);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltTimeout);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltAngle);\\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 = (`Sentry;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.ManDownSettings, sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.EnableDisableManDownSettings, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.Sensitivity, sesibityOptionValue);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.EnableDisableManDownSettings);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.Sensitivity);\\r\\n                            break;\\r\\n                        case '57': // Welfare\\r\\n                            // [Value]:10 0E 00 80 58 02 00 80\\r\\n                            //{\\\"welfareAlert\\\":{\\\"time\\\":600,\\\"value\\\":3600,\\\"status\\\":1,\\\"dial\\\":1}}\\r\\n                            var welfareStatus = hex2bin(value.substring(6, 8)); // check status\\r\\n                            var welfareValue = hexToDecimal(changeEndianness(value.substring(0, 6)));\\r\\n                            var welfareTime = hexToDecimal(changeEndianness(value.substring(8, 14)));\\r\\n                            var enalbleDisable = '';\\r\\n                            if ((configs.ReadState.Charging == 'true') && (configs.Welfare.Mode == '1') && (configs.Welfare.EnableDisableWelfare == 'true')) { // Force Read to enable welfare when device is charging in recurrent mode\\r\\n                                var sensibility = 'Enable, '\\r\\n                                enalbleDisable = '1'\\r\\n                            } else {\\r\\n                                if (welfareStatus.substring(0, 1) == '1') {\\r\\n                                    var sensibility = 'Enable, '\\r\\n                                    enalbleDisable = '1'\\r\\n                                } else {\\r\\n                                    var sensibility = 'Disable, '\\r\\n                                    //enalbleDisable = '0'\\r\\n                                }\\r\\n                            };\\r\\n                            //var imei = serverParams.Imei;\\r\\n                            //messageForReceiver = (`Sentry;ACK-WELFALERT;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            sensibility += welfareValue / 60;\\r\\n                            sensibility += ', ' + welfareTime / 60;\\r\\n                            AddValue(codeValues, \\\"welfare\\\", sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.EnableDisableReadWelfare, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Prealarm, welfareTime / 60);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Timeout, welfareValue / 60);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.EnableDisableReadWelfare);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Prealarm);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Timeout);\\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 = (`Sentry;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 '75': // Extra Enable control   Welfare Mode\\r\\n                            //[Value]:80 00 00 10  last two digit for new/old welfare\\r\\n                            //{\\\"extraControl\\\":{\\\"bit29\\\":0,\\\"bit27\\\":0,\\\"bit28\\\":1,\\\"bit25\\\":0,\\\"bit26\\\":0,\\\"flagValue\\\":268435584,\\\"bit23\\\":0,\\\"bit24\\\":0,\\\"bit21\\\":0,\\\"bit22\\\":0,\\\"bit20\\\":0,\\\"bit9\\\":0,\\\"bit18\\\":0,\\\"bit19\\\":0,\\\"bit7\\\":1,\\\"bit16\\\":0,\\\"bit8\\\":0,\\\"bit17\\\":0,\\\"bit5\\\":0,\\\"bit14\\\":0,\\\"bit6\\\":0,\\\"bit15\\\":0,\\\"bit3\\\":0,\\\"bit4\\\":0,\\\"bit1\\\":0,\\\"bit2\\\":0,\\\"bit0\\\":0,\\\"bit12\\\":0,\\\"bit13\\\":0,\\\"bit10\\\":0,\\\"bit11\\\":0,\\\"bit30\\\":0,\\\"bit31\\\":0}}\\r\\n                            var extraStatus = hex2bin(value.substring(6, 7)).substring(7, 8);\\r\\n                            //if (extraStatus.substring(7, 8) == '1') {\\r\\n                            //    extra += ' Enable, '\\r\\n                            //} else {\\r\\n                            //    extra += ' 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, \\\"welfare Mode\\\", extraStatus);\\r\\n                            // messageForReceiver = (`Sentry;ACK-EXTRA;${imei};`);\\r\\n                            // sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Mode, extraStatus);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Mode);\\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 = (`Sentry;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                            var triggerMode = '';\\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                            triggerMode = status.substring(2, 3);\\r\\n                            if (triggerMode == '1') {\\r\\n                                alertSetting += 'Double Press, '\\r\\n                            } else {\\r\\n                                alertSetting += 'Long Press, '\\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 = (`Sentry;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.ReadInterfaceOptions.SpeedActivationDialButton, triggerMode);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n                            configsToAck.push(configIds.ReadInterfaceOptions.SpeedActivationDialButton);\\r\\n                            break;\\r\\n                        case '20': // SOS Button Settings\\r\\n                            // [Length]:03 [Key]:20 [Value]:7B 9E {\\\"sosButton\\\":{\\\"mode\\\":0,\\\"feedBack\\\":3,\\\"task\\\":15,\\\"time\\\":30,\\\"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                            var triggerMode = '';\\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                            triggerMode = status.substring(2, 3);\\r\\n                            if (triggerMode == '1') {\\r\\n                                alertSetting += 'Double Press, '\\r\\n                            } else {\\r\\n                                alertSetting += 'Long Press, '\\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 = (`Sentry;ACK-SPEED;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"sos\\\", alertSetting);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadInterfaceOptions.SOSActivationButton, triggerMode);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            //configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n                            configsToAck.push(configIds.ReadInterfaceOptions.SOSActivationButton);\\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                                //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 = 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 = (`Sentry-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 = (`Sentry-${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 = (`Sentry-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 = (`Sentry-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 = (`Sentry-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(...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 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":1749108714},{"Type":1,"NewValue":"{\"Id\":362,\"Name\":\"Access PS Sentry\",\"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    // Sentry protocol - please see variables and typical values in order below\\r\\n    // Sentry-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    // Sentry-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 N.\\r\\n    // Created: 01/01/2025\\r\\n    // Last modified: 17/06/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', 'Sentry');\\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 = (`Sentry-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        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        // Check if total lenght of the complete message is higher than total lenght of the first message\\r\\n        // to know if the message includes more than one\\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 longitud = message.length - 16;\\r\\n        // Loop to decode multi msg, includes \\\"AB\\\" more than one time\\r\\n        //const matches = message.match(/AB/g);\\r\\n        //if (matches && matches.length > 1) {\\r\\n        if (total_length != longitud) { //if true then the msg contains more than one msg (possible bug of the device)\\r\\n            const multiack = message.split('AB');\\r\\n            for (let i = 1; i < multiack.length; i++) {\\r\\n                message = 'AB' + multiack[i];\\r\\n                debug(message);\\r\\n                decoder(message);\\r\\n            }\\r\\n        } else decoder(message); // it contains only one msg\\r\\n        /*if (message.includes('AB00030008C7')) {// IF multiACK\\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); */\\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 'BATCN': // Battery Charging - On\\r\\n                AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                configsToAck.push(configIds.ReadState.Charging);\\r\\n                //configs.AlertSettings.Welfare.Mode\\r\\n                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'false');\\r\\n                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'true');\\r\\n                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'false');\\r\\n                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                }\\r\\n                break;\\r\\n            case 'BATCF': // Battery Charging - Off\\r\\n                AddValue(configsToUpdate, configIds.ReadState.Charging, 'false');\\r\\n                configsToAck.push(configIds.ReadState.Charging);\\r\\n                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'true');\\r\\n                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'false');\\r\\n                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'true');\\r\\n                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                }\\r\\n                break;\\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 Sentry-')) {\\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 = (`Sentry-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 = (`Sentry;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 = (`Sentry;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 = (`Sentry-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    // 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        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\\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                            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  ¿qué es fall OFF?\\r\\n                            if ((alarmCodeExtInt & 1) == 1) {\\r\\n                                var alarm = 'ALF-C'; // Fall-DownAlertending\\r\\n                            }\\r\\n                            // Welfare Check-out\\r\\n                            else if ((alarmCodeExtInt & 2) == 2) {\\r\\n                                var alarm = 'WSTP';\\r\\n                                if (configs.Welfare !== undefined) {\\r\\n                                    if (configs.Welfare.Mode == '1') {\\r\\n                                        info = 'Recurrent';\\r\\n                                    } else info = 'Amber';\\r\\n                                }\\r\\n                            }\\r\\n                            //Geo 5 in\\r\\n                            //else if ((alarmCodeInt & 16) == 16) {\\r\\n                            //    var alarm = 'BATL';\\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 Alert\\r\\n                            else if ((alarmCodeInt & 8) == 8) {\\r\\n                                var alarm = 'TLT';\\r\\n                            }\\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 Alert\\r\\n                            else if ((alarmCodeInt & 256) == 256) {\\r\\n                                var alarm = 'PWRF';\\r\\n                            }\\r\\n                            //Power On Alert\\r\\n                            else if ((alarmCodeInt & 512) == 512) {\\r\\n                                var alarm = 'PWRN';\\r\\n                            }\\r\\n                            //Motion Alert\\r\\n                            else if ((alarmCodeInt & 1024) == 1024) {\\r\\n                                var alarm = 'ALMOV';\\r\\n                            }\\r\\n                            //No Motion Alert\\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                            }\\r\\n                            // Side call button 1\\r\\n                            else if ((alarmCodeInt & 8192) == 8192) {\\r\\n                                var alarm = 'Side1';\\r\\n                            }\\r\\n                            // Side call button 2\\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                                /*AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                                configsToAck.push(configIds.ReadState.Charging);\\r\\n                                //configs.AlertSettings.Welfare.Mode\\r\\n                                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'false');\\r\\n                                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'true');\\r\\n                                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'false');\\r\\n                                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                                }*/\\r\\n                            }\\r\\n                            //Battery no charging\\r\\n                            else if ((alarmCodeInt & 65536) == 65536) {\\r\\n                                var alarm = 'BATCF';\\r\\n                                /* AddValue(configsToUpdate, configIds.ReadState.Charging, 'false');\\r\\n                                 configsToAck.push(configIds.ReadState.Charging);\\r\\n                                 if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                                     AddValue(configsToUpdate, configIds.ReadState.Welfare, 'true');\\r\\n                                     //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'false');\\r\\n                                     AddConfig(configsToSend, configIds.ReadState.Welfare, 'true');\\r\\n                                     configsToAck.push(configIds.ReadState.Welfare);\\r\\n                                 }*/\\r\\n                            }\\r\\n                            //Alert End\\r\\n                            else if ((alarmCodeInt & 131072) == 131072) {\\r\\n                                var alarm = 'ALA-F';\\r\\n                                info = 'Alarm Finished';\\r\\n                                //if (configs.Welfare !== undefined) {\\r\\n                                //    if (configs.Welfare.Mode == '1') {\\r\\n                                //        info = 'Recurrent';\\r\\n                                //    } else info = 'Amber';\\r\\n                                //}\\r\\n                            }\\r\\n                            //Amber Alert ON    Don`t know the dfference between ALA and ALA-O\\r\\n                            else if ((alarmCodeInt & 262144) == 262144) {\\r\\n                                var alarm = 'ALA';\\r\\n                            }\\r\\n                            // welfare check in\\r\\n                            else if ((alarmCodeInt & 524288) == 524288) {\\r\\n                                var alarm = 'WTS';\\r\\n                                if (configs.Welfare !== undefined) {\\r\\n                                    if (configs.Welfare.Mode == '1') {\\r\\n                                        info = 'Recurrent';\\r\\n                                    } else info = 'Amber';\\r\\n                                }\\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\\r\\n                            else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n                                var alarm = 'ALA-W';\\r\\n                                if (configs.Welfare !== undefined) {\\r\\n                                    if (configs.Welfare.Mode == '1') {\\r\\n                                        info = 'Recurrent';\\r\\n                                    } else info = 'Amber';\\r\\n                                }\\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 != '64') {\\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                                    //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 != '64') {\\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 = (`Sentry-${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 = (`Sentry-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                            if ((statusInt & 16) == 16) {\\r\\n                                statusDevice += 'Charging,';\\r\\n                                // AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                                // configsToAck.push(configIds.ReadState.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 != '64') {\\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 = (`Sentry-${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 != '64') {\\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 = (`Sentry-${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 = (`Sentry-${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 = (`Sentry-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 = (`Sentry;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 = (`Sentry;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': // Incoming call Ringtone Volume\\r\\n                            var volume = hexToDecimal(value);\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Sentry;ACK-VOL;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"Ringtone\\\", volume);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.IncomingCallRingtoneVolume, volume);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.IncomingCallRingtoneVolume);\\r\\n                            break;\\r\\n                        case '12': // Speaker Volume\\r\\n                            var volume = hexToDecimal(value);\\r\\n                            AddValue(codeValues, \\\"Speaker\\\", volume);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.InCallSpeakerVolume, volume);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.InCallSpeakerVolume);\\r\\n                            break;\\r\\n                        case '1C': // Notifications and Alerts Volume\\r\\n                            var volume = hexToDecimal(value);\\r\\n                            AddValue(codeValues, \\\"Notifications\\\", volume);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.NotificationsandAlerts, volume);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.NotificationsandAlerts);\\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 = (`Sentry;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 = (`Sentry;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                                var allow = 'true';\\r\\n                            } else var allow = 'false';\\r\\n                            // To find LT setup\\r\\n                            if (statusPhone.substring(5, 6) == '1') { // 1 Enable\\r\\n                                var silentCall = 'true';\\r\\n                            } else var silentCall = '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                            AddValue(configsToUpdate, configIds.ReadProfiles.SilentCallMode, silentCall);\\r\\n                            //configsToAck.push(configIds.ReadSystemSettings.Statusphone);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AllowList);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AutoAnswer);\\r\\n                            configsToAck.push(configIds.ReadProfiles.SilentCallMode);\\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                            var report;\\r\\n                            switch (contactNumber) {\\r\\n                                // Emergency Number\\r\\n                                // [Value]:80 2B 33 34 36 33 35 36 30 37 39 33 30\\r\\n                                //{\\\"number\\\":{\\\"call\\\":0,\\\"noCard\\\":0,\\\"number\\\":\\\"+34635607930\\\",\\\"enable\\\":1,\\\"sms\\\":0,\\\"index\\\":0}}\\r\\n                                case '0':\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.length < 6) { //if no telephone defined\\r\\n                                        tel = '';\\r\\n                                    }\\r\\n                                    report = hex2bin(value.substring(0, 2)); // To find report mode Call &data or DAta only\\r\\n                                    AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                                    AddValue(codeValues, \\\"ReportMode\\\", report.substring(2, 3));\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.ReportMode, report.substring(2, 3));\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.ReportMode);\\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                                    if (tel.length < 6) { //if no telephone defined\\r\\n                                        tel = '';\\r\\n                                    }\\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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 '55': // Tilt Angle Alert\\r\\n                            //[Value]:0A 00 1E 00\\r\\n                            //{\\\"tiltAlert\\\":{\\\"angle\\\":30,\\\"time\\\":10,\\\"status\\\":0,\\\"dial\\\":0}}\\r\\n                            var angle = hexToDecimal(value.substring(4, 6));\\r\\n                            var timeout = hexToDecimal(value.substring(0, 2));\\r\\n                            var status = hexToDecimal(value.substring(6, 8));\\r\\n                            if (status == 0) angle = 0;\\r\\n                            //var alertSetting = angle;\\r\\n                            //imei = serverParams.Imei;\\r\\n                            //messageForReceiver = (`Sentry;ACK-TILTANG;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"tiltangle\\\", angle);\\r\\n                            AddValue(codeValues, \\\"tiltimeout\\\", timeout);\\r\\n                            AddValue(codeValues, \\\"tiltstatus\\\", status);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltTimeout, timeout);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltAngle, angle);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltTimeout);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltAngle);\\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 = (`Sentry;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.ManDownSettings, sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.EnableDisableManDownSettings, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.Sensitivity, sesibityOptionValue);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.EnableDisableManDownSettings);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.Sensitivity);\\r\\n                            break;\\r\\n                        case '57': // Welfare\\r\\n                            // [Value]:10 0E 00 80 58 02 00 80\\r\\n                            //{\\\"welfareAlert\\\":{\\\"time\\\":600,\\\"value\\\":3600,\\\"status\\\":1,\\\"dial\\\":1}}\\r\\n                            var welfareStatus = hex2bin(value.substring(6, 8)); // check status\\r\\n                            var welfareValue = hexToDecimal(changeEndianness(value.substring(0, 6)));\\r\\n                            var welfareTime = hexToDecimal(changeEndianness(value.substring(8, 14)));\\r\\n                            var enalbleDisable = '';\\r\\n                            if ((configs.ReadState.Charging == 'true') && (configs.Welfare.Mode == '1') && (configs.Welfare.EnableDisableWelfare == 'true')) { // Force Read to enable welfare when device is charging in recurrent mode\\r\\n                                var sensibility = 'Enable, '\\r\\n                                enalbleDisable = '1'\\r\\n                            } else {\\r\\n                                if (welfareStatus.substring(0, 1) == '1') {\\r\\n                                    var sensibility = 'Enable, '\\r\\n                                    enalbleDisable = '1'\\r\\n                                } else {\\r\\n                                    var sensibility = 'Disable, '\\r\\n                                    //enalbleDisable = '0'\\r\\n                                }\\r\\n                            };\\r\\n                            //var imei = serverParams.Imei;\\r\\n                            //messageForReceiver = (`Sentry;ACK-WELFALERT;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            sensibility += welfareValue / 60;\\r\\n                            sensibility += ', ' + welfareTime / 60;\\r\\n                            AddValue(codeValues, \\\"welfare\\\", sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.EnableDisableReadWelfare, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Prealarm, welfareTime / 60);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Timeout, welfareValue / 60);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.EnableDisableReadWelfare);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Prealarm);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Timeout);\\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 = (`Sentry;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 '75': // Extra Enable control   Welfare Mode\\r\\n                            //[Value]:80 00 00 10  last two digit for new/old welfare\\r\\n                            //{\\\"extraControl\\\":{\\\"bit29\\\":0,\\\"bit27\\\":0,\\\"bit28\\\":1,\\\"bit25\\\":0,\\\"bit26\\\":0,\\\"flagValue\\\":268435584,\\\"bit23\\\":0,\\\"bit24\\\":0,\\\"bit21\\\":0,\\\"bit22\\\":0,\\\"bit20\\\":0,\\\"bit9\\\":0,\\\"bit18\\\":0,\\\"bit19\\\":0,\\\"bit7\\\":1,\\\"bit16\\\":0,\\\"bit8\\\":0,\\\"bit17\\\":0,\\\"bit5\\\":0,\\\"bit14\\\":0,\\\"bit6\\\":0,\\\"bit15\\\":0,\\\"bit3\\\":0,\\\"bit4\\\":0,\\\"bit1\\\":0,\\\"bit2\\\":0,\\\"bit0\\\":0,\\\"bit12\\\":0,\\\"bit13\\\":0,\\\"bit10\\\":0,\\\"bit11\\\":0,\\\"bit30\\\":0,\\\"bit31\\\":0}}\\r\\n                            var extraStatus = hex2bin(value.substring(6, 7)).substring(7, 8);\\r\\n                            //if (extraStatus.substring(7, 8) == '1') {\\r\\n                            //    extra += ' Enable, '\\r\\n                            //} else {\\r\\n                            //    extra += ' 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, \\\"welfare Mode\\\", extraStatus);\\r\\n                            // messageForReceiver = (`Sentry;ACK-EXTRA;${imei};`);\\r\\n                            // sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Mode, extraStatus);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Mode);\\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 = (`Sentry;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                            var triggerMode = '';\\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                            triggerMode = status.substring(2, 3);\\r\\n                            if (triggerMode == '1') {\\r\\n                                alertSetting += 'Double Press, '\\r\\n                            } else {\\r\\n                                alertSetting += 'Long Press, '\\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 = (`Sentry;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.ReadInterfaceOptions.SpeedActivationDialButton, triggerMode);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n                            configsToAck.push(configIds.ReadInterfaceOptions.SpeedActivationDialButton);\\r\\n                            break;\\r\\n                        case '20': // SOS Button Settings\\r\\n                            // [Length]:03 [Key]:20 [Value]:7B 9E {\\\"sosButton\\\":{\\\"mode\\\":0,\\\"feedBack\\\":3,\\\"task\\\":15,\\\"time\\\":30,\\\"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                            var triggerMode = '';\\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                            triggerMode = status.substring(2, 3);\\r\\n                            if (triggerMode == '1') {\\r\\n                                alertSetting += 'Double Press, '\\r\\n                            } else {\\r\\n                                alertSetting += 'Long Press, '\\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 = (`Sentry;ACK-SPEED;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"sos\\\", alertSetting);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadInterfaceOptions.SOSActivationButton, triggerMode);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            //configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n                            configsToAck.push(configIds.ReadInterfaceOptions.SOSActivationButton);\\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                                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 = 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 = (`Sentry-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 = (`Sentry-${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 = (`Sentry-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 = (`Sentry-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 = (`Sentry-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(...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 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":1750183236},{"Type":1,"NewValue":"{\"Id\":362,\"Name\":\"Access PS Sentry\",\"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    // Sentry protocol - please see variables and typical values in order below\\n    // Sentry-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    // Sentry-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 N.\\n    // Created: 01/01/2025\\n    // Last modified: 17/06/2025\\n    //\\n    ///////////////////////////////////////////////////////////////////////////////\\n    if (typeof localTesting === \\\"undefined\\\") {\\n        var 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', 'Sentry');\\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 = (`Sentry-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        var messageForReceiver;\\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        var message = rawFromBytes;\\n        // Check if total lenght of the complete message is higher than total lenght of the first message\\n        // to know if the message includes more than one\\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 longitud = message.length - 16;\\n        // Loop to decode multi msg, includes \\\"AB\\\" more than one time\\n        //const matches = message.match(/AB/g);\\n        //if (matches && matches.length > 1) {\\n        if (total_length != longitud) { //if true then the msg contains more than one msg (possible bug of the device)\\n            const multiack = message.split('AB');\\n            for (let i = 1; i < multiack.length; i++) {\\n                message = 'AB' + multiack[i];\\n                debug(message);\\n                decoder(message);\\n            }\\n        } else decoder(message); // it contains only one msg\\n        /*if (message.includes('AB00030008C7')) {// IF multiACK\\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); */\\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 'BATCN': // Battery Charging - On\\n                AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\n                configsToAck.push(configIds.ReadState.Charging);\\n                //configs.AlertSettings.Welfare.Mode\\n                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\n                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'false');\\n                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'true');\\n                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'false');\\n                    configsToAck.push(configIds.ReadState.Welfare);\\n                }\\n                break;\\n            case 'BATCF': // Battery Charging - Off\\n                AddValue(configsToUpdate, configIds.ReadState.Charging, 'false');\\n                configsToAck.push(configIds.ReadState.Charging);\\n                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\n                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'true');\\n                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'false');\\n                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'true');\\n                    configsToAck.push(configIds.ReadState.Welfare);\\n                }\\n                break;\\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 Sentry-')) {\\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 = (`Sentry-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 = (`Sentry;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 = (`Sentry;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 = (`Sentry-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    var 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    console.log(dataToReceiver);\\n    // end of main operation\\n    // define functions used in operation\\n    function AddValue(codeValueArray, p1, p2) { // push code value pair into array\\n        if (p2 !== undefined) { // don't add if newvalue is undefined\\n            var cvpair = {\\n                code: p1,\\n                value: p2\\n            };\\n            codeValueArray.push(cvpair);\\n        };\\n    }\\n\\n    function AddConfig(codeValueArray, configName, newvalue) {\\n        if (newvalue !== undefined) { // don't add if newvalue is undefined\\n            var cvpair = {\\n                'code': configName,\\n                'value': newvalue, // ?  newvalue : \\\"Not Defined\\\" \\n                'forced': true\\n            };\\n            codeValueArray.push(cvpair);\\n        };\\n    }\\n\\n    function decoder(str) { // decode rawdata\\n        // CARE Decoder\\n        // AddValue(codeValues, 'Message : ', str);\\n        var message = str;\\n        var index = 18;\\n        //parse header & properties\\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 sequenceID = message.substring(12, 16);\\n        var command = message.substring(16, 18);\\n        //mask bitwise   (properties should be '10')\\n        if ((parseInt(properties) & 8) == 8) {\\n            needsAck = true;\\n        } else needsAck = false;\\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 = hex_to_ascii(value);\\n                            // create long connection if it is needed\\n                            if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n                                sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\n                                AddValue(codeValues, \\\"imei\\\", imei);\\n                                AddValue(codeValues, 'ack', 'AB00030008C7' + sequenceID + '7F0100');\\n                                return;\\n                            }\\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  ¿qué es fall OFF?\\n                            if ((alarmCodeExtInt & 1) == 1) {\\n                                var alarm = 'ALF-C'; // Fall-DownAlertending\\n                            }\\n                            // Welfare Check-out\\n                            else if ((alarmCodeExtInt & 2) == 2) {\\n                                var alarm = 'WSTP';\\n                                if (configs.Welfare !== undefined) {\\n                                    if (configs.Welfare.Mode == '1') {\\n                                        info = 'Recurrent';\\n                                    } else info = 'Amber';\\n                                }\\n                            }\\n                            //Geo 5 in\\n                            //else if ((alarmCodeInt & 16) == 16) {\\n                            //    var alarm = 'BATL';\\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 Alert\\n                            else if ((alarmCodeInt & 8) == 8) {\\n                                var alarm = 'TLT';\\n                            }\\n                            // Geo IN - OUT\\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 Alert\\n                            else if ((alarmCodeInt & 256) == 256) {\\n                                var alarm = 'PWRF';\\n                            }\\n                            //Power On Alert\\n                            else if ((alarmCodeInt & 512) == 512) {\\n                                var alarm = 'PWRN';\\n                            }\\n                            //Motion Alert\\n                            else if ((alarmCodeInt & 1024) == 1024) {\\n                                var alarm = 'ALMOV';\\n                            }\\n                            //No Motion Alert\\n                            else if ((alarmCodeInt & 2048) == 2048) {\\n                                var alarm = 'ALNM';\\n                            }\\n                            //SOS\\n                            else if ((alarmCodeInt & 4096) == 4096) {\\n                                var alarm = 'ALSOS';\\n                            }\\n                            // Side call button 1\\n                            else if ((alarmCodeInt & 8192) == 8192) {\\n                                var alarm = 'Side1';\\n                            }\\n                            // Side call button 2\\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                                /*AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\n                                configsToAck.push(configIds.ReadState.Charging);\\n                                //configs.AlertSettings.Welfare.Mode\\n                                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\n                                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'false');\\n                                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'true');\\n                                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'false');\\n                                    configsToAck.push(configIds.ReadState.Welfare);\\n                                }*/\\n                            }\\n                            //Battery no charging\\n                            else if ((alarmCodeInt & 65536) == 65536) {\\n                                var alarm = 'BATCF';\\n                                /* AddValue(configsToUpdate, configIds.ReadState.Charging, 'false');\\n                                 configsToAck.push(configIds.ReadState.Charging);\\n                                 if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\n                                     AddValue(configsToUpdate, configIds.ReadState.Welfare, 'true');\\n                                     //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'false');\\n                                     AddConfig(configsToSend, configIds.ReadState.Welfare, 'true');\\n                                     configsToAck.push(configIds.ReadState.Welfare);\\n                                 }*/\\n                            }\\n                            //Alert End\\n                            else if ((alarmCodeInt & 131072) == 131072) {\\n                                var alarm = 'ALA-F';\\n                                info = 'Alarm Finished';\\n                                //if (configs.Welfare !== undefined) {\\n                                //    if (configs.Welfare.Mode == '1') {\\n                                //        info = 'Recurrent';\\n                                //    } else info = 'Amber';\\n                                //}\\n                            }\\n                            //Amber Alert ON    Don`t know the dfference between ALA and ALA-O\\n                            else if ((alarmCodeInt & 262144) == 262144) {\\n                                var alarm = 'ALA';\\n                            }\\n                            // welfare check in\\n                            else if ((alarmCodeInt & 524288) == 524288) {\\n                                var alarm = 'WTS';\\n                                if (configs.Welfare !== undefined) {\\n                                    if (configs.Welfare.Mode == '1') {\\n                                        info = 'Recurrent';\\n                                    } else info = 'Amber';\\n                                }\\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\\n                            else if ((alarmCodeInt & 4194304) == 4194304) {\\n                                var alarm = 'ALA-W';\\n                                if (configs.Welfare !== undefined) {\\n                                    if (configs.Welfare.Mode == '1') {\\n                                        info = 'Recurrent';\\n                                    } else info = 'Amber';\\n                                }\\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 != '64') {\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n                                AddValue(codeValues, \\\"customID\\\", value);\\n                                AddValue(codeValues, 'ack', 'AB00030008C7' + sequenceID + '7F0100');\\n                                return\\n                            } else {\\n                                if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n                                    sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\n                                    AddValue(codeValues, \\\"imei\\\", imei);\\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 = hex_to_ascii(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 != '64') {\\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 = (`Sentry-${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 = (`Sentry-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                            // HardCode to fix possible issue in protocol\\n                            // event_time = timestamp; \\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                            if ((statusInt & 16) == 16) {\\n                                statusDevice += 'Charging,';\\n                                // AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\n                                // configsToAck.push(configIds.ReadState.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) { //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 = hex2bin(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 = hex_to_ascii(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 = hex_to_ascii(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 = hex_to_ascii(value.substring(22, 22 + (2 * desc_leng)));\\n                                //descr = hex_to_ascii(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 = hex_to_ascii(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 != '64') {\\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 = (`Sentry-${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 != '64') {\\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 = (`Sentry-${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                //  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                // \\\"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,;\\\",\\n                if (alarmCode) {\\n                    messageForReceiver = (`Sentry-${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 = (`Sentry-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 = (`Sentry;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 = hex_to_ascii(value);\\n                            imei = serverParams.Imei;\\n                            AddValue(codeValues, \\\"imei\\\", imei);\\n                            AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\n                            messageForReceiver = (`Sentry;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': // Incoming call Ringtone Volume\\n                            var volume = hexToDecimal(value);\\n                            imei = serverParams.Imei;\\n                            messageForReceiver = (`Sentry;ACK-VOL;${imei};`);\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\n                            AddValue(codeValues, \\\"Ringtone\\\", volume);\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.IncomingCallRingtoneVolume, volume);\\n                            configsToAck.push(configIds.ReadSystemSettings.IncomingCallRingtoneVolume);\\n                            break;\\n                        case '12': // Speaker Volume\\n                            var volume = hexToDecimal(value);\\n                            AddValue(codeValues, \\\"Speaker\\\", volume);\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.InCallSpeakerVolume, volume);\\n                            configsToAck.push(configIds.ReadSystemSettings.InCallSpeakerVolume);\\n                            break;\\n                        case '1C': // Notifications and Alerts Volume\\n                            var volume = hexToDecimal(value);\\n                            AddValue(codeValues, \\\"Notifications\\\", volume);\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.NotificationsandAlerts, volume);\\n                            configsToAck.push(configIds.ReadSystemSettings.NotificationsandAlerts);\\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 = hex_to_ascii(value.substring(0, value.length));\\n                            //var workMode = hexToDecimal(value);\\n                            //var workMode = hex_to_ascii(value.substring(0, value.length));\\n                            var workMode = 1234; // + value + \\\"end\\\";\\n                            //var workModeVal = 9;\\n                            //workMode = 'test10';\\n                            imei = serverParams.Imei;\\n                            messageForReceiver = (`Sentry;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 = hex_to_ascii(value.substring(0, value.length));\\n                            imei = serverParams.Imei;\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\n                            messageForReceiver = (`Sentry;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 = hex2bin(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 = hex2bin(value.substring(2, 4)); // To find allow list setup\\n                            if (statusPhone.substring(7, 8) == '1') { // 1 Enable\\n                                var allow = 'true';\\n                            } else var allow = 'false';\\n                            // To find LT setup\\n                            if (statusPhone.substring(5, 6) == '1') { // 1 Enable\\n                                var silentCall = 'true';\\n                            } else var silentCall = 'false';\\n                            //statusPhone = hex2bin(value.substring(0, 2)) + hex2bin(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                            AddValue(configsToUpdate, configIds.ReadProfiles.SilentCallMode, silentCall);\\n                            //configsToAck.push(configIds.ReadSystemSettings.Statusphone);\\n                            configsToAck.push(configIds.ReadSystemSettings.AllowList);\\n                            configsToAck.push(configIds.ReadSystemSettings.AutoAnswer);\\n                            configsToAck.push(configIds.ReadProfiles.SilentCallMode);\\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                            var report;\\n                            switch (contactNumber) {\\n                                // Emergency Number\\n                                // [Value]:80 2B 33 34 36 33 35 36 30 37 39 33 30\\n                                //{\\\"number\\\":{\\\"call\\\":0,\\\"noCard\\\":0,\\\"number\\\":\\\"+34635607930\\\",\\\"enable\\\":1,\\\"sms\\\":0,\\\"index\\\":0}}\\n                                case '0':\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\n                                    if (tel.length < 6) { //if no telephone defined\\n                                        tel = '';\\n                                    }\\n                                    report = hex2bin(value.substring(0, 2)); // To find report mode Call &data or DAta only\\n                                    AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\n                                    AddValue(codeValues, \\\"ReportMode\\\", report.substring(2, 3));\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.ReportMode, report.substring(2, 3));\\n                                    configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\n                                    configsToAck.push(configIds.ReadAlertSettings.ReportMode);\\n                                    break;\\n                                    // Speed Dial Number\\n                                case '1':\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\n                                    if (tel.length < 6) { //if no telephone defined\\n                                        tel = '';\\n                                    }\\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 = hex_to_ascii(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 = hex_to_ascii(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 = hex_to_ascii(value.substring(0, value.length));\\n                            imei = serverParams.Imei;\\n                            break;\\n                        case '41': // APN Username\\n                            //no ACK need\\n                            //apn = apn + ',' + hex_to_ascii(value.substring(0, value.length));\\n                            break;\\n                        case '42': // APN Password\\n                            //no ACK need\\n                            //apn = apn + ',' + hex_to_ascii(value.substring(0, value.length));\\n                            messageForReceiver = (`Sentry;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 = hex_to_ascii(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 = (`Sentry;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 = (`Sentry;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 = hex2bin(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 = (`Sentry;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 '55': // Tilt Angle Alert\\n                            //[Value]:0A 00 1E 00\\n                            //{\\\"tiltAlert\\\":{\\\"angle\\\":30,\\\"time\\\":10,\\\"status\\\":0,\\\"dial\\\":0}}\\n                            var angle = hexToDecimal(value.substring(4, 6));\\n                            var timeout = hexToDecimal(value.substring(0, 2));\\n                            var status = hexToDecimal(value.substring(6, 8));\\n                            if (status == 0) angle = 0;\\n                            //var alertSetting = angle;\\n                            //imei = serverParams.Imei;\\n                            //messageForReceiver = (`Sentry;ACK-TILTANG;${imei};`);\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\n                            AddValue(codeValues, \\\"tiltangle\\\", angle);\\n                            AddValue(codeValues, \\\"tiltimeout\\\", timeout);\\n                            AddValue(codeValues, \\\"tiltstatus\\\", status);\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltTimeout, timeout);\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltAngle, angle);\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltTimeout);\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltAngle);\\n                            break;\\n                        case '56': //Fall down sensibility\\n                            // '00001100'\\n                            var fallStatus = hex2bin(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 = (`Sentry;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.ManDownSettings, sensibility);\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.EnableDisableManDownSettings, enalbleDisable);\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.Sensitivity, sesibityOptionValue);\\n                            //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\n                            configsToAck.push(configIds.ReadManDownSettings.EnableDisableManDownSettings);\\n                            configsToAck.push(configIds.ReadManDownSettings.Sensitivity);\\n                            break;\\n                        case '57': // Welfare\\n                            // [Value]:10 0E 00 80 58 02 00 80\\n                            //{\\\"welfareAlert\\\":{\\\"time\\\":600,\\\"value\\\":3600,\\\"status\\\":1,\\\"dial\\\":1}}\\n                            var welfareStatus = hex2bin(value.substring(6, 8)); // check status\\n                            var welfareValue = hexToDecimal(changeEndianness(value.substring(0, 6)));\\n                            var welfareTime = hexToDecimal(changeEndianness(value.substring(8, 14)));\\n                            var enalbleDisable = '';\\n                            if ((configs.ReadState.Charging == 'true') && (configs.Welfare.Mode == '1') && (configs.Welfare.EnableDisableWelfare == 'true')) { // Force Read to enable welfare when device is charging in recurrent mode\\n                                var sensibility = 'Enable, '\\n                                enalbleDisable = '1'\\n                            } else {\\n                                if (welfareStatus.substring(0, 1) == '1') {\\n                                    var sensibility = 'Enable, '\\n                                    enalbleDisable = '1'\\n                                } else {\\n                                    var sensibility = 'Disable, '\\n                                    //enalbleDisable = '0'\\n                                }\\n                            };\\n                            //var imei = serverParams.Imei;\\n                            //messageForReceiver = (`Sentry;ACK-WELFALERT;${imei};`);\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\n                            sensibility += welfareValue / 60;\\n                            sensibility += ', ' + welfareTime / 60;\\n                            AddValue(codeValues, \\\"welfare\\\", sensibility);\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.EnableDisableReadWelfare, enalbleDisable);\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Prealarm, welfareTime / 60);\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Timeout, welfareValue / 60);\\n                            configsToAck.push(configIds.ReadWelfareSettings.EnableDisableReadWelfare);\\n                            configsToAck.push(configIds.ReadWelfareSettings.Prealarm);\\n                            configsToAck.push(configIds.ReadWelfareSettings.Timeout);\\n                            break;\\n                        case '73': //BeaconList\\n                            var beaconNumber = hexToDecimal(value.substring(1, 2));\\n                            var beaconStatus = hex2bin(value.substring(0, 1));\\n                            //if (beaconStatus.substring(4, 5) == '1') {\\n                            //    homeBeacon += ' Enable, '\\n                            //} else {\\n                            //    homeBeacon += ' Disable, '\\n                            //};\\n                            beaconStatus = hex_to_ascii(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 = (`Sentry;ACK-GDATA;${imei};`);\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\n                            AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\n                            configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\n                            break;\\n                        case '75': // Extra Enable control   Welfare Mode\\n                            //[Value]:80 00 00 10  last two digit for new/old welfare\\n                            //{\\\"extraControl\\\":{\\\"bit29\\\":0,\\\"bit27\\\":0,\\\"bit28\\\":1,\\\"bit25\\\":0,\\\"bit26\\\":0,\\\"flagValue\\\":268435584,\\\"bit23\\\":0,\\\"bit24\\\":0,\\\"bit21\\\":0,\\\"bit22\\\":0,\\\"bit20\\\":0,\\\"bit9\\\":0,\\\"bit18\\\":0,\\\"bit19\\\":0,\\\"bit7\\\":1,\\\"bit16\\\":0,\\\"bit8\\\":0,\\\"bit17\\\":0,\\\"bit5\\\":0,\\\"bit14\\\":0,\\\"bit6\\\":0,\\\"bit15\\\":0,\\\"bit3\\\":0,\\\"bit4\\\":0,\\\"bit1\\\":0,\\\"bit2\\\":0,\\\"bit0\\\":0,\\\"bit12\\\":0,\\\"bit13\\\":0,\\\"bit10\\\":0,\\\"bit11\\\":0,\\\"bit30\\\":0,\\\"bit31\\\":0}}\\n                            var extraStatus = hex2bin(value.substring(6, 7)).substring(7, 8);\\n                            //if (extraStatus.substring(7, 8) == '1') {\\n                            //    extra += ' Enable, '\\n                            //} else {\\n                            //    extra += ' Disable, '\\n                            //};\\n                            //beaconStatus = hex_to_ascii(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, \\\"welfare Mode\\\", extraStatus);\\n                            // messageForReceiver = (`Sentry;ACK-EXTRA;${imei};`);\\n                            // sendMessageToLocalhostNoWait(messageForReceiver);\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Mode, extraStatus);\\n                            configsToAck.push(configIds.ReadWelfareSettings.Mode);\\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 = hex_to_ascii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\n                                var wifiPassword = hex_to_ascii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\n                                var imei = serverParams.Imei;\\n                                messageForReceiver = (`Sentry;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 = hex2bin(value.substring(2, 4)); //always pass 2 HEXs to this function\\n                            var alertSetting = '';\\n                            var enalbleDisable = '';\\n                            var triggerMode = '';\\n                            if (status.substring(0, 1) == '1') {\\n                                alertSetting = 'Enable, '\\n                                enalbleDisable = '1'\\n                            } else {\\n                                alertSetting = 'Disable, '\\n                                //enableDisable = '0';\\n                            };\\n                            triggerMode = status.substring(2, 3);\\n                            if (triggerMode == '1') {\\n                                alertSetting += 'Double Press, '\\n                            } else {\\n                                alertSetting += 'Long Press, '\\n                            };\\n                            //var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\n                            //alertSetting += time;\\n                            imei = serverParams.Imei;\\n                            messageForReceiver = (`Sentry;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.ReadInterfaceOptions.SpeedActivationDialButton, triggerMode);\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\n                            configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\n                            configsToAck.push(configIds.ReadInterfaceOptions.SpeedActivationDialButton);\\n                            break;\\n                        case '20': // SOS Button Settings\\n                            // [Length]:03 [Key]:20 [Value]:7B 9E {\\\"sosButton\\\":{\\\"mode\\\":0,\\\"feedBack\\\":3,\\\"task\\\":15,\\\"time\\\":30,\\\"status\\\":1}}\\n                            var status = hex2bin(value.substring(2, 4)); //always pass 2 HEXs to this function\\n                            var alertSetting = '';\\n                            //var enalbleDisable = '';\\n                            var triggerMode = '';\\n                            if (status.substring(0, 1) == '1') {\\n                                alertSetting = 'Enable, '\\n                                // enalbleDisable = '1'\\n                            } else {\\n                                alertSetting = 'Disable, '\\n                                //enableDisable = '0';\\n                            };\\n                            triggerMode = status.substring(2, 3);\\n                            if (triggerMode == '1') {\\n                                alertSetting += 'Double Press, '\\n                            } else {\\n                                alertSetting += 'Long Press, '\\n                            };\\n                            //var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\n                            //alertSetting += time;\\n                            //imei = serverParams.Imei;\\n                            //messageForReceiver = (`Sentry;ACK-SPEED;${imei};`);\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\n                            AddValue(codeValues, \\\"sos\\\", alertSetting);\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\n                            //AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\n                            AddValue(configsToUpdate, configIds.ReadInterfaceOptions.SOSActivationButton, triggerMode);\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\n                            //configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\n                            configsToAck.push(configIds.ReadInterfaceOptions.SOSActivationButton);\\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 = hex_to_ascii(value);\\n                            // create long connection if it is needed\\n                            if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n                                sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\n                                AddValue(codeValues, \\\"imei\\\", imei);\\n                                AddValue(codeValues, 'ack', 'AB00030008C7' + sequenceID + '7F0100');\\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 = hex_to_ascii(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 = hex2bin(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 = (`Sentry-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 = hex_to_ascii(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 = (`Sentry-${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 = (`Sentry-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 = (`Sentry-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 = (`Sentry-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 = hex_to_ascii(rawFromBytes.substring(i, i + 30));\\n                AddValue(codeValues, \\\"imei\\\", imei);\\n            }\\n        }\\n    }\\n\\n    function ascii_to_hexa(str) { // ascii to hex \\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\\n    function 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\\n    function 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    }\\n\\n    function hex2bin(hex) { //\\n        return (parseInt(hex, 16).toString(2)).padStart(8, '0');\\n    }\\n\\n    function calculateCheckSum(payloadData) { // check if payload checksum is valid\\n        var checksum = byteStringToByteArray(payloadData);\\n        checksum = crc16byte(checksum);\\n        checksum = decimalToHex(checksum);\\n        checksum = ('0000' + checksum).slice(-4).toUpperCase();\\n        return changeEndianness(checksum);\\n    }\\n\\n    function 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\\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 decimalToHex(x) { // decimal to hex\\n        x = x.toString(16).toUpperCase();\\n        return x;\\n    }\\n\\n    function hex_to_ascii(str1) { // Hex to Ascii \\n        var hex = str1.toString();\\n        var str = '';\\n        for (var n = 0; n < hex.length; n += 2) {\\n            str += String.fromCharCode(parseInt(hex.substr(n, 2), 16));\\n        }\\n        return str;\\n    }\\n\\n    function hexToDecimalSigned(hex) { // hex to decimal\\n        if (hex.length % 2 != 0) {\\n            hex = \\\"0\\\" + hex;\\n        }\\n        var num = parseInt(hex, 16);\\n        var maxVal = Math.pow(2, hex.length / 2 * 8);\\n        if (num > maxVal / 2 - 1) {\\n            num = num - maxVal;\\n        }\\n        return num;\\n    }\\n\\n    function hexToDecimal(x) {\\n        x = parseInt(x, 16);\\n        return x;\\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 acceptance server the message ... ');\\n            console.log(str);\\n            server = '52.174.17.77';\\n        } else {\\n            server = '127.0.0.1';\\n        }\\n        var c = net.createConnection(5678, server);\\n        c.on('error', function(error) {\\n            c = net.createConnection(5678, server);\\n        });\\n        c.write(`${str}`);\\n        c.end();\\n    }\\n    // modify to return the object that contains your data\\n    return dataToReceiver;\\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":1750680145},{"Type":1,"NewValue":"{\"Id\":362,\"Name\":\"Access PS Sentry\",\"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    // Sentry protocol - please see variables and typical values in order below\\n    // Sentry-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    // Sentry-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 N.\\n    // Created: 01/01/2025\\n    // Last modified: 17/06/2025\\n    //\\n    ///////////////////////////////////////////////////////////////////////////////\\n    if (typeof localTesting === \\\"undefined\\\") {\\n        var 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', 'Sentry');\\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 = (`Sentry-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        var messageForReceiver;\\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        var message = rawFromBytes;\\n        // Check if total lenght of the complete message is higher than total lenght of the first message\\n        // to know if the message includes more than one\\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 longitud = message.length - 16;\\n        // Loop to decode multi msg, includes \\\"AB\\\" more than one time\\n        //const matches = message.match(/AB/g);\\n        //if (matches && matches.length > 1) {\\n        if (total_length != longitud) { //if true then the msg contains more than one msg (possible bug of the device)\\n            const multiack = message.split('AB');\\n            for (let i = 1; i < multiack.length; i++) {\\n                message = 'AB' + multiack[i];\\n                debug(message);\\n                decoder(message);\\n            }\\n        } else decoder(message); // it contains only one msg\\n        /*if (message.includes('AB00030008C7')) {// IF multiACK\\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); */\\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 'BATCN': // Battery Charging - On\\n                AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\n                configsToAck.push(configIds.ReadState.Charging);\\n                //configs.AlertSettings.Welfare.Mode\\n                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\n                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'false');\\n                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'true');\\n                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'false');\\n                    configsToAck.push(configIds.ReadState.Welfare);\\n                }\\n                break;\\n            case 'BATCF': // Battery Charging - Off\\n                AddValue(configsToUpdate, configIds.ReadState.Charging, 'false');\\n                configsToAck.push(configIds.ReadState.Charging);\\n                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\n                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'true');\\n                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'false');\\n                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'true');\\n                    configsToAck.push(configIds.ReadState.Welfare);\\n                }\\n                break;\\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 Sentry-')) {\\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 = (`Sentry-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 = (`Sentry;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 = (`Sentry;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 = (`Sentry-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    var 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    console.log(dataToReceiver);\\n    // end of main operation\\n    // define functions used in operation\\n    function AddValue(codeValueArray, p1, p2) { // push code value pair into array\\n        if (p2 !== undefined) { // don't add if newvalue is undefined\\n            var cvpair = {\\n                code: p1,\\n                value: p2\\n            };\\n            codeValueArray.push(cvpair);\\n        };\\n    }\\n\\n    function AddConfig(codeValueArray, configName, newvalue) {\\n        if (newvalue !== undefined) { // don't add if newvalue is undefined\\n            var cvpair = {\\n                'code': configName,\\n                'value': newvalue, // ?  newvalue : \\\"Not Defined\\\" \\n                'forced': true\\n            };\\n            codeValueArray.push(cvpair);\\n        };\\n    }\\n\\n    function decoder(str) { // decode rawdata\\n        // CARE Decoder\\n        // AddValue(codeValues, 'Message : ', str);\\n        var message = str;\\n        var index = 18;\\n        //parse header & properties\\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 sequenceID = message.substring(12, 16);\\n        var command = message.substring(16, 18);\\n        //mask bitwise   (properties should be '10')\\n        if ((parseInt(properties) & 8) == 8) {\\n            needsAck = true;\\n        } else needsAck = false;\\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 = hex_to_ascii(value);\\n                            // create long connection if it is needed\\n                            if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n                                sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\n                                AddValue(codeValues, \\\"imei\\\", imei);\\n                                AddValue(codeValues, 'ack', 'AB00030008C7' + sequenceID + '7F0100');\\n                                return;\\n                            }\\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  ¿qué es fall OFF?\\n                            if ((alarmCodeExtInt & 1) == 1) {\\n                                var alarm = 'ALF-C'; // Fall-DownAlertending\\n                            }\\n                            // Welfare Check-out\\n                            else if ((alarmCodeExtInt & 2) == 2) {\\n                                var alarm = 'WSTP';\\n                                if (configs.Welfare !== undefined) {\\n                                    if (configs.Welfare.Mode == '1') {\\n                                        info = 'Recurrent';\\n                                    } else info = 'Amber';\\n                                }\\n                            }\\n                            //Geo 5 in\\n                            //else if ((alarmCodeInt & 16) == 16) {\\n                            //    var alarm = 'BATL';\\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 Alert\\n                            else if ((alarmCodeInt & 8) == 8) {\\n                                var alarm = 'TLT';\\n                            }\\n                            // Geo IN - OUT\\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 Alert\\n                            else if ((alarmCodeInt & 256) == 256) {\\n                                var alarm = 'PWRF';\\n                            }\\n                            //Power On Alert\\n                            else if ((alarmCodeInt & 512) == 512) {\\n                                var alarm = 'PWRN';\\n                            }\\n                            //Motion Alert\\n                            else if ((alarmCodeInt & 1024) == 1024) {\\n                                var alarm = 'ALMOV';\\n                            }\\n                            //No Motion Alert\\n                            else if ((alarmCodeInt & 2048) == 2048) {\\n                                var alarm = 'ALNM';\\n                            }\\n                            //SOS\\n                            else if ((alarmCodeInt & 4096) == 4096) {\\n                                var alarm = 'ALSOS';\\n                            }\\n                            // Side call button 1\\n                            else if ((alarmCodeInt & 8192) == 8192) {\\n                                var alarm = 'Side1';\\n                            }\\n                            // Side call button 2\\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                                /*AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\n                                configsToAck.push(configIds.ReadState.Charging);\\n                                //configs.AlertSettings.Welfare.Mode\\n                                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\n                                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'false');\\n                                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'true');\\n                                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'false');\\n                                    configsToAck.push(configIds.ReadState.Welfare);\\n                                }*/\\n                            }\\n                            //Battery no charging\\n                            else if ((alarmCodeInt & 65536) == 65536) {\\n                                var alarm = 'BATCF';\\n                                /* AddValue(configsToUpdate, configIds.ReadState.Charging, 'false');\\n                                 configsToAck.push(configIds.ReadState.Charging);\\n                                 if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\n                                     AddValue(configsToUpdate, configIds.ReadState.Welfare, 'true');\\n                                     //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'false');\\n                                     AddConfig(configsToSend, configIds.ReadState.Welfare, 'true');\\n                                     configsToAck.push(configIds.ReadState.Welfare);\\n                                 }*/\\n                            }\\n                            //Alert End\\n                            else if ((alarmCodeInt & 131072) == 131072) {\\n                                var alarm = 'ALA-F';\\n                                info = 'Alarm Finished';\\n                                //if (configs.Welfare !== undefined) {\\n                                //    if (configs.Welfare.Mode == '1') {\\n                                //        info = 'Recurrent';\\n                                //    } else info = 'Amber';\\n                                //}\\n                            }\\n                            //Amber Alert ON    Don`t know the dfference between ALA and ALA-O\\n                            else if ((alarmCodeInt & 262144) == 262144) {\\n                                var alarm = 'ALA';\\n                            }\\n                            // welfare check in\\n                            else if ((alarmCodeInt & 524288) == 524288) {\\n                                var alarm = 'WTS';\\n                                if (configs.Welfare !== undefined) {\\n                                    if (configs.Welfare.Mode == '1') {\\n                                        info = 'Recurrent';\\n                                    } else info = 'Amber';\\n                                }\\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\\n                            else if ((alarmCodeInt & 4194304) == 4194304) {\\n                                var alarm = 'ALA-W';\\n                                if (configs.Welfare !== undefined) {\\n                                    if (configs.Welfare.Mode == '1') {\\n                                        info = 'Recurrent';\\n                                    } else info = 'Amber';\\n                                }\\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 != '64') {\\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                                    AddValue(codeValues, \\\"imei\\\", imei);\\n                                    AddValue(codeValues, 'ack', 'AB00030008C7' + sequenceID + '7F0100');\\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 = hex_to_ascii(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 != '64') {\\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 = (`Sentry-${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 = (`Sentry-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                            // HardCode to fix possible issue in protocol\\n                            // event_time = timestamp; \\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                            if ((statusInt & 16) == 16) {\\n                                statusDevice += 'Charging,';\\n                                // AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\n                                // configsToAck.push(configIds.ReadState.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) { //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 = hex2bin(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 = hex_to_ascii(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 = hex_to_ascii(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 = hex_to_ascii(value.substring(22, 22 + (2 * desc_leng)));\\n                                //descr = hex_to_ascii(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 = hex_to_ascii(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 != '64') {\\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 = (`Sentry-${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 != '64') {\\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 = (`Sentry-${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                //  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                // \\\"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,;\\\",\\n                if (alarmCode) {\\n                    messageForReceiver = (`Sentry-${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 = (`Sentry-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 = (`Sentry;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 = hex_to_ascii(value);\\n                            imei = serverParams.Imei;\\n                            AddValue(codeValues, \\\"imei\\\", imei);\\n                            AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\n                            messageForReceiver = (`Sentry;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': // Incoming call Ringtone Volume\\n                            var volume = hexToDecimal(value);\\n                            imei = serverParams.Imei;\\n                            messageForReceiver = (`Sentry;ACK-VOL;${imei};`);\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\n                            AddValue(codeValues, \\\"Ringtone\\\", volume);\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.IncomingCallRingtoneVolume, volume);\\n                            configsToAck.push(configIds.ReadSystemSettings.IncomingCallRingtoneVolume);\\n                            break;\\n                        case '12': // Speaker Volume\\n                            var volume = hexToDecimal(value);\\n                            AddValue(codeValues, \\\"Speaker\\\", volume);\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.InCallSpeakerVolume, volume);\\n                            configsToAck.push(configIds.ReadSystemSettings.InCallSpeakerVolume);\\n                            break;\\n                        case '1C': // Notifications and Alerts Volume\\n                            var volume = hexToDecimal(value);\\n                            AddValue(codeValues, \\\"Notifications\\\", volume);\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.NotificationsandAlerts, volume);\\n                            configsToAck.push(configIds.ReadSystemSettings.NotificationsandAlerts);\\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 = hex_to_ascii(value.substring(0, value.length));\\n                            //var workMode = hexToDecimal(value);\\n                            //var workMode = hex_to_ascii(value.substring(0, value.length));\\n                            var workMode = 1234; // + value + \\\"end\\\";\\n                            //var workModeVal = 9;\\n                            //workMode = 'test10';\\n                            imei = serverParams.Imei;\\n                            messageForReceiver = (`Sentry;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 = hex_to_ascii(value.substring(0, value.length));\\n                            imei = serverParams.Imei;\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\n                            messageForReceiver = (`Sentry;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 = hex2bin(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 = hex2bin(value.substring(2, 4)); // To find allow list setup\\n                            if (statusPhone.substring(7, 8) == '1') { // 1 Enable\\n                                var allow = 'true';\\n                            } else var allow = 'false';\\n                            // To find LT setup\\n                            if (statusPhone.substring(5, 6) == '1') { // 1 Enable\\n                                var silentCall = 'true';\\n                            } else var silentCall = 'false';\\n                            //statusPhone = hex2bin(value.substring(0, 2)) + hex2bin(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                            AddValue(configsToUpdate, configIds.ReadProfiles.SilentCallMode, silentCall);\\n                            //configsToAck.push(configIds.ReadSystemSettings.Statusphone);\\n                            configsToAck.push(configIds.ReadSystemSettings.AllowList);\\n                            configsToAck.push(configIds.ReadSystemSettings.AutoAnswer);\\n                            configsToAck.push(configIds.ReadProfiles.SilentCallMode);\\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                            var report;\\n                            switch (contactNumber) {\\n                                // Emergency Number\\n                                // [Value]:80 2B 33 34 36 33 35 36 30 37 39 33 30\\n                                //{\\\"number\\\":{\\\"call\\\":0,\\\"noCard\\\":0,\\\"number\\\":\\\"+34635607930\\\",\\\"enable\\\":1,\\\"sms\\\":0,\\\"index\\\":0}}\\n                                case '0':\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\n                                    if (tel.length < 6) { //if no telephone defined\\n                                        tel = '';\\n                                    }\\n                                    report = hex2bin(value.substring(0, 2)); // To find report mode Call &data or DAta only\\n                                    AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\n                                    AddValue(codeValues, \\\"ReportMode\\\", report.substring(2, 3));\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.ReportMode, report.substring(2, 3));\\n                                    configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\n                                    configsToAck.push(configIds.ReadAlertSettings.ReportMode);\\n                                    break;\\n                                    // Speed Dial Number\\n                                case '1':\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\n                                    if (tel.length < 6) { //if no telephone defined\\n                                        tel = '';\\n                                    }\\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 = hex_to_ascii(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 = hex_to_ascii(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 = hex_to_ascii(value.substring(0, value.length));\\n                            imei = serverParams.Imei;\\n                            break;\\n                        case '41': // APN Username\\n                            //no ACK need\\n                            //apn = apn + ',' + hex_to_ascii(value.substring(0, value.length));\\n                            break;\\n                        case '42': // APN Password\\n                            //no ACK need\\n                            //apn = apn + ',' + hex_to_ascii(value.substring(0, value.length));\\n                            messageForReceiver = (`Sentry;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 = hex_to_ascii(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 = (`Sentry;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 = (`Sentry;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 = hex2bin(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 = (`Sentry;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 '55': // Tilt Angle Alert\\n                            //[Value]:0A 00 1E 00\\n                            //{\\\"tiltAlert\\\":{\\\"angle\\\":30,\\\"time\\\":10,\\\"status\\\":0,\\\"dial\\\":0}}\\n                            var angle = hexToDecimal(value.substring(4, 6));\\n                            var timeout = hexToDecimal(value.substring(0, 2));\\n                            var status = hexToDecimal(value.substring(6, 8));\\n                            if (status == 0) angle = 0;\\n                            //var alertSetting = angle;\\n                            //imei = serverParams.Imei;\\n                            //messageForReceiver = (`Sentry;ACK-TILTANG;${imei};`);\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\n                            AddValue(codeValues, \\\"tiltangle\\\", angle);\\n                            AddValue(codeValues, \\\"tiltimeout\\\", timeout);\\n                            AddValue(codeValues, \\\"tiltstatus\\\", status);\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltTimeout, timeout);\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltAngle, angle);\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltTimeout);\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltAngle);\\n                            break;\\n                        case '56': //Fall down sensibility\\n                            // '00001100'\\n                            var fallStatus = hex2bin(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 = (`Sentry;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.ManDownSettings, sensibility);\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.EnableDisableManDownSettings, enalbleDisable);\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.Sensitivity, sesibityOptionValue);\\n                            //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\n                            configsToAck.push(configIds.ReadManDownSettings.EnableDisableManDownSettings);\\n                            configsToAck.push(configIds.ReadManDownSettings.Sensitivity);\\n                            break;\\n                        case '57': // Welfare\\n                            // [Value]:10 0E 00 80 58 02 00 80\\n                            //{\\\"welfareAlert\\\":{\\\"time\\\":600,\\\"value\\\":3600,\\\"status\\\":1,\\\"dial\\\":1}}\\n                            var welfareStatus = hex2bin(value.substring(6, 8)); // check status\\n                            var welfareValue = hexToDecimal(changeEndianness(value.substring(0, 6)));\\n                            var welfareTime = hexToDecimal(changeEndianness(value.substring(8, 14)));\\n                            var enalbleDisable = '';\\n                            if ((configs.ReadState.Charging == 'true') && (configs.Welfare.Mode == '1') && (configs.Welfare.EnableDisableWelfare == 'true')) { // Force Read to enable welfare when device is charging in recurrent mode\\n                                var sensibility = 'Enable, '\\n                                enalbleDisable = '1'\\n                            } else {\\n                                if (welfareStatus.substring(0, 1) == '1') {\\n                                    var sensibility = 'Enable, '\\n                                    enalbleDisable = '1'\\n                                } else {\\n                                    var sensibility = 'Disable, '\\n                                    //enalbleDisable = '0'\\n                                }\\n                            };\\n                            //var imei = serverParams.Imei;\\n                            //messageForReceiver = (`Sentry;ACK-WELFALERT;${imei};`);\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\n                            sensibility += welfareValue / 60;\\n                            sensibility += ', ' + welfareTime / 60;\\n                            AddValue(codeValues, \\\"welfare\\\", sensibility);\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.EnableDisableReadWelfare, enalbleDisable);\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Prealarm, welfareTime / 60);\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Timeout, welfareValue / 60);\\n                            configsToAck.push(configIds.ReadWelfareSettings.EnableDisableReadWelfare);\\n                            configsToAck.push(configIds.ReadWelfareSettings.Prealarm);\\n                            configsToAck.push(configIds.ReadWelfareSettings.Timeout);\\n                            break;\\n                        case '73': //BeaconList\\n                            var beaconNumber = hexToDecimal(value.substring(1, 2));\\n                            var beaconStatus = hex2bin(value.substring(0, 1));\\n                            //if (beaconStatus.substring(4, 5) == '1') {\\n                            //    homeBeacon += ' Enable, '\\n                            //} else {\\n                            //    homeBeacon += ' Disable, '\\n                            //};\\n                            beaconStatus = hex_to_ascii(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 = (`Sentry;ACK-GDATA;${imei};`);\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\n                            AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\n                            configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\n                            break;\\n                        case '75': // Extra Enable control   Welfare Mode\\n                            //[Value]:80 00 00 10  last two digit for new/old welfare\\n                            //{\\\"extraControl\\\":{\\\"bit29\\\":0,\\\"bit27\\\":0,\\\"bit28\\\":1,\\\"bit25\\\":0,\\\"bit26\\\":0,\\\"flagValue\\\":268435584,\\\"bit23\\\":0,\\\"bit24\\\":0,\\\"bit21\\\":0,\\\"bit22\\\":0,\\\"bit20\\\":0,\\\"bit9\\\":0,\\\"bit18\\\":0,\\\"bit19\\\":0,\\\"bit7\\\":1,\\\"bit16\\\":0,\\\"bit8\\\":0,\\\"bit17\\\":0,\\\"bit5\\\":0,\\\"bit14\\\":0,\\\"bit6\\\":0,\\\"bit15\\\":0,\\\"bit3\\\":0,\\\"bit4\\\":0,\\\"bit1\\\":0,\\\"bit2\\\":0,\\\"bit0\\\":0,\\\"bit12\\\":0,\\\"bit13\\\":0,\\\"bit10\\\":0,\\\"bit11\\\":0,\\\"bit30\\\":0,\\\"bit31\\\":0}}\\n                            var extraStatus = hex2bin(value.substring(6, 7)).substring(7, 8);\\n                            //if (extraStatus.substring(7, 8) == '1') {\\n                            //    extra += ' Enable, '\\n                            //} else {\\n                            //    extra += ' Disable, '\\n                            //};\\n                            //beaconStatus = hex_to_ascii(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, \\\"welfare Mode\\\", extraStatus);\\n                            // messageForReceiver = (`Sentry;ACK-EXTRA;${imei};`);\\n                            // sendMessageToLocalhostNoWait(messageForReceiver);\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Mode, extraStatus);\\n                            configsToAck.push(configIds.ReadWelfareSettings.Mode);\\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 = hex_to_ascii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\n                                var wifiPassword = hex_to_ascii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\n                                var imei = serverParams.Imei;\\n                                messageForReceiver = (`Sentry;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 = hex2bin(value.substring(2, 4)); //always pass 2 HEXs to this function\\n                            var alertSetting = '';\\n                            var enalbleDisable = '';\\n                            var triggerMode = '';\\n                            if (status.substring(0, 1) == '1') {\\n                                alertSetting = 'Enable, '\\n                                enalbleDisable = '1'\\n                            } else {\\n                                alertSetting = 'Disable, '\\n                                //enableDisable = '0';\\n                            };\\n                            triggerMode = status.substring(2, 3);\\n                            if (triggerMode == '1') {\\n                                alertSetting += 'Double Press, '\\n                            } else {\\n                                alertSetting += 'Long Press, '\\n                            };\\n                            //var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\n                            //alertSetting += time;\\n                            imei = serverParams.Imei;\\n                            messageForReceiver = (`Sentry;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.ReadInterfaceOptions.SpeedActivationDialButton, triggerMode);\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\n                            configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\n                            configsToAck.push(configIds.ReadInterfaceOptions.SpeedActivationDialButton);\\n                            break;\\n                        case '20': // SOS Button Settings\\n                            // [Length]:03 [Key]:20 [Value]:7B 9E {\\\"sosButton\\\":{\\\"mode\\\":0,\\\"feedBack\\\":3,\\\"task\\\":15,\\\"time\\\":30,\\\"status\\\":1}}\\n                            var status = hex2bin(value.substring(2, 4)); //always pass 2 HEXs to this function\\n                            var alertSetting = '';\\n                            //var enalbleDisable = '';\\n                            var triggerMode = '';\\n                            if (status.substring(0, 1) == '1') {\\n                                alertSetting = 'Enable, '\\n                                // enalbleDisable = '1'\\n                            } else {\\n                                alertSetting = 'Disable, '\\n                                //enableDisable = '0';\\n                            };\\n                            triggerMode = status.substring(2, 3);\\n                            if (triggerMode == '1') {\\n                                alertSetting += 'Double Press, '\\n                            } else {\\n                                alertSetting += 'Long Press, '\\n                            };\\n                            //var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\n                            //alertSetting += time;\\n                            //imei = serverParams.Imei;\\n                            //messageForReceiver = (`Sentry;ACK-SPEED;${imei};`);\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\n                            AddValue(codeValues, \\\"sos\\\", alertSetting);\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\n                            //AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\n                            AddValue(configsToUpdate, configIds.ReadInterfaceOptions.SOSActivationButton, triggerMode);\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\n                            //configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\n                            configsToAck.push(configIds.ReadInterfaceOptions.SOSActivationButton);\\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 = hex_to_ascii(value);\\n                            // create long connection if it is needed\\n                            if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n                                sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\n                                AddValue(codeValues, \\\"imei\\\", imei);\\n                                AddValue(codeValues, 'ack', 'AB00030008C7' + sequenceID + '7F0100');\\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 = hex_to_ascii(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 = hex2bin(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 = (`Sentry-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 = hex_to_ascii(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 = (`Sentry-${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 = (`Sentry-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 = (`Sentry-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 = (`Sentry-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 = hex_to_ascii(rawFromBytes.substring(i, i + 30));\\n                AddValue(codeValues, \\\"imei\\\", imei);\\n            }\\n        }\\n    }\\n\\n    function ascii_to_hexa(str) { // ascii to hex \\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\\n    function 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\\n    function 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    }\\n\\n    function hex2bin(hex) { //\\n        return (parseInt(hex, 16).toString(2)).padStart(8, '0');\\n    }\\n\\n    function calculateCheckSum(payloadData) { // check if payload checksum is valid\\n        var checksum = byteStringToByteArray(payloadData);\\n        checksum = crc16byte(checksum);\\n        checksum = decimalToHex(checksum);\\n        checksum = ('0000' + checksum).slice(-4).toUpperCase();\\n        return changeEndianness(checksum);\\n    }\\n\\n    function 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\\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 decimalToHex(x) { // decimal to hex\\n        x = x.toString(16).toUpperCase();\\n        return x;\\n    }\\n\\n    function hex_to_ascii(str1) { // Hex to Ascii \\n        var hex = str1.toString();\\n        var str = '';\\n        for (var n = 0; n < hex.length; n += 2) {\\n            str += String.fromCharCode(parseInt(hex.substr(n, 2), 16));\\n        }\\n        return str;\\n    }\\n\\n    function hexToDecimalSigned(hex) { // hex to decimal\\n        if (hex.length % 2 != 0) {\\n            hex = \\\"0\\\" + hex;\\n        }\\n        var num = parseInt(hex, 16);\\n        var maxVal = Math.pow(2, hex.length / 2 * 8);\\n        if (num > maxVal / 2 - 1) {\\n            num = num - maxVal;\\n        }\\n        return num;\\n    }\\n\\n    function hexToDecimal(x) {\\n        x = parseInt(x, 16);\\n        return x;\\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 acceptance server the message ... ');\\n            console.log(str);\\n            server = '52.174.17.77';\\n        } else {\\n            server = '127.0.0.1';\\n        }\\n        var c = net.createConnection(5678, server);\\n        c.on('error', function(error) {\\n            c = net.createConnection(5678, server);\\n        });\\n        c.write(`${str}`);\\n        c.end();\\n    }\\n    // modify to return the object that contains your data\\n    return dataToReceiver;\\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":1750680291},{"Type":1,"NewValue":"{\"Id\":362,\"Name\":\"Access PS Sentry\",\"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    // Sentry protocol - please see variables and typical values in order below\\n    // Sentry-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    // Sentry-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 N.\\n    // Created: 01/01/2025\\n    // Last modified: 17/06/2025\\n    //\\n    ///////////////////////////////////////////////////////////////////////////////\\n    if (typeof localTesting === \\\"undefined\\\") {\\n        var 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', 'Sentry');\\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 = (`Sentry-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        var messageForReceiver;\\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        var message = rawFromBytes;\\n        // Check if total lenght of the complete message is higher than total lenght of the first message\\n        // to know if the message includes more than one\\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 longitud = message.length - 16;\\n        // Loop to decode multi msg, includes \\\"AB\\\" more than one time\\n        //const matches = message.match(/AB/g);\\n        //if (matches && matches.length > 1) {\\n        if (total_length != longitud) { //if true then the msg contains more than one msg (possible bug of the device)\\n            const multiack = message.split('AB');\\n            for (let i = 1; i < multiack.length; i++) {\\n                message = 'AB' + multiack[i];\\n                debug(message);\\n                decoder(message);\\n            }\\n        } else decoder(message); // it contains only one msg\\n        /*if (message.includes('AB00030008C7')) {// IF multiACK\\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); */\\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 'BATCN': // Battery Charging - On\\n                AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\n                configsToAck.push(configIds.ReadState.Charging);\\n                //configs.AlertSettings.Welfare.Mode\\n                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\n                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'false');\\n                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'true');\\n                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'false');\\n                    configsToAck.push(configIds.ReadState.Welfare);\\n                }\\n                break;\\n            case 'BATCF': // Battery Charging - Off\\n                AddValue(configsToUpdate, configIds.ReadState.Charging, 'false');\\n                configsToAck.push(configIds.ReadState.Charging);\\n                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\n                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'true');\\n                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'false');\\n                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'true');\\n                    configsToAck.push(configIds.ReadState.Welfare);\\n                }\\n                break;\\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 Sentry-')) {\\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 = (`Sentry-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 = (`Sentry;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 = (`Sentry;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 = (`Sentry-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    var 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    console.log(dataToReceiver);\\n    // end of main operation\\n    // define functions used in operation\\n    function AddValue(codeValueArray, p1, p2) { // push code value pair into array\\n        if (p2 !== undefined) { // don't add if newvalue is undefined\\n            var cvpair = {\\n                code: p1,\\n                value: p2\\n            };\\n            codeValueArray.push(cvpair);\\n        };\\n    }\\n\\n    function AddConfig(codeValueArray, configName, newvalue) {\\n        if (newvalue !== undefined) { // don't add if newvalue is undefined\\n            var cvpair = {\\n                'code': configName,\\n                'value': newvalue, // ?  newvalue : \\\"Not Defined\\\" \\n                'forced': true\\n            };\\n            codeValueArray.push(cvpair);\\n        };\\n    }\\n\\n    function decoder(str) { // decode rawdata\\n        // CARE Decoder\\n        // AddValue(codeValues, 'Message : ', str);\\n        var message = str;\\n        var index = 18;\\n        //parse header & properties\\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 sequenceID = message.substring(12, 16);\\n        var command = message.substring(16, 18);\\n        //mask bitwise   (properties should be '10')\\n        if ((parseInt(properties) & 8) == 8) {\\n            needsAck = true;\\n        } else needsAck = false;\\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 = hex_to_ascii(value);\\n                            // create long connection if it is needed\\n                            if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n                                sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\n                                AddValue(codeValues, \\\"imei\\\", imei);\\n                                // AddValue(codeValues, 'ack', 'AB00030008C7' + sequenceID + '7F0100');\\n                                return;\\n                            }\\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  ¿qué es fall OFF?\\n                            if ((alarmCodeExtInt & 1) == 1) {\\n                                var alarm = 'ALF-C'; // Fall-DownAlertending\\n                            }\\n                            // Welfare Check-out\\n                            else if ((alarmCodeExtInt & 2) == 2) {\\n                                var alarm = 'WSTP';\\n                                if (configs.Welfare !== undefined) {\\n                                    if (configs.Welfare.Mode == '1') {\\n                                        info = 'Recurrent';\\n                                    } else info = 'Amber';\\n                                }\\n                            }\\n                            //Geo 5 in\\n                            //else if ((alarmCodeInt & 16) == 16) {\\n                            //    var alarm = 'BATL';\\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 Alert\\n                            else if ((alarmCodeInt & 8) == 8) {\\n                                var alarm = 'TLT';\\n                            }\\n                            // Geo IN - OUT\\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 Alert\\n                            else if ((alarmCodeInt & 256) == 256) {\\n                                var alarm = 'PWRF';\\n                            }\\n                            //Power On Alert\\n                            else if ((alarmCodeInt & 512) == 512) {\\n                                var alarm = 'PWRN';\\n                            }\\n                            //Motion Alert\\n                            else if ((alarmCodeInt & 1024) == 1024) {\\n                                var alarm = 'ALMOV';\\n                            }\\n                            //No Motion Alert\\n                            else if ((alarmCodeInt & 2048) == 2048) {\\n                                var alarm = 'ALNM';\\n                            }\\n                            //SOS\\n                            else if ((alarmCodeInt & 4096) == 4096) {\\n                                var alarm = 'ALSOS';\\n                            }\\n                            // Side call button 1\\n                            else if ((alarmCodeInt & 8192) == 8192) {\\n                                var alarm = 'Side1';\\n                            }\\n                            // Side call button 2\\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                                /*AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\n                                configsToAck.push(configIds.ReadState.Charging);\\n                                //configs.AlertSettings.Welfare.Mode\\n                                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\n                                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'false');\\n                                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'true');\\n                                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'false');\\n                                    configsToAck.push(configIds.ReadState.Welfare);\\n                                }*/\\n                            }\\n                            //Battery no charging\\n                            else if ((alarmCodeInt & 65536) == 65536) {\\n                                var alarm = 'BATCF';\\n                                /* AddValue(configsToUpdate, configIds.ReadState.Charging, 'false');\\n                                 configsToAck.push(configIds.ReadState.Charging);\\n                                 if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\n                                     AddValue(configsToUpdate, configIds.ReadState.Welfare, 'true');\\n                                     //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'false');\\n                                     AddConfig(configsToSend, configIds.ReadState.Welfare, 'true');\\n                                     configsToAck.push(configIds.ReadState.Welfare);\\n                                 }*/\\n                            }\\n                            //Alert End\\n                            else if ((alarmCodeInt & 131072) == 131072) {\\n                                var alarm = 'ALA-F';\\n                                info = 'Alarm Finished';\\n                                //if (configs.Welfare !== undefined) {\\n                                //    if (configs.Welfare.Mode == '1') {\\n                                //        info = 'Recurrent';\\n                                //    } else info = 'Amber';\\n                                //}\\n                            }\\n                            //Amber Alert ON    Don`t know the dfference between ALA and ALA-O\\n                            else if ((alarmCodeInt & 262144) == 262144) {\\n                                var alarm = 'ALA';\\n                            }\\n                            // welfare check in\\n                            else if ((alarmCodeInt & 524288) == 524288) {\\n                                var alarm = 'WTS';\\n                                if (configs.Welfare !== undefined) {\\n                                    if (configs.Welfare.Mode == '1') {\\n                                        info = 'Recurrent';\\n                                    } else info = 'Amber';\\n                                }\\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\\n                            else if ((alarmCodeInt & 4194304) == 4194304) {\\n                                var alarm = 'ALA-W';\\n                                if (configs.Welfare !== undefined) {\\n                                    if (configs.Welfare.Mode == '1') {\\n                                        info = 'Recurrent';\\n                                    } else info = 'Amber';\\n                                }\\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 != '64') {\\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                                    AddValue(codeValues, \\\"imei\\\", imei);\\n                                    //  AddValue(codeValues, 'ack', 'AB00030008C7' + sequenceID + '7F0100');\\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 = hex_to_ascii(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 != '64') {\\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 = (`Sentry-${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 = (`Sentry-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                            // HardCode to fix possible issue in protocol\\n                            // event_time = timestamp; \\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                            if ((statusInt & 16) == 16) {\\n                                statusDevice += 'Charging,';\\n                                // AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\n                                // configsToAck.push(configIds.ReadState.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) { //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 = hex2bin(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 = hex_to_ascii(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 = hex_to_ascii(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 = hex_to_ascii(value.substring(22, 22 + (2 * desc_leng)));\\n                                //descr = hex_to_ascii(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 = hex_to_ascii(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 != '64') {\\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 = (`Sentry-${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 != '64') {\\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 = (`Sentry-${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                //  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                // \\\"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,;\\\",\\n                if (alarmCode) {\\n                    messageForReceiver = (`Sentry-${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 = (`Sentry-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 = (`Sentry;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 = hex_to_ascii(value);\\n                            imei = serverParams.Imei;\\n                            AddValue(codeValues, \\\"imei\\\", imei);\\n                            AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\n                            messageForReceiver = (`Sentry;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': // Incoming call Ringtone Volume\\n                            var volume = hexToDecimal(value);\\n                            imei = serverParams.Imei;\\n                            messageForReceiver = (`Sentry;ACK-VOL;${imei};`);\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\n                            AddValue(codeValues, \\\"Ringtone\\\", volume);\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.IncomingCallRingtoneVolume, volume);\\n                            configsToAck.push(configIds.ReadSystemSettings.IncomingCallRingtoneVolume);\\n                            break;\\n                        case '12': // Speaker Volume\\n                            var volume = hexToDecimal(value);\\n                            AddValue(codeValues, \\\"Speaker\\\", volume);\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.InCallSpeakerVolume, volume);\\n                            configsToAck.push(configIds.ReadSystemSettings.InCallSpeakerVolume);\\n                            break;\\n                        case '1C': // Notifications and Alerts Volume\\n                            var volume = hexToDecimal(value);\\n                            AddValue(codeValues, \\\"Notifications\\\", volume);\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.NotificationsandAlerts, volume);\\n                            configsToAck.push(configIds.ReadSystemSettings.NotificationsandAlerts);\\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 = hex_to_ascii(value.substring(0, value.length));\\n                            //var workMode = hexToDecimal(value);\\n                            //var workMode = hex_to_ascii(value.substring(0, value.length));\\n                            var workMode = 1234; // + value + \\\"end\\\";\\n                            //var workModeVal = 9;\\n                            //workMode = 'test10';\\n                            imei = serverParams.Imei;\\n                            messageForReceiver = (`Sentry;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 = hex_to_ascii(value.substring(0, value.length));\\n                            imei = serverParams.Imei;\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\n                            messageForReceiver = (`Sentry;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 = hex2bin(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 = hex2bin(value.substring(2, 4)); // To find allow list setup\\n                            if (statusPhone.substring(7, 8) == '1') { // 1 Enable\\n                                var allow = 'true';\\n                            } else var allow = 'false';\\n                            // To find LT setup\\n                            if (statusPhone.substring(5, 6) == '1') { // 1 Enable\\n                                var silentCall = 'true';\\n                            } else var silentCall = 'false';\\n                            //statusPhone = hex2bin(value.substring(0, 2)) + hex2bin(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                            AddValue(configsToUpdate, configIds.ReadProfiles.SilentCallMode, silentCall);\\n                            //configsToAck.push(configIds.ReadSystemSettings.Statusphone);\\n                            configsToAck.push(configIds.ReadSystemSettings.AllowList);\\n                            configsToAck.push(configIds.ReadSystemSettings.AutoAnswer);\\n                            configsToAck.push(configIds.ReadProfiles.SilentCallMode);\\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                            var report;\\n                            switch (contactNumber) {\\n                                // Emergency Number\\n                                // [Value]:80 2B 33 34 36 33 35 36 30 37 39 33 30\\n                                //{\\\"number\\\":{\\\"call\\\":0,\\\"noCard\\\":0,\\\"number\\\":\\\"+34635607930\\\",\\\"enable\\\":1,\\\"sms\\\":0,\\\"index\\\":0}}\\n                                case '0':\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\n                                    if (tel.length < 6) { //if no telephone defined\\n                                        tel = '';\\n                                    }\\n                                    report = hex2bin(value.substring(0, 2)); // To find report mode Call &data or DAta only\\n                                    AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\n                                    AddValue(codeValues, \\\"ReportMode\\\", report.substring(2, 3));\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.ReportMode, report.substring(2, 3));\\n                                    configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\n                                    configsToAck.push(configIds.ReadAlertSettings.ReportMode);\\n                                    break;\\n                                    // Speed Dial Number\\n                                case '1':\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\n                                    if (tel.length < 6) { //if no telephone defined\\n                                        tel = '';\\n                                    }\\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 = hex_to_ascii(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 = hex_to_ascii(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 = hex_to_ascii(value.substring(0, value.length));\\n                            imei = serverParams.Imei;\\n                            break;\\n                        case '41': // APN Username\\n                            //no ACK need\\n                            //apn = apn + ',' + hex_to_ascii(value.substring(0, value.length));\\n                            break;\\n                        case '42': // APN Password\\n                            //no ACK need\\n                            //apn = apn + ',' + hex_to_ascii(value.substring(0, value.length));\\n                            messageForReceiver = (`Sentry;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 = hex_to_ascii(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 = (`Sentry;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 = (`Sentry;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 = hex2bin(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 = (`Sentry;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 '55': // Tilt Angle Alert\\n                            //[Value]:0A 00 1E 00\\n                            //{\\\"tiltAlert\\\":{\\\"angle\\\":30,\\\"time\\\":10,\\\"status\\\":0,\\\"dial\\\":0}}\\n                            var angle = hexToDecimal(value.substring(4, 6));\\n                            var timeout = hexToDecimal(value.substring(0, 2));\\n                            var status = hexToDecimal(value.substring(6, 8));\\n                            if (status == 0) angle = 0;\\n                            //var alertSetting = angle;\\n                            //imei = serverParams.Imei;\\n                            //messageForReceiver = (`Sentry;ACK-TILTANG;${imei};`);\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\n                            AddValue(codeValues, \\\"tiltangle\\\", angle);\\n                            AddValue(codeValues, \\\"tiltimeout\\\", timeout);\\n                            AddValue(codeValues, \\\"tiltstatus\\\", status);\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltTimeout, timeout);\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltAngle, angle);\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltTimeout);\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltAngle);\\n                            break;\\n                        case '56': //Fall down sensibility\\n                            // '00001100'\\n                            var fallStatus = hex2bin(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 = (`Sentry;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.ManDownSettings, sensibility);\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.EnableDisableManDownSettings, enalbleDisable);\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.Sensitivity, sesibityOptionValue);\\n                            //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\n                            configsToAck.push(configIds.ReadManDownSettings.EnableDisableManDownSettings);\\n                            configsToAck.push(configIds.ReadManDownSettings.Sensitivity);\\n                            break;\\n                        case '57': // Welfare\\n                            // [Value]:10 0E 00 80 58 02 00 80\\n                            //{\\\"welfareAlert\\\":{\\\"time\\\":600,\\\"value\\\":3600,\\\"status\\\":1,\\\"dial\\\":1}}\\n                            var welfareStatus = hex2bin(value.substring(6, 8)); // check status\\n                            var welfareValue = hexToDecimal(changeEndianness(value.substring(0, 6)));\\n                            var welfareTime = hexToDecimal(changeEndianness(value.substring(8, 14)));\\n                            var enalbleDisable = '';\\n                            if ((configs.ReadState.Charging == 'true') && (configs.Welfare.Mode == '1') && (configs.Welfare.EnableDisableWelfare == 'true')) { // Force Read to enable welfare when device is charging in recurrent mode\\n                                var sensibility = 'Enable, '\\n                                enalbleDisable = '1'\\n                            } else {\\n                                if (welfareStatus.substring(0, 1) == '1') {\\n                                    var sensibility = 'Enable, '\\n                                    enalbleDisable = '1'\\n                                } else {\\n                                    var sensibility = 'Disable, '\\n                                    //enalbleDisable = '0'\\n                                }\\n                            };\\n                            //var imei = serverParams.Imei;\\n                            //messageForReceiver = (`Sentry;ACK-WELFALERT;${imei};`);\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\n                            sensibility += welfareValue / 60;\\n                            sensibility += ', ' + welfareTime / 60;\\n                            AddValue(codeValues, \\\"welfare\\\", sensibility);\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.EnableDisableReadWelfare, enalbleDisable);\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Prealarm, welfareTime / 60);\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Timeout, welfareValue / 60);\\n                            configsToAck.push(configIds.ReadWelfareSettings.EnableDisableReadWelfare);\\n                            configsToAck.push(configIds.ReadWelfareSettings.Prealarm);\\n                            configsToAck.push(configIds.ReadWelfareSettings.Timeout);\\n                            break;\\n                        case '73': //BeaconList\\n                            var beaconNumber = hexToDecimal(value.substring(1, 2));\\n                            var beaconStatus = hex2bin(value.substring(0, 1));\\n                            //if (beaconStatus.substring(4, 5) == '1') {\\n                            //    homeBeacon += ' Enable, '\\n                            //} else {\\n                            //    homeBeacon += ' Disable, '\\n                            //};\\n                            beaconStatus = hex_to_ascii(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 = (`Sentry;ACK-GDATA;${imei};`);\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\n                            AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\n                            configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\n                            break;\\n                        case '75': // Extra Enable control   Welfare Mode\\n                            //[Value]:80 00 00 10  last two digit for new/old welfare\\n                            //{\\\"extraControl\\\":{\\\"bit29\\\":0,\\\"bit27\\\":0,\\\"bit28\\\":1,\\\"bit25\\\":0,\\\"bit26\\\":0,\\\"flagValue\\\":268435584,\\\"bit23\\\":0,\\\"bit24\\\":0,\\\"bit21\\\":0,\\\"bit22\\\":0,\\\"bit20\\\":0,\\\"bit9\\\":0,\\\"bit18\\\":0,\\\"bit19\\\":0,\\\"bit7\\\":1,\\\"bit16\\\":0,\\\"bit8\\\":0,\\\"bit17\\\":0,\\\"bit5\\\":0,\\\"bit14\\\":0,\\\"bit6\\\":0,\\\"bit15\\\":0,\\\"bit3\\\":0,\\\"bit4\\\":0,\\\"bit1\\\":0,\\\"bit2\\\":0,\\\"bit0\\\":0,\\\"bit12\\\":0,\\\"bit13\\\":0,\\\"bit10\\\":0,\\\"bit11\\\":0,\\\"bit30\\\":0,\\\"bit31\\\":0}}\\n                            var extraStatus = hex2bin(value.substring(6, 7)).substring(7, 8);\\n                            //if (extraStatus.substring(7, 8) == '1') {\\n                            //    extra += ' Enable, '\\n                            //} else {\\n                            //    extra += ' Disable, '\\n                            //};\\n                            //beaconStatus = hex_to_ascii(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, \\\"welfare Mode\\\", extraStatus);\\n                            // messageForReceiver = (`Sentry;ACK-EXTRA;${imei};`);\\n                            // sendMessageToLocalhostNoWait(messageForReceiver);\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Mode, extraStatus);\\n                            configsToAck.push(configIds.ReadWelfareSettings.Mode);\\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 = hex_to_ascii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\n                                var wifiPassword = hex_to_ascii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\n                                var imei = serverParams.Imei;\\n                                messageForReceiver = (`Sentry;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 = hex2bin(value.substring(2, 4)); //always pass 2 HEXs to this function\\n                            var alertSetting = '';\\n                            var enalbleDisable = '';\\n                            var triggerMode = '';\\n                            if (status.substring(0, 1) == '1') {\\n                                alertSetting = 'Enable, '\\n                                enalbleDisable = '1'\\n                            } else {\\n                                alertSetting = 'Disable, '\\n                                //enableDisable = '0';\\n                            };\\n                            triggerMode = status.substring(2, 3);\\n                            if (triggerMode == '1') {\\n                                alertSetting += 'Double Press, '\\n                            } else {\\n                                alertSetting += 'Long Press, '\\n                            };\\n                            //var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\n                            //alertSetting += time;\\n                            imei = serverParams.Imei;\\n                            messageForReceiver = (`Sentry;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.ReadInterfaceOptions.SpeedActivationDialButton, triggerMode);\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\n                            configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\n                            configsToAck.push(configIds.ReadInterfaceOptions.SpeedActivationDialButton);\\n                            break;\\n                        case '20': // SOS Button Settings\\n                            // [Length]:03 [Key]:20 [Value]:7B 9E {\\\"sosButton\\\":{\\\"mode\\\":0,\\\"feedBack\\\":3,\\\"task\\\":15,\\\"time\\\":30,\\\"status\\\":1}}\\n                            var status = hex2bin(value.substring(2, 4)); //always pass 2 HEXs to this function\\n                            var alertSetting = '';\\n                            //var enalbleDisable = '';\\n                            var triggerMode = '';\\n                            if (status.substring(0, 1) == '1') {\\n                                alertSetting = 'Enable, '\\n                                // enalbleDisable = '1'\\n                            } else {\\n                                alertSetting = 'Disable, '\\n                                //enableDisable = '0';\\n                            };\\n                            triggerMode = status.substring(2, 3);\\n                            if (triggerMode == '1') {\\n                                alertSetting += 'Double Press, '\\n                            } else {\\n                                alertSetting += 'Long Press, '\\n                            };\\n                            //var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\n                            //alertSetting += time;\\n                            //imei = serverParams.Imei;\\n                            //messageForReceiver = (`Sentry;ACK-SPEED;${imei};`);\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\n                            AddValue(codeValues, \\\"sos\\\", alertSetting);\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\n                            //AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\n                            AddValue(configsToUpdate, configIds.ReadInterfaceOptions.SOSActivationButton, triggerMode);\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\n                            //configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\n                            configsToAck.push(configIds.ReadInterfaceOptions.SOSActivationButton);\\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 = hex_to_ascii(value);\\n                            // create long connection if it is needed\\n                            if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n                                sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\n                                AddValue(codeValues, \\\"imei\\\", imei);\\n                                // AddValue(codeValues, 'ack', 'AB00030008C7' + sequenceID + '7F0100');\\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 = hex_to_ascii(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 = hex2bin(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 = (`Sentry-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 = hex_to_ascii(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 = (`Sentry-${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 = (`Sentry-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 = (`Sentry-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 = (`Sentry-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 = hex_to_ascii(rawFromBytes.substring(i, i + 30));\\n                AddValue(codeValues, \\\"imei\\\", imei);\\n            }\\n        }\\n    }\\n\\n    function ascii_to_hexa(str) { // ascii to hex \\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\\n    function 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\\n    function 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    }\\n\\n    function hex2bin(hex) { //\\n        return (parseInt(hex, 16).toString(2)).padStart(8, '0');\\n    }\\n\\n    function calculateCheckSum(payloadData) { // check if payload checksum is valid\\n        var checksum = byteStringToByteArray(payloadData);\\n        checksum = crc16byte(checksum);\\n        checksum = decimalToHex(checksum);\\n        checksum = ('0000' + checksum).slice(-4).toUpperCase();\\n        return changeEndianness(checksum);\\n    }\\n\\n    function 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\\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 decimalToHex(x) { // decimal to hex\\n        x = x.toString(16).toUpperCase();\\n        return x;\\n    }\\n\\n    function hex_to_ascii(str1) { // Hex to Ascii \\n        var hex = str1.toString();\\n        var str = '';\\n        for (var n = 0; n < hex.length; n += 2) {\\n            str += String.fromCharCode(parseInt(hex.substr(n, 2), 16));\\n        }\\n        return str;\\n    }\\n\\n    function hexToDecimalSigned(hex) { // hex to decimal\\n        if (hex.length % 2 != 0) {\\n            hex = \\\"0\\\" + hex;\\n        }\\n        var num = parseInt(hex, 16);\\n        var maxVal = Math.pow(2, hex.length / 2 * 8);\\n        if (num > maxVal / 2 - 1) {\\n            num = num - maxVal;\\n        }\\n        return num;\\n    }\\n\\n    function hexToDecimal(x) {\\n        x = parseInt(x, 16);\\n        return x;\\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 acceptance server the message ... ');\\n            console.log(str);\\n            server = '52.174.17.77';\\n        } else {\\n            server = '127.0.0.1';\\n        }\\n        var c = net.createConnection(5678, server);\\n        c.on('error', function(error) {\\n            c = net.createConnection(5678, server);\\n        });\\n        c.write(`${str}`);\\n        c.end();\\n    }\\n    // modify to return the object that contains your data\\n    return dataToReceiver;\\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":1750686495},{"Type":1,"NewValue":"{\"Id\":362,\"Name\":\"Access PS Sentry\",\"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    // Sentry protocol - please see variables and typical values in order below\\r\\n    // Sentry-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    // Sentry-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 N.\\r\\n    // Created: 01/01/2025\\r\\n    // Last modified: 23/06/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', 'Sentry');\\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 = (`Sentry-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        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        // Check if total lenght of the complete message is higher than total lenght of the first message\\r\\n        // to know if the message includes more than one\\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 longitud = message.length - 16;\\r\\n        // Loop to decode multi msg, includes \\\"AB\\\" more than one time\\r\\n        //const matches = message.match(/AB/g);\\r\\n        //if (matches && matches.length > 1) {\\r\\n        if (total_length != longitud) { //if true then the msg contains more than one msg (possible bug of the device)\\r\\n            const multiack = message.split('AB');\\r\\n            for (let i = 1; i < multiack.length; i++) {\\r\\n                message = 'AB' + multiack[i];\\r\\n                debug(message);\\r\\n                decoder(message);\\r\\n            }\\r\\n        } else decoder(message); // it contains only one msg\\r\\n        /*if (message.includes('AB00030008C7')) {// IF multiACK\\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); */\\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 'BATCN': // Battery Charging - On\\r\\n                AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                configsToAck.push(configIds.ReadState.Charging);\\r\\n                //configs.AlertSettings.Welfare.Mode\\r\\n                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'false');\\r\\n                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'true');\\r\\n                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'false');\\r\\n                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                }\\r\\n                break;\\r\\n            case 'BATCF': // Battery Charging - Off\\r\\n                AddValue(configsToUpdate, configIds.ReadState.Charging, 'false');\\r\\n                configsToAck.push(configIds.ReadState.Charging);\\r\\n                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'true');\\r\\n                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'false');\\r\\n                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'true');\\r\\n                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                }\\r\\n                break;\\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 Sentry-')) {\\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 = (`Sentry-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 = (`Sentry;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 = (`Sentry;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 = (`Sentry-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    // 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        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\\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                                // no 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  ¿qué es fall OFF?\\r\\n                            if ((alarmCodeExtInt & 1) == 1) {\\r\\n                                var alarm = 'ALF-C'; // Fall-DownAlertending\\r\\n                            }\\r\\n                            // Welfare Check-out\\r\\n                            else if ((alarmCodeExtInt & 2) == 2) {\\r\\n                                var alarm = 'WSTP';\\r\\n                                if (configs.Welfare !== undefined) {\\r\\n                                    if (configs.Welfare.Mode == '1') {\\r\\n                                        info = 'Recurrent';\\r\\n                                    } else info = 'Amber';\\r\\n                                }\\r\\n                            }\\r\\n                            //Geo 5 in\\r\\n                            //else if ((alarmCodeInt & 16) == 16) {\\r\\n                            //    var alarm = 'BATL';\\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 Alert\\r\\n                            else if ((alarmCodeInt & 8) == 8) {\\r\\n                                var alarm = 'TLT';\\r\\n                            }\\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 Alert\\r\\n                            else if ((alarmCodeInt & 256) == 256) {\\r\\n                                var alarm = 'PWRF';\\r\\n                            }\\r\\n                            //Power On Alert\\r\\n                            else if ((alarmCodeInt & 512) == 512) {\\r\\n                                var alarm = 'PWRN';\\r\\n                            }\\r\\n                            //Motion Alert\\r\\n                            else if ((alarmCodeInt & 1024) == 1024) {\\r\\n                                var alarm = 'ALMOV';\\r\\n                            }\\r\\n                            //No Motion Alert\\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                            }\\r\\n                            // Side call button 1\\r\\n                            else if ((alarmCodeInt & 8192) == 8192) {\\r\\n                                var alarm = 'Side1';\\r\\n                            }\\r\\n                            // Side call button 2\\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                                /*AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                                configsToAck.push(configIds.ReadState.Charging);\\r\\n                                //configs.AlertSettings.Welfare.Mode\\r\\n                                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'false');\\r\\n                                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'true');\\r\\n                                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'false');\\r\\n                                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                                }*/\\r\\n                            }\\r\\n                            //Battery no charging\\r\\n                            else if ((alarmCodeInt & 65536) == 65536) {\\r\\n                                var alarm = 'BATCF';\\r\\n                                /* AddValue(configsToUpdate, configIds.ReadState.Charging, 'false');\\r\\n                                 configsToAck.push(configIds.ReadState.Charging);\\r\\n                                 if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                                     AddValue(configsToUpdate, configIds.ReadState.Welfare, 'true');\\r\\n                                     //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'false');\\r\\n                                     AddConfig(configsToSend, configIds.ReadState.Welfare, 'true');\\r\\n                                     configsToAck.push(configIds.ReadState.Welfare);\\r\\n                                 }*/\\r\\n                            }\\r\\n                            //Alert End\\r\\n                            else if ((alarmCodeInt & 131072) == 131072) {\\r\\n                                var alarm = 'ALA-F';\\r\\n                                info = 'Alarm Finished';\\r\\n                                //if (configs.Welfare !== undefined) {\\r\\n                                //    if (configs.Welfare.Mode == '1') {\\r\\n                                //        info = 'Recurrent';\\r\\n                                //    } else info = 'Amber';\\r\\n                                //}\\r\\n                            }\\r\\n                            //Amber Alert ON    Don`t know the dfference between ALA and ALA-O\\r\\n                            else if ((alarmCodeInt & 262144) == 262144) {\\r\\n                                var alarm = 'ALA';\\r\\n                            }\\r\\n                            // welfare check in\\r\\n                            else if ((alarmCodeInt & 524288) == 524288) {\\r\\n                                var alarm = 'WTS';\\r\\n                                if (configs.Welfare !== undefined) {\\r\\n                                    if (configs.Welfare.Mode == '1') {\\r\\n                                        info = 'Recurrent';\\r\\n                                    } else info = 'Amber';\\r\\n                                }\\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\\r\\n                            else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n                                var alarm = 'ALA-W';\\r\\n                                if (configs.Welfare !== undefined) {\\r\\n                                    if (configs.Welfare.Mode == '1') {\\r\\n                                        info = 'Recurrent';\\r\\n                                    } else info = 'Amber';\\r\\n                                }\\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                            //update customID to check if belongs to this type of device\\r\\n                            customID = value;\\r\\n                            if (value != '64') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\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                                    //no 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 != '64') {\\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 = (`Sentry-${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 = (`Sentry-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                            if ((statusInt & 16) == 16) {\\r\\n                                statusDevice += 'Charging,';\\r\\n                                // AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                                // configsToAck.push(configIds.ReadState.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 != '64') {\\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 = (`Sentry-${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 != '64') {\\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 = (`Sentry-${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 = (`Sentry-${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 = (`Sentry-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 = (`Sentry;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 = (`Sentry;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                            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': // Incoming call Ringtone Volume\\r\\n                            var volume = hexToDecimal(value);\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Sentry;ACK-VOL;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"Ringtone\\\", volume);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.IncomingCallRingtoneVolume, volume);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.IncomingCallRingtoneVolume);\\r\\n                            break;\\r\\n                        case '12': // Speaker Volume\\r\\n                            var volume = hexToDecimal(value);\\r\\n                            AddValue(codeValues, \\\"Speaker\\\", volume);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.InCallSpeakerVolume, volume);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.InCallSpeakerVolume);\\r\\n                            break;\\r\\n                        case '1C': // Notifications and Alerts Volume\\r\\n                            var volume = hexToDecimal(value);\\r\\n                            AddValue(codeValues, \\\"Notifications\\\", volume);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.NotificationsandAlerts, volume);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.NotificationsandAlerts);\\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 = (`Sentry;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 = (`Sentry;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                                var allow = 'true';\\r\\n                            } else var allow = 'false';\\r\\n                            // To find LT setup\\r\\n                            if (statusPhone.substring(5, 6) == '1') { // 1 Enable\\r\\n                                var silentCall = 'true';\\r\\n                            } else var silentCall = '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                            AddValue(configsToUpdate, configIds.ReadProfiles.SilentCallMode, silentCall);\\r\\n                            //configsToAck.push(configIds.ReadSystemSettings.Statusphone);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AllowList);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AutoAnswer);\\r\\n                            configsToAck.push(configIds.ReadProfiles.SilentCallMode);\\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                            var report;\\r\\n                            switch (contactNumber) {\\r\\n                                // Emergency Number\\r\\n                                // [Value]:80 2B 33 34 36 33 35 36 30 37 39 33 30\\r\\n                                //{\\\"number\\\":{\\\"call\\\":0,\\\"noCard\\\":0,\\\"number\\\":\\\"+34635607930\\\",\\\"enable\\\":1,\\\"sms\\\":0,\\\"index\\\":0}}\\r\\n                                case '0':\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.length < 6) { //if no telephone defined\\r\\n                                        tel = '';\\r\\n                                    }\\r\\n                                    report = hex2bin(value.substring(0, 2)); // To find report mode Call &data or DAta only\\r\\n                                    AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                                    AddValue(codeValues, \\\"ReportMode\\\", report.substring(2, 3));\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.ReportMode, report.substring(2, 3));\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.ReportMode);\\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                                    if (tel.length < 6) { //if no telephone defined\\r\\n                                        tel = '';\\r\\n                                    }\\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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 '55': // Tilt Angle Alert\\r\\n                            //[Value]:0A 00 1E 00\\r\\n                            //{\\\"tiltAlert\\\":{\\\"angle\\\":30,\\\"time\\\":10,\\\"status\\\":0,\\\"dial\\\":0}}\\r\\n                            var angle = hexToDecimal(value.substring(4, 6));\\r\\n                            var timeout = hexToDecimal(value.substring(0, 2));\\r\\n                            var status = hexToDecimal(value.substring(6, 8));\\r\\n                            if (status == 0) angle = 0;\\r\\n                            //var alertSetting = angle;\\r\\n                            //imei = serverParams.Imei;\\r\\n                            //messageForReceiver = (`Sentry;ACK-TILTANG;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"tiltangle\\\", angle);\\r\\n                            AddValue(codeValues, \\\"tiltimeout\\\", timeout);\\r\\n                            AddValue(codeValues, \\\"tiltstatus\\\", status);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltTimeout, timeout);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltAngle, angle);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltTimeout);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltAngle);\\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 = (`Sentry;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.ManDownSettings, sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.EnableDisableManDownSettings, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.Sensitivity, sesibityOptionValue);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.EnableDisableManDownSettings);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.Sensitivity);\\r\\n                            break;\\r\\n                        case '57': // Welfare\\r\\n                            // [Value]:10 0E 00 80 58 02 00 80\\r\\n                            //{\\\"welfareAlert\\\":{\\\"time\\\":600,\\\"value\\\":3600,\\\"status\\\":1,\\\"dial\\\":1}}\\r\\n                            var welfareStatus = hex2bin(value.substring(6, 8)); // check status\\r\\n                            var welfareValue = hexToDecimal(changeEndianness(value.substring(0, 6)));\\r\\n                            var welfareTime = hexToDecimal(changeEndianness(value.substring(8, 14)));\\r\\n                            var enalbleDisable = '';\\r\\n                            if ((configs.ReadState.Charging == 'true') && (configs.Welfare.Mode == '1') && (configs.Welfare.EnableDisableWelfare == 'true')) { // Force Read to enable welfare when device is charging in recurrent mode\\r\\n                                var sensibility = 'Enable, '\\r\\n                                enalbleDisable = '1'\\r\\n                            } else {\\r\\n                                if (welfareStatus.substring(0, 1) == '1') {\\r\\n                                    var sensibility = 'Enable, '\\r\\n                                    enalbleDisable = '1'\\r\\n                                } else {\\r\\n                                    var sensibility = 'Disable, '\\r\\n                                    //enalbleDisable = '0'\\r\\n                                }\\r\\n                            };\\r\\n                            //var imei = serverParams.Imei;\\r\\n                            //messageForReceiver = (`Sentry;ACK-WELFALERT;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            sensibility += welfareValue / 60;\\r\\n                            sensibility += ', ' + welfareTime / 60;\\r\\n                            AddValue(codeValues, \\\"welfare\\\", sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.EnableDisableReadWelfare, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Prealarm, welfareTime / 60);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Timeout, welfareValue / 60);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.EnableDisableReadWelfare);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Prealarm);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Timeout);\\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 = (`Sentry;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 '75': // Extra Enable control   Welfare Mode\\r\\n                            //[Value]:80 00 00 10  last two digit for new/old welfare\\r\\n                            //{\\\"extraControl\\\":{\\\"bit29\\\":0,\\\"bit27\\\":0,\\\"bit28\\\":1,\\\"bit25\\\":0,\\\"bit26\\\":0,\\\"flagValue\\\":268435584,\\\"bit23\\\":0,\\\"bit24\\\":0,\\\"bit21\\\":0,\\\"bit22\\\":0,\\\"bit20\\\":0,\\\"bit9\\\":0,\\\"bit18\\\":0,\\\"bit19\\\":0,\\\"bit7\\\":1,\\\"bit16\\\":0,\\\"bit8\\\":0,\\\"bit17\\\":0,\\\"bit5\\\":0,\\\"bit14\\\":0,\\\"bit6\\\":0,\\\"bit15\\\":0,\\\"bit3\\\":0,\\\"bit4\\\":0,\\\"bit1\\\":0,\\\"bit2\\\":0,\\\"bit0\\\":0,\\\"bit12\\\":0,\\\"bit13\\\":0,\\\"bit10\\\":0,\\\"bit11\\\":0,\\\"bit30\\\":0,\\\"bit31\\\":0}}\\r\\n                            var extraStatus = hex2bin(value.substring(6, 7)).substring(7, 8);\\r\\n                            //if (extraStatus.substring(7, 8) == '1') {\\r\\n                            //    extra += ' Enable, '\\r\\n                            //} else {\\r\\n                            //    extra += ' 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, \\\"welfare Mode\\\", extraStatus);\\r\\n                            // messageForReceiver = (`Sentry;ACK-EXTRA;${imei};`);\\r\\n                            // sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Mode, extraStatus);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Mode);\\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 = (`Sentry;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                            var triggerMode = '';\\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                            triggerMode = status.substring(2, 3);\\r\\n                            if (triggerMode == '1') {\\r\\n                                alertSetting += 'Double Press, '\\r\\n                            } else {\\r\\n                                alertSetting += 'Long Press, '\\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 = (`Sentry;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.ReadInterfaceOptions.SpeedActivationDialButton, triggerMode);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n                            configsToAck.push(configIds.ReadInterfaceOptions.SpeedActivationDialButton);\\r\\n                            break;\\r\\n                        case '20': // SOS Button Settings\\r\\n                            // [Length]:03 [Key]:20 [Value]:7B 9E {\\\"sosButton\\\":{\\\"mode\\\":0,\\\"feedBack\\\":3,\\\"task\\\":15,\\\"time\\\":30,\\\"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                            var triggerMode = '';\\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                            triggerMode = status.substring(2, 3);\\r\\n                            if (triggerMode == '1') {\\r\\n                                alertSetting += 'Double Press, '\\r\\n                            } else {\\r\\n                                alertSetting += 'Long Press, '\\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 = (`Sentry;ACK-SPEED;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"sos\\\", alertSetting);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadInterfaceOptions.SOSActivationButton, triggerMode);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            //configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n                            configsToAck.push(configIds.ReadInterfaceOptions.SOSActivationButton);\\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 = (`Sentry-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 = (`Sentry-${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 = (`Sentry-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 = (`Sentry-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 = (`Sentry-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(...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 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":1750700224},{"Type":1,"NewValue":"{\"Id\":362,\"Name\":\"Access PS Sentry\",\"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    // Sentry protocol - please see variables and typical values in order below\\r\\n    // Sentry-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    // Sentry-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 N.\\r\\n    // Created: 01/01/2025\\r\\n    // Last modified: 23/06/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', 'Sentry');\\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 = (`Sentry-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        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        // Check if total lenght of the complete message is higher than total lenght of the first message\\r\\n        // to know if the message includes more than one\\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 longitud = message.length - 16;\\r\\n        // Loop to decode multi msg, includes \\\"AB\\\" more than one time\\r\\n        //const matches = message.match(/AB/g);\\r\\n        //if (matches && matches.length > 1) {\\r\\n        if (total_length != longitud) { //if true then the msg contains more than one msg (possible bug of the device)\\r\\n            const multiack = message.split('AB');\\r\\n            for (let i = 1; i < multiack.length; i++) {\\r\\n                message = 'AB' + multiack[i];\\r\\n                debug(message);\\r\\n                decoder(message);\\r\\n            }\\r\\n        } else decoder(message); // it contains only one msg\\r\\n        /*if (message.includes('AB00030008C7')) {// IF multiACK\\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); */\\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 'BATCN': // Battery Charging - On\\r\\n                AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                configsToAck.push(configIds.ReadState.Charging);\\r\\n                //configs.AlertSettings.Welfare.Mode\\r\\n                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'false');\\r\\n                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'true');\\r\\n                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'false');\\r\\n                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                }\\r\\n                break;\\r\\n            case 'BATCF': // Battery Charging - Off\\r\\n                AddValue(configsToUpdate, configIds.ReadState.Charging, 'false');\\r\\n                configsToAck.push(configIds.ReadState.Charging);\\r\\n                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'true');\\r\\n                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'false');\\r\\n                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'true');\\r\\n                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                }\\r\\n                break;\\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 Sentry-')) {\\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 = (`Sentry-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 = (`Sentry;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 = (`Sentry;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 = (`Sentry-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    // 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        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\\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                                // no 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  ¿qué es fall OFF?\\r\\n                            if ((alarmCodeExtInt & 1) == 1) {\\r\\n                                var alarm = 'ALF-C'; // Fall-DownAlertending\\r\\n                            }\\r\\n                            // Welfare Check-out\\r\\n                            else if ((alarmCodeExtInt & 2) == 2) {\\r\\n                                //var alarm = 'WSTP';\\r\\n                                if (configs.Welfare !== undefined) {\\r\\n                                    if (configs.Welfare.Mode == '1') {\\r\\n                                        //info = 'Recurrent';\\r\\n                                        var alarm = 'WSTP';\\r\\n                                    } else {\\r\\n                                        //info = 'Amber';\\r\\n                                        var alarm = 'ALA-C';\\r\\n                                    }\\r\\n                                }\\r\\n                            }\\r\\n                            //Geo 5 in\\r\\n                            //else if ((alarmCodeInt & 16) == 16) {\\r\\n                            //    var alarm = 'BATL';\\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 Alert\\r\\n                            else if ((alarmCodeInt & 8) == 8) {\\r\\n                                var alarm = 'TLT';\\r\\n                            }\\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 Alert\\r\\n                            else if ((alarmCodeInt & 256) == 256) {\\r\\n                                var alarm = 'PWRF';\\r\\n                            }\\r\\n                            //Power On Alert\\r\\n                            else if ((alarmCodeInt & 512) == 512) {\\r\\n                                var alarm = 'PWRN';\\r\\n                            }\\r\\n                            //Motion Alert\\r\\n                            else if ((alarmCodeInt & 1024) == 1024) {\\r\\n                                var alarm = 'ALMOV';\\r\\n                            }\\r\\n                            //No Motion Alert\\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                            }\\r\\n                            // Side call button 1\\r\\n                            else if ((alarmCodeInt & 8192) == 8192) {\\r\\n                                var alarm = 'Side1';\\r\\n                            }\\r\\n                            // Side call button 2\\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                                /*AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                                configsToAck.push(configIds.ReadState.Charging);\\r\\n                                //configs.AlertSettings.Welfare.Mode\\r\\n                                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'false');\\r\\n                                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'true');\\r\\n                                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'false');\\r\\n                                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                                }*/\\r\\n                            }\\r\\n                            //Battery no charging\\r\\n                            else if ((alarmCodeInt & 65536) == 65536) {\\r\\n                                var alarm = 'BATCF';\\r\\n                                /* AddValue(configsToUpdate, configIds.ReadState.Charging, 'false');\\r\\n                                 configsToAck.push(configIds.ReadState.Charging);\\r\\n                                 if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                                     AddValue(configsToUpdate, configIds.ReadState.Welfare, 'true');\\r\\n                                     //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'false');\\r\\n                                     AddConfig(configsToSend, configIds.ReadState.Welfare, 'true');\\r\\n                                     configsToAck.push(configIds.ReadState.Welfare);\\r\\n                                 }*/\\r\\n                            }\\r\\n                            //Alert End\\r\\n                            else if ((alarmCodeInt & 131072) == 131072) {\\r\\n                                var alarm = 'ALA-F';\\r\\n                                info = 'Alarm Finished';\\r\\n                                //if (configs.Welfare !== undefined) {\\r\\n                                //    if (configs.Welfare.Mode == '1') {\\r\\n                                //        info = 'Recurrent';\\r\\n                                //    } else info = 'Amber';\\r\\n                                //}\\r\\n                            }\\r\\n                            //Amber Alert ON    Don`t know the dfference between ALA and ALA-O\\r\\n                            else if ((alarmCodeInt & 262144) == 262144) {\\r\\n                                var alarm = 'ALA';\\r\\n                            }\\r\\n                            // welfare check in  and amber alert ON\\r\\n                            else if ((alarmCodeInt & 524288) == 524288) {\\r\\n                                //var alarm = 'WTS';\\r\\n                                if (configs.Welfare !== undefined) {\\r\\n                                    if (configs.Welfare.Mode == '1') {\\r\\n                                        //info = 'Recurrent';\\r\\n                                        var alarm = 'WTS';\\r\\n                                    } else {\\r\\n                                        //info = 'Amber';\\r\\n                                        var alarm = 'ALA';\\r\\n                                    }\\r\\n                                }\\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\\r\\n                            else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n                                //var alarm = 'ALA-W';\\r\\n                                if (configs.Welfare !== undefined) {\\r\\n                                    if (configs.Welfare.Mode == '1') {\\r\\n                                        var alarm = 'ALA-W';\\r\\n                                        //info = 'Recurrent';\\r\\n                                    } else {\\r\\n                                        //info = 'Amber';\\r\\n                                        var alarm = 'ALA-O';\\r\\n                                    }\\r\\n                                }\\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                            //update customID to check if belongs to this type of device\\r\\n                            customID = value;\\r\\n                            if (value != '64') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\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                                    //no 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 != '64') {\\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 = (`Sentry-${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 = (`Sentry-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                            if ((statusInt & 16) == 16) {\\r\\n                                statusDevice += 'Charging,';\\r\\n                                // AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                                // configsToAck.push(configIds.ReadState.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 != '64') {\\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 = (`Sentry-${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 != '64') {\\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 = (`Sentry-${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 = (`Sentry-${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 = (`Sentry-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 = (`Sentry;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 = (`Sentry;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                            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': // Incoming call Ringtone Volume\\r\\n                            var volume = hexToDecimal(value);\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Sentry;ACK-VOL;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"Ringtone\\\", volume);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.IncomingCallRingtoneVolume, volume);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.IncomingCallRingtoneVolume);\\r\\n                            break;\\r\\n                        case '12': // Speaker Volume\\r\\n                            var volume = hexToDecimal(value);\\r\\n                            AddValue(codeValues, \\\"Speaker\\\", volume);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.InCallSpeakerVolume, volume);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.InCallSpeakerVolume);\\r\\n                            break;\\r\\n                        case '1C': // Notifications and Alerts Volume\\r\\n                            var volume = hexToDecimal(value);\\r\\n                            AddValue(codeValues, \\\"Notifications\\\", volume);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.NotificationsandAlerts, volume);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.NotificationsandAlerts);\\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 = (`Sentry;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 = (`Sentry;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                                var allow = 'true';\\r\\n                            } else var allow = 'false';\\r\\n                            // To find LT setup\\r\\n                            if (statusPhone.substring(5, 6) == '1') { // 1 Enable\\r\\n                                var silentCall = 'true';\\r\\n                            } else var silentCall = '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                            AddValue(configsToUpdate, configIds.ReadProfiles.SilentCallMode, silentCall);\\r\\n                            //configsToAck.push(configIds.ReadSystemSettings.Statusphone);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AllowList);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AutoAnswer);\\r\\n                            configsToAck.push(configIds.ReadProfiles.SilentCallMode);\\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                            var report;\\r\\n                            switch (contactNumber) {\\r\\n                                // Emergency Number\\r\\n                                // [Value]:80 2B 33 34 36 33 35 36 30 37 39 33 30\\r\\n                                //{\\\"number\\\":{\\\"call\\\":0,\\\"noCard\\\":0,\\\"number\\\":\\\"+34635607930\\\",\\\"enable\\\":1,\\\"sms\\\":0,\\\"index\\\":0}}\\r\\n                                case '0':\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.length < 6) { //if no telephone defined\\r\\n                                        tel = '';\\r\\n                                    }\\r\\n                                    report = hex2bin(value.substring(0, 2)); // To find report mode Call &data or DAta only\\r\\n                                    AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                                    AddValue(codeValues, \\\"ReportMode\\\", report.substring(2, 3));\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.ReportMode, report.substring(2, 3));\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.ReportMode);\\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                                    if (tel.length < 6) { //if no telephone defined\\r\\n                                        tel = '';\\r\\n                                    }\\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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 '55': // Tilt Angle Alert\\r\\n                            //[Value]:0A 00 1E 00\\r\\n                            //{\\\"tiltAlert\\\":{\\\"angle\\\":30,\\\"time\\\":10,\\\"status\\\":0,\\\"dial\\\":0}}\\r\\n                            var angle = hexToDecimal(value.substring(4, 6));\\r\\n                            var timeout = hexToDecimal(value.substring(0, 2));\\r\\n                            var status = hexToDecimal(value.substring(6, 8));\\r\\n                            if (status == 0) angle = 0;\\r\\n                            //var alertSetting = angle;\\r\\n                            //imei = serverParams.Imei;\\r\\n                            //messageForReceiver = (`Sentry;ACK-TILTANG;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"tiltangle\\\", angle);\\r\\n                            AddValue(codeValues, \\\"tiltimeout\\\", timeout);\\r\\n                            AddValue(codeValues, \\\"tiltstatus\\\", status);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltTimeout, timeout);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltAngle, angle);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltTimeout);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltAngle);\\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 = (`Sentry;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.ManDownSettings, sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.EnableDisableManDownSettings, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.Sensitivity, sesibityOptionValue);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.EnableDisableManDownSettings);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.Sensitivity);\\r\\n                            break;\\r\\n                        case '57': // Welfare\\r\\n                            // [Value]:10 0E 00 80 58 02 00 80\\r\\n                            //{\\\"welfareAlert\\\":{\\\"time\\\":600,\\\"value\\\":3600,\\\"status\\\":1,\\\"dial\\\":1}}\\r\\n                            var welfareStatus = hex2bin(value.substring(6, 8)); // check status\\r\\n                            var welfareValue = hexToDecimal(changeEndianness(value.substring(0, 6)));\\r\\n                            var welfareTime = hexToDecimal(changeEndianness(value.substring(8, 14)));\\r\\n                            var enalbleDisable = '';\\r\\n                            if ((configs.ReadState.Charging == 'true') && (configs.Welfare.Mode == '1') && (configs.Welfare.EnableDisableWelfare == 'true')) { // Force Read to enable welfare when device is charging in recurrent mode\\r\\n                                var sensibility = 'Enable, '\\r\\n                                enalbleDisable = '1'\\r\\n                            } else {\\r\\n                                if (welfareStatus.substring(0, 1) == '1') {\\r\\n                                    var sensibility = 'Enable, '\\r\\n                                    enalbleDisable = '1'\\r\\n                                } else {\\r\\n                                    var sensibility = 'Disable, '\\r\\n                                    //enalbleDisable = '0'\\r\\n                                }\\r\\n                            };\\r\\n                            //var imei = serverParams.Imei;\\r\\n                            //messageForReceiver = (`Sentry;ACK-WELFALERT;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            sensibility += welfareValue / 60;\\r\\n                            sensibility += ', ' + welfareTime / 60;\\r\\n                            AddValue(codeValues, \\\"welfare\\\", sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.EnableDisableReadWelfare, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Prealarm, welfareTime / 60);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Timeout, welfareValue / 60);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.EnableDisableReadWelfare);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Prealarm);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Timeout);\\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 = (`Sentry;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 '75': // Extra Enable control   Welfare Mode\\r\\n                            //[Value]:80 00 00 10  last two digit for new/old welfare\\r\\n                            //{\\\"extraControl\\\":{\\\"bit29\\\":0,\\\"bit27\\\":0,\\\"bit28\\\":1,\\\"bit25\\\":0,\\\"bit26\\\":0,\\\"flagValue\\\":268435584,\\\"bit23\\\":0,\\\"bit24\\\":0,\\\"bit21\\\":0,\\\"bit22\\\":0,\\\"bit20\\\":0,\\\"bit9\\\":0,\\\"bit18\\\":0,\\\"bit19\\\":0,\\\"bit7\\\":1,\\\"bit16\\\":0,\\\"bit8\\\":0,\\\"bit17\\\":0,\\\"bit5\\\":0,\\\"bit14\\\":0,\\\"bit6\\\":0,\\\"bit15\\\":0,\\\"bit3\\\":0,\\\"bit4\\\":0,\\\"bit1\\\":0,\\\"bit2\\\":0,\\\"bit0\\\":0,\\\"bit12\\\":0,\\\"bit13\\\":0,\\\"bit10\\\":0,\\\"bit11\\\":0,\\\"bit30\\\":0,\\\"bit31\\\":0}}\\r\\n                            var extraStatus = hex2bin(value.substring(6, 7)).substring(7, 8);\\r\\n                            //if (extraStatus.substring(7, 8) == '1') {\\r\\n                            //    extra += ' Enable, '\\r\\n                            //} else {\\r\\n                            //    extra += ' 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, \\\"welfare Mode\\\", extraStatus);\\r\\n                            // messageForReceiver = (`Sentry;ACK-EXTRA;${imei};`);\\r\\n                            // sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Mode, extraStatus);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Mode);\\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 = (`Sentry;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                            var triggerMode = '';\\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                            triggerMode = status.substring(2, 3);\\r\\n                            if (triggerMode == '1') {\\r\\n                                alertSetting += 'Double Press, '\\r\\n                            } else {\\r\\n                                alertSetting += 'Long Press, '\\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 = (`Sentry;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.ReadInterfaceOptions.SpeedActivationDialButton, triggerMode);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n                            configsToAck.push(configIds.ReadInterfaceOptions.SpeedActivationDialButton);\\r\\n                            break;\\r\\n                        case '20': // SOS Button Settings\\r\\n                            // [Length]:03 [Key]:20 [Value]:7B 9E {\\\"sosButton\\\":{\\\"mode\\\":0,\\\"feedBack\\\":3,\\\"task\\\":15,\\\"time\\\":30,\\\"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                            var triggerMode = '';\\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                            triggerMode = status.substring(2, 3);\\r\\n                            if (triggerMode == '1') {\\r\\n                                alertSetting += 'Double Press, '\\r\\n                            } else {\\r\\n                                alertSetting += 'Long Press, '\\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 = (`Sentry;ACK-SPEED;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"sos\\\", alertSetting);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadInterfaceOptions.SOSActivationButton, triggerMode);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            //configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n                            configsToAck.push(configIds.ReadInterfaceOptions.SOSActivationButton);\\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 = (`Sentry-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 = (`Sentry-${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 = (`Sentry-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 = (`Sentry-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 = (`Sentry-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(...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 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":1753207016},{"Type":1,"NewValue":"{\"Id\":362,\"Name\":\"Access PS Sentry\",\"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    // Sentry protocol - please see variables and typical values in order below\\r\\n    // Sentry-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    // Sentry-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 N.\\r\\n    // Created: 01/01/2025\\r\\n    // Last modified: 23/06/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', 'Sentry');\\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 = (`Sentry-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        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        // Check if total lenght of the complete message is higher than total lenght of the first message\\r\\n        // to know if the message includes more than one\\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 longitud = message.length - 16;\\r\\n        // Loop to decode multi msg, includes \\\"AB\\\" more than one time\\r\\n        //const matches = message.match(/AB/g);\\r\\n        //if (matches && matches.length > 1) {\\r\\n        if (total_length != longitud) { //if true then the msg contains more than one msg (possible bug of the device)\\r\\n            const multiack = message.split('AB');\\r\\n            for (let i = 1; i < multiack.length; i++) {\\r\\n                message = 'AB' + multiack[i];\\r\\n                debug(message);\\r\\n                decoder(message);\\r\\n            }\\r\\n        } else decoder(message); // it contains only one msg\\r\\n        /*if (message.includes('AB00030008C7')) {// IF multiACK\\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); */\\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 'BATCN': // Battery Charging - On\\r\\n                AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                configsToAck.push(configIds.ReadState.Charging);\\r\\n                //configs.AlertSettings.Welfare.Mode\\r\\n                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'false');\\r\\n                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'true');\\r\\n                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'false');\\r\\n                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                }\\r\\n                break;\\r\\n            case 'BATCF': // Battery Charging - Off\\r\\n                AddValue(configsToUpdate, configIds.ReadState.Charging, 'false');\\r\\n                configsToAck.push(configIds.ReadState.Charging);\\r\\n                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'true');\\r\\n                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'false');\\r\\n                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'true');\\r\\n                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                }\\r\\n                break;\\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 Sentry-')) {\\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 = (`Sentry-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 = (`Sentry;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 = (`Sentry;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 = (`Sentry-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    // 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        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\\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                                // no 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  ¿qué es fall OFF?\\r\\n                            if ((alarmCodeExtInt & 1) == 1) {\\r\\n                                var alarm = 'ALF-C'; // Fall-DownAlertending\\r\\n                            }\\r\\n                            // Welfare Check-out\\r\\n                            else if ((alarmCodeExtInt & 2) == 2) {\\r\\n                                //var alarm = 'WSTP';\\r\\n                                if (configs.Welfare !== undefined) {\\r\\n                                    if (configs.Welfare.Mode == '1') {\\r\\n                                        //info = 'Recurrent';\\r\\n                                        var alarm = 'WSTP';\\r\\n                                    } else {\\r\\n                                        //info = 'Amber';\\r\\n                                        var alarm = 'ALA-C';\\r\\n                                    }\\r\\n                                }\\r\\n                            }\\r\\n                            //Geo 5 in\\r\\n                            //else if ((alarmCodeInt & 16) == 16) {\\r\\n                            //    var alarm = 'BATL';\\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 Alert\\r\\n                            else if ((alarmCodeInt & 8) == 8) {\\r\\n                                var alarm = 'TLT';\\r\\n                            }\\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 Alert\\r\\n                            else if ((alarmCodeInt & 256) == 256) {\\r\\n                                var alarm = 'PWRF';\\r\\n                            }\\r\\n                            //Power On Alert\\r\\n                            else if ((alarmCodeInt & 512) == 512) {\\r\\n                                var alarm = 'PWRN';\\r\\n                            }\\r\\n                            //Motion Alert\\r\\n                            else if ((alarmCodeInt & 1024) == 1024) {\\r\\n                                var alarm = 'ALMOV';\\r\\n                            }\\r\\n                            //No Motion Alert\\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                            }\\r\\n                            // Side call button 1\\r\\n                            else if ((alarmCodeInt & 8192) == 8192) {\\r\\n                                var alarm = 'Side1';\\r\\n                            }\\r\\n                            // Side call button 2\\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                                /*AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                                configsToAck.push(configIds.ReadState.Charging);\\r\\n                                //configs.AlertSettings.Welfare.Mode\\r\\n                                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'false');\\r\\n                                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'true');\\r\\n                                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'false');\\r\\n                                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                                }*/\\r\\n                            }\\r\\n                            //Battery no charging\\r\\n                            else if ((alarmCodeInt & 65536) == 65536) {\\r\\n                                var alarm = 'BATCF';\\r\\n                                /* AddValue(configsToUpdate, configIds.ReadState.Charging, 'false');\\r\\n                                 configsToAck.push(configIds.ReadState.Charging);\\r\\n                                 if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                                     AddValue(configsToUpdate, configIds.ReadState.Welfare, 'true');\\r\\n                                     //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'false');\\r\\n                                     AddConfig(configsToSend, configIds.ReadState.Welfare, 'true');\\r\\n                                     configsToAck.push(configIds.ReadState.Welfare);\\r\\n                                 }*/\\r\\n                            }\\r\\n                            //Alert End\\r\\n                            else if ((alarmCodeInt & 131072) == 131072) {\\r\\n                                var alarm = 'ALA-F';\\r\\n                                info = 'Alarm Finished';\\r\\n                                //if (configs.Welfare !== undefined) {\\r\\n                                //    if (configs.Welfare.Mode == '1') {\\r\\n                                //        info = 'Recurrent';\\r\\n                                //    } else info = 'Amber';\\r\\n                                //}\\r\\n                            }\\r\\n                            //Amber Alert ON    Don`t know the dfference between ALA and ALA-O\\r\\n                            else if ((alarmCodeInt & 262144) == 262144) {\\r\\n                                var alarm = 'ALA';\\r\\n                            }\\r\\n                            // welfare check in  and amber alert ON\\r\\n                            else if ((alarmCodeInt & 524288) == 524288) {\\r\\n                                //var alarm = 'WTS';\\r\\n                                if (configs.Welfare !== undefined) {\\r\\n                                    if (configs.Welfare.Mode == '1') {\\r\\n                                        //info = 'Recurrent';\\r\\n                                        var alarm = 'WTS';\\r\\n                                    } else {\\r\\n                                        //info = 'Amber';\\r\\n                                        var alarm = 'ALA-O';\\r\\n                                    }\\r\\n                                }\\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\\r\\n                            else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n                                //var alarm = 'ALA-W';\\r\\n                                if (configs.Welfare !== undefined) {\\r\\n                                    if (configs.Welfare.Mode == '1') {\\r\\n                                        var alarm = 'ALA-W';\\r\\n                                        //info = 'Recurrent';\\r\\n                                    } else {\\r\\n                                        //info = 'Amber';\\r\\n                                        var alarm = 'ALA';\\r\\n                                    }\\r\\n                                }\\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                            //update customID to check if belongs to this type of device\\r\\n                            customID = value;\\r\\n                            if (value != '64') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\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                                    //no 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 != '64') {\\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 = (`Sentry-${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 = (`Sentry-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                            if ((statusInt & 16) == 16) {\\r\\n                                statusDevice += 'Charging,';\\r\\n                                // AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                                // configsToAck.push(configIds.ReadState.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 != '64') {\\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 = (`Sentry-${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 != '64') {\\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 = (`Sentry-${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 = (`Sentry-${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 = (`Sentry-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 = (`Sentry;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 = (`Sentry;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                            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': // Incoming call Ringtone Volume\\r\\n                            var volume = hexToDecimal(value);\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Sentry;ACK-VOL;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"Ringtone\\\", volume);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.IncomingCallRingtoneVolume, volume);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.IncomingCallRingtoneVolume);\\r\\n                            break;\\r\\n                        case '12': // Speaker Volume\\r\\n                            var volume = hexToDecimal(value);\\r\\n                            AddValue(codeValues, \\\"Speaker\\\", volume);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.InCallSpeakerVolume, volume);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.InCallSpeakerVolume);\\r\\n                            break;\\r\\n                        case '1C': // Notifications and Alerts Volume\\r\\n                            var volume = hexToDecimal(value);\\r\\n                            AddValue(codeValues, \\\"Notifications\\\", volume);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.NotificationsandAlerts, volume);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.NotificationsandAlerts);\\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 = (`Sentry;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 = (`Sentry;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                                var allow = 'true';\\r\\n                            } else var allow = 'false';\\r\\n                            // To find LT setup\\r\\n                            if (statusPhone.substring(5, 6) == '1') { // 1 Enable\\r\\n                                var silentCall = 'true';\\r\\n                            } else var silentCall = '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                            AddValue(configsToUpdate, configIds.ReadProfiles.SilentCallMode, silentCall);\\r\\n                            //configsToAck.push(configIds.ReadSystemSettings.Statusphone);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AllowList);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AutoAnswer);\\r\\n                            configsToAck.push(configIds.ReadProfiles.SilentCallMode);\\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                            var report;\\r\\n                            switch (contactNumber) {\\r\\n                                // Emergency Number\\r\\n                                // [Value]:80 2B 33 34 36 33 35 36 30 37 39 33 30\\r\\n                                //{\\\"number\\\":{\\\"call\\\":0,\\\"noCard\\\":0,\\\"number\\\":\\\"+34635607930\\\",\\\"enable\\\":1,\\\"sms\\\":0,\\\"index\\\":0}}\\r\\n                                case '0':\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.length < 6) { //if no telephone defined\\r\\n                                        tel = '';\\r\\n                                    }\\r\\n                                    report = hex2bin(value.substring(0, 2)); // To find report mode Call &data or DAta only\\r\\n                                    AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                                    AddValue(codeValues, \\\"ReportMode\\\", report.substring(2, 3));\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.ReportMode, report.substring(2, 3));\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.ReportMode);\\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                                    if (tel.length < 6) { //if no telephone defined\\r\\n                                        tel = '';\\r\\n                                    }\\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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 '55': // Tilt Angle Alert\\r\\n                            //[Value]:0A 00 1E 00\\r\\n                            //{\\\"tiltAlert\\\":{\\\"angle\\\":30,\\\"time\\\":10,\\\"status\\\":0,\\\"dial\\\":0}}\\r\\n                            var angle = hexToDecimal(value.substring(4, 6));\\r\\n                            var timeout = hexToDecimal(value.substring(0, 2));\\r\\n                            var status = hexToDecimal(value.substring(6, 8));\\r\\n                            if (status == 0) angle = 0;\\r\\n                            //var alertSetting = angle;\\r\\n                            //imei = serverParams.Imei;\\r\\n                            //messageForReceiver = (`Sentry;ACK-TILTANG;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"tiltangle\\\", angle);\\r\\n                            AddValue(codeValues, \\\"tiltimeout\\\", timeout);\\r\\n                            AddValue(codeValues, \\\"tiltstatus\\\", status);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltTimeout, timeout);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltAngle, angle);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltTimeout);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltAngle);\\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 = (`Sentry;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.ManDownSettings, sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.EnableDisableManDownSettings, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.Sensitivity, sesibityOptionValue);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.EnableDisableManDownSettings);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.Sensitivity);\\r\\n                            break;\\r\\n                        case '57': // Welfare\\r\\n                            // [Value]:10 0E 00 80 58 02 00 80\\r\\n                            //{\\\"welfareAlert\\\":{\\\"time\\\":600,\\\"value\\\":3600,\\\"status\\\":1,\\\"dial\\\":1}}\\r\\n                            var welfareStatus = hex2bin(value.substring(6, 8)); // check status\\r\\n                            var welfareValue = hexToDecimal(changeEndianness(value.substring(0, 6)));\\r\\n                            var welfareTime = hexToDecimal(changeEndianness(value.substring(8, 14)));\\r\\n                            var enalbleDisable = '';\\r\\n                            if ((configs.ReadState.Charging == 'true') && (configs.Welfare.Mode == '1') && (configs.Welfare.EnableDisableWelfare == 'true')) { // Force Read to enable welfare when device is charging in recurrent mode\\r\\n                                var sensibility = 'Enable, '\\r\\n                                enalbleDisable = '1'\\r\\n                            } else {\\r\\n                                if (welfareStatus.substring(0, 1) == '1') {\\r\\n                                    var sensibility = 'Enable, '\\r\\n                                    enalbleDisable = '1'\\r\\n                                } else {\\r\\n                                    var sensibility = 'Disable, '\\r\\n                                    //enalbleDisable = '0'\\r\\n                                }\\r\\n                            };\\r\\n                            //var imei = serverParams.Imei;\\r\\n                            //messageForReceiver = (`Sentry;ACK-WELFALERT;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            sensibility += welfareValue / 60;\\r\\n                            sensibility += ', ' + welfareTime / 60;\\r\\n                            AddValue(codeValues, \\\"welfare\\\", sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.EnableDisableReadWelfare, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Prealarm, welfareTime / 60);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Timeout, welfareValue / 60);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.EnableDisableReadWelfare);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Prealarm);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Timeout);\\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 = (`Sentry;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 '75': // Extra Enable control   Welfare Mode\\r\\n                            //[Value]:80 00 00 10  last two digit for new/old welfare\\r\\n                            //{\\\"extraControl\\\":{\\\"bit29\\\":0,\\\"bit27\\\":0,\\\"bit28\\\":1,\\\"bit25\\\":0,\\\"bit26\\\":0,\\\"flagValue\\\":268435584,\\\"bit23\\\":0,\\\"bit24\\\":0,\\\"bit21\\\":0,\\\"bit22\\\":0,\\\"bit20\\\":0,\\\"bit9\\\":0,\\\"bit18\\\":0,\\\"bit19\\\":0,\\\"bit7\\\":1,\\\"bit16\\\":0,\\\"bit8\\\":0,\\\"bit17\\\":0,\\\"bit5\\\":0,\\\"bit14\\\":0,\\\"bit6\\\":0,\\\"bit15\\\":0,\\\"bit3\\\":0,\\\"bit4\\\":0,\\\"bit1\\\":0,\\\"bit2\\\":0,\\\"bit0\\\":0,\\\"bit12\\\":0,\\\"bit13\\\":0,\\\"bit10\\\":0,\\\"bit11\\\":0,\\\"bit30\\\":0,\\\"bit31\\\":0}}\\r\\n                            var extraStatus = hex2bin(value.substring(6, 7)).substring(7, 8);\\r\\n                            //if (extraStatus.substring(7, 8) == '1') {\\r\\n                            //    extra += ' Enable, '\\r\\n                            //} else {\\r\\n                            //    extra += ' 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, \\\"welfare Mode\\\", extraStatus);\\r\\n                            // messageForReceiver = (`Sentry;ACK-EXTRA;${imei};`);\\r\\n                            // sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Mode, extraStatus);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Mode);\\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 = (`Sentry;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                            var triggerMode = '';\\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                            triggerMode = status.substring(2, 3);\\r\\n                            if (triggerMode == '1') {\\r\\n                                alertSetting += 'Double Press, '\\r\\n                            } else {\\r\\n                                alertSetting += 'Long Press, '\\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 = (`Sentry;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.ReadInterfaceOptions.SpeedActivationDialButton, triggerMode);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n                            configsToAck.push(configIds.ReadInterfaceOptions.SpeedActivationDialButton);\\r\\n                            break;\\r\\n                        case '20': // SOS Button Settings\\r\\n                            // [Length]:03 [Key]:20 [Value]:7B 9E {\\\"sosButton\\\":{\\\"mode\\\":0,\\\"feedBack\\\":3,\\\"task\\\":15,\\\"time\\\":30,\\\"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                            var triggerMode = '';\\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                            triggerMode = status.substring(2, 3);\\r\\n                            if (triggerMode == '1') {\\r\\n                                alertSetting += 'Double Press, '\\r\\n                            } else {\\r\\n                                alertSetting += 'Long Press, '\\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 = (`Sentry;ACK-SPEED;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"sos\\\", alertSetting);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadInterfaceOptions.SOSActivationButton, triggerMode);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            //configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n                            configsToAck.push(configIds.ReadInterfaceOptions.SOSActivationButton);\\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 = (`Sentry-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 = (`Sentry-${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 = (`Sentry-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 = (`Sentry-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 = (`Sentry-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(...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 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":1753207338},{"Type":1,"NewValue":"{\"Id\":362,\"Name\":\"Access PS Sentry\",\"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    // Sentry protocol - please see variables and typical values in order below\\r\\n    // Sentry-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    // Sentry-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 N.\\r\\n    // Created: 01/01/2025\\r\\n    // Last modified: 03/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', 'Sentry');\\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 = (`Sentry-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        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        /*        // Check if total lenght of the complete message is higher than total lenght of the first message\\r\\n        // to know if the message includes more than one\\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 longitud = message.length - 16;\\r\\n        // Loop to decode multi msg, includes \\\"AB\\\" more than one time\\r\\n        //const matches = message.match(/AB/g);\\r\\n        //if (matches && matches.length > 1) {\\r\\n        if (total_length != longitud) { //if true then the msg contains more than one msg (possible bug of the device)\\r\\n            const multiack = message.split('AB');\\r\\n            for (let i = 1; i < multiack.length; i++) {\\r\\n                message = 'AB' + multiack[i];\\r\\n                debug(message);\\r\\n                decoder(message);\\r\\n            }\\r\\n        } else decoder(message); // it contains only one msg\\r\\nif (message.includes('AB00030008C7')) {// IF multiACK\\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); */\\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 'BATCN': // Battery Charging - On\\r\\n                AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                configsToAck.push(configIds.ReadState.Charging);\\r\\n                //configs.AlertSettings.Welfare.Mode\\r\\n                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'false');\\r\\n                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'true');\\r\\n                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'false');\\r\\n                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                }\\r\\n                break;\\r\\n            case 'BATCF': // Battery Charging - Off\\r\\n                AddValue(configsToUpdate, configIds.ReadState.Charging, 'false');\\r\\n                configsToAck.push(configIds.ReadState.Charging);\\r\\n                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'true');\\r\\n                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'false');\\r\\n                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'true');\\r\\n                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                }\\r\\n                break;\\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 Sentry-')) {\\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 = (`Sentry-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 = (`Sentry;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 = (`Sentry;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 = (`Sentry-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    // 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        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\\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                                // no 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  ¿qué es fall OFF?\\r\\n                            if ((alarmCodeExtInt & 1) == 1) {\\r\\n                                var alarm = 'ALF-C'; // Fall-DownAlertending\\r\\n                            }\\r\\n                            // Welfare Check-out\\r\\n                            else if ((alarmCodeExtInt & 2) == 2) {\\r\\n                                //var alarm = 'WSTP';\\r\\n                                if (configs.Welfare !== undefined) {\\r\\n                                    if (configs.Welfare.Mode == '1') {\\r\\n                                        //info = 'Recurrent';\\r\\n                                        var alarm = 'WSTP';\\r\\n                                    } else {\\r\\n                                        //info = 'Amber';\\r\\n                                        var alarm = 'ALA-C';\\r\\n                                    }\\r\\n                                }\\r\\n                            }\\r\\n                            //Geo 5 in\\r\\n                            //else if ((alarmCodeInt & 16) == 16) {\\r\\n                            //    var alarm = 'BATL';\\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 Alert\\r\\n                            else if ((alarmCodeInt & 8) == 8) {\\r\\n                                var alarm = 'TLT';\\r\\n                            }\\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 Alert\\r\\n                            else if ((alarmCodeInt & 256) == 256) {\\r\\n                                var alarm = 'PWRF';\\r\\n                            }\\r\\n                            //Power On Alert\\r\\n                            else if ((alarmCodeInt & 512) == 512) {\\r\\n                                var alarm = 'PWRN';\\r\\n                            }\\r\\n                            //Motion Alert\\r\\n                            else if ((alarmCodeInt & 1024) == 1024) {\\r\\n                                var alarm = 'ALMOV';\\r\\n                            }\\r\\n                            //No Motion Alert\\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                            }\\r\\n                            // Side call button 1\\r\\n                            else if ((alarmCodeInt & 8192) == 8192) {\\r\\n                                var alarm = 'Side1';\\r\\n                            }\\r\\n                            // Side call button 2\\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                                /*AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                                configsToAck.push(configIds.ReadState.Charging);\\r\\n                                //configs.AlertSettings.Welfare.Mode\\r\\n                                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'false');\\r\\n                                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'true');\\r\\n                                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'false');\\r\\n                                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                                }*/\\r\\n                            }\\r\\n                            //Battery no charging\\r\\n                            else if ((alarmCodeInt & 65536) == 65536) {\\r\\n                                var alarm = 'BATCF';\\r\\n                                /* AddValue(configsToUpdate, configIds.ReadState.Charging, 'false');\\r\\n                                 configsToAck.push(configIds.ReadState.Charging);\\r\\n                                 if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                                     AddValue(configsToUpdate, configIds.ReadState.Welfare, 'true');\\r\\n                                     //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'false');\\r\\n                                     AddConfig(configsToSend, configIds.ReadState.Welfare, 'true');\\r\\n                                     configsToAck.push(configIds.ReadState.Welfare);\\r\\n                                 }*/\\r\\n                            }\\r\\n                            //Alert End\\r\\n                            else if ((alarmCodeInt & 131072) == 131072) {\\r\\n                                var alarm = 'ALA-F';\\r\\n                                info = 'Alarm Finished';\\r\\n                                //if (configs.Welfare !== undefined) {\\r\\n                                //    if (configs.Welfare.Mode == '1') {\\r\\n                                //        info = 'Recurrent';\\r\\n                                //    } else info = 'Amber';\\r\\n                                //}\\r\\n                            }\\r\\n                            //Amber Alert ON    Don`t know the dfference between ALA and ALA-O\\r\\n                            else if ((alarmCodeInt & 262144) == 262144) {\\r\\n                                var alarm = 'ALA';\\r\\n                            }\\r\\n                            // welfare check in  and amber alert ON\\r\\n                            else if ((alarmCodeInt & 524288) == 524288) {\\r\\n                                //var alarm = 'WTS';\\r\\n                                if (configs.Welfare !== undefined) {\\r\\n                                    if (configs.Welfare.Mode == '1') {\\r\\n                                        //info = 'Recurrent';\\r\\n                                        var alarm = 'WTS';\\r\\n                                    } else {\\r\\n                                        //info = 'Amber';\\r\\n                                        var alarm = 'ALA-O';\\r\\n                                    }\\r\\n                                }\\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\\r\\n                            else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n                                //var alarm = 'ALA-W';\\r\\n                                if (configs.Welfare !== undefined) {\\r\\n                                    if (configs.Welfare.Mode == '1') {\\r\\n                                        var alarm = 'ALA-W';\\r\\n                                        //info = 'Recurrent';\\r\\n                                    } else {\\r\\n                                        //info = 'Amber';\\r\\n                                        var alarm = 'ALA';\\r\\n                                    }\\r\\n                                }\\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                            //update customID to check if belongs to this type of device\\r\\n                            customID = value;\\r\\n                            if (value != '64') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\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                                    //no 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 != '64') {\\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 = (`Sentry-${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 = (`Sentry-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                            if ((statusInt & 16) == 16) {\\r\\n                                statusDevice += 'Charging,';\\r\\n                                // AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                                // configsToAck.push(configIds.ReadState.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 location: ' + lbs_data;\\r\\n                            break;\\r\\n                        case '30':\\r\\n                            //G-sensor. \\r\\n                            if (customID != '64') {\\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 = (`Sentry-${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 != '64') {\\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 = (`Sentry-${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 = (`Sentry-${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 = (`Sentry-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 = (`Sentry;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 = (`Sentry;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                            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': // Incoming call Ringtone Volume\\r\\n                            var volume = hexToDecimal(value);\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Sentry;ACK-VOL;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"Ringtone\\\", volume);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.IncomingCallRingtoneVolume, volume);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.IncomingCallRingtoneVolume);\\r\\n                            break;\\r\\n                        case '12': // Speaker Volume\\r\\n                            var volume = hexToDecimal(value);\\r\\n                            AddValue(codeValues, \\\"Speaker\\\", volume);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.InCallSpeakerVolume, volume);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.InCallSpeakerVolume);\\r\\n                            break;\\r\\n                        case '1C': // Notifications and Alerts Volume\\r\\n                            var volume = hexToDecimal(value);\\r\\n                            AddValue(codeValues, \\\"Notifications\\\", volume);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.NotificationsandAlerts, volume);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.NotificationsandAlerts);\\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 = (`Sentry;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 = (`Sentry;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                                var allow = 'true';\\r\\n                            } else var allow = 'false';\\r\\n                            // To find LT setup\\r\\n                            if (statusPhone.substring(5, 6) == '1') { // 1 Enable\\r\\n                                var silentCall = 'true';\\r\\n                            } else var silentCall = '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                            AddValue(configsToUpdate, configIds.ReadProfiles.SilentCallMode, silentCall);\\r\\n                            //configsToAck.push(configIds.ReadSystemSettings.Statusphone);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AllowList);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AutoAnswer);\\r\\n                            configsToAck.push(configIds.ReadProfiles.SilentCallMode);\\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                            var report;\\r\\n                            switch (contactNumber) {\\r\\n                                // Emergency Number\\r\\n                                // [Value]:80 2B 33 34 36 33 35 36 30 37 39 33 30\\r\\n                                //{\\\"number\\\":{\\\"call\\\":0,\\\"noCard\\\":0,\\\"number\\\":\\\"+34635607930\\\",\\\"enable\\\":1,\\\"sms\\\":0,\\\"index\\\":0}}\\r\\n                                case '0':\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.length < 6) { //if no telephone defined\\r\\n                                        tel = '';\\r\\n                                    }\\r\\n                                    report = hex2bin(value.substring(0, 2)); // To find report mode Call &data or DAta only\\r\\n                                    AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                                    AddValue(codeValues, \\\"ReportMode\\\", report.substring(2, 3));\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.ReportMode, report.substring(2, 3));\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.ReportMode);\\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                                    if (tel.length < 6) { //if no telephone defined\\r\\n                                        tel = '';\\r\\n                                    }\\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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 '55': // Tilt Angle Alert\\r\\n                            //[Value]:0A 00 1E 00\\r\\n                            //{\\\"tiltAlert\\\":{\\\"angle\\\":30,\\\"time\\\":10,\\\"status\\\":0,\\\"dial\\\":0}}\\r\\n                            var angle = hexToDecimal(value.substring(4, 6));\\r\\n                            var timeout = hexToDecimal(value.substring(0, 2));\\r\\n                            var status = hexToDecimal(value.substring(6, 8));\\r\\n                            if (status == 0) angle = 0;\\r\\n                            //var alertSetting = angle;\\r\\n                            //imei = serverParams.Imei;\\r\\n                            //messageForReceiver = (`Sentry;ACK-TILTANG;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"tiltangle\\\", angle);\\r\\n                            AddValue(codeValues, \\\"tiltimeout\\\", timeout);\\r\\n                            AddValue(codeValues, \\\"tiltstatus\\\", status);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltTimeout, timeout);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltAngle, angle);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltTimeout);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltAngle);\\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 = (`Sentry;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.ManDownSettings, sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.EnableDisableManDownSettings, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.Sensitivity, sesibityOptionValue);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.EnableDisableManDownSettings);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.Sensitivity);\\r\\n                            break;\\r\\n                        case '57': // Welfare\\r\\n                            // [Value]:10 0E 00 80 58 02 00 80\\r\\n                            //{\\\"welfareAlert\\\":{\\\"time\\\":600,\\\"value\\\":3600,\\\"status\\\":1,\\\"dial\\\":1}}\\r\\n                            var welfareStatus = hex2bin(value.substring(6, 8)); // check status\\r\\n                            var welfareValue = hexToDecimal(changeEndianness(value.substring(0, 6)));\\r\\n                            var welfareTime = hexToDecimal(changeEndianness(value.substring(8, 14)));\\r\\n                            var enalbleDisable = '';\\r\\n                            if ((configs.ReadState.Charging == 'true') && (configs.Welfare.Mode == '1') && (configs.Welfare.EnableDisableWelfare == 'true')) { // Force Read to enable welfare when device is charging in recurrent mode\\r\\n                                var sensibility = 'Enable, '\\r\\n                                enalbleDisable = '1'\\r\\n                            } else {\\r\\n                                if (welfareStatus.substring(0, 1) == '1') {\\r\\n                                    var sensibility = 'Enable, '\\r\\n                                    enalbleDisable = '1'\\r\\n                                } else {\\r\\n                                    var sensibility = 'Disable, '\\r\\n                                    //enalbleDisable = '0'\\r\\n                                }\\r\\n                            };\\r\\n                            //var imei = serverParams.Imei;\\r\\n                            //messageForReceiver = (`Sentry;ACK-WELFALERT;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            sensibility += welfareValue / 60;\\r\\n                            sensibility += ', ' + welfareTime / 60;\\r\\n                            AddValue(codeValues, \\\"welfare\\\", sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.EnableDisableReadWelfare, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Prealarm, welfareTime / 60);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Timeout, welfareValue / 60);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.EnableDisableReadWelfare);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Prealarm);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Timeout);\\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 = (`Sentry;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 '75': // Extra Enable control   Welfare Mode\\r\\n                            //[Value]:80 00 00 10  last two digit for new/old welfare\\r\\n                            //{\\\"extraControl\\\":{\\\"bit29\\\":0,\\\"bit27\\\":0,\\\"bit28\\\":1,\\\"bit25\\\":0,\\\"bit26\\\":0,\\\"flagValue\\\":268435584,\\\"bit23\\\":0,\\\"bit24\\\":0,\\\"bit21\\\":0,\\\"bit22\\\":0,\\\"bit20\\\":0,\\\"bit9\\\":0,\\\"bit18\\\":0,\\\"bit19\\\":0,\\\"bit7\\\":1,\\\"bit16\\\":0,\\\"bit8\\\":0,\\\"bit17\\\":0,\\\"bit5\\\":0,\\\"bit14\\\":0,\\\"bit6\\\":0,\\\"bit15\\\":0,\\\"bit3\\\":0,\\\"bit4\\\":0,\\\"bit1\\\":0,\\\"bit2\\\":0,\\\"bit0\\\":0,\\\"bit12\\\":0,\\\"bit13\\\":0,\\\"bit10\\\":0,\\\"bit11\\\":0,\\\"bit30\\\":0,\\\"bit31\\\":0}}\\r\\n                            var extraStatus = hex2bin(value.substring(6, 7)).substring(7, 8);\\r\\n                            //if (extraStatus.substring(7, 8) == '1') {\\r\\n                            //    extra += ' Enable, '\\r\\n                            //} else {\\r\\n                            //    extra += ' 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, \\\"welfare Mode\\\", extraStatus);\\r\\n                            // messageForReceiver = (`Sentry;ACK-EXTRA;${imei};`);\\r\\n                            // sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Mode, extraStatus);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Mode);\\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 = (`Sentry;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                            var triggerMode = '';\\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                            triggerMode = status.substring(2, 3);\\r\\n                            if (triggerMode == '1') {\\r\\n                                alertSetting += 'Double Press, '\\r\\n                            } else {\\r\\n                                alertSetting += 'Long Press, '\\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 = (`Sentry;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.ReadInterfaceOptions.SpeedActivationDialButton, triggerMode);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n                            configsToAck.push(configIds.ReadInterfaceOptions.SpeedActivationDialButton);\\r\\n                            break;\\r\\n                        case '20': // SOS Button Settings\\r\\n                            // [Length]:03 [Key]:20 [Value]:7B 9E {\\\"sosButton\\\":{\\\"mode\\\":0,\\\"feedBack\\\":3,\\\"task\\\":15,\\\"time\\\":30,\\\"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                            var triggerMode = '';\\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                            triggerMode = status.substring(2, 3);\\r\\n                            if (triggerMode == '1') {\\r\\n                                alertSetting += 'Double Press, '\\r\\n                            } else {\\r\\n                                alertSetting += 'Long Press, '\\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 = (`Sentry;ACK-SPEED;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"sos\\\", alertSetting);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadInterfaceOptions.SOSActivationButton, triggerMode);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            //configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n                            configsToAck.push(configIds.ReadInterfaceOptions.SOSActivationButton);\\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 = (`Sentry-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 = (`Sentry-${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 = (`Sentry-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 = (`Sentry-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 = (`Sentry-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(...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    // --- utils ---\\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":1756917365},{"Type":1,"NewValue":"{\"Id\":362,\"Name\":\"Access PS Sentry\",\"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    // Sentry protocol - please see variables and typical values in order below\\r\\n    // Sentry-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    // Sentry-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 N.\\r\\n    // Created: 01/01/2025\\r\\n    // Last modified: 09/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', 'Sentry');\\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 = (`Sentry-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        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        /*        // Check if total lenght of the complete message is higher than total lenght of the first message\\r\\n        // to know if the message includes more than one\\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 longitud = message.length - 16;\\r\\n        // Loop to decode multi msg, includes \\\"AB\\\" more than one time\\r\\n        //const matches = message.match(/AB/g);\\r\\n        //if (matches && matches.length > 1) {\\r\\n        if (total_length != longitud) { //if true then the msg contains more than one msg (possible bug of the device)\\r\\n            const multiack = message.split('AB');\\r\\n            for (let i = 1; i < multiack.length; i++) {\\r\\n                message = 'AB' + multiack[i];\\r\\n                debug(message);\\r\\n                decoder(message);\\r\\n            }\\r\\n        } else decoder(message); // it contains only one msg\\r\\nif (message.includes('AB00030008C7')) {// IF multiACK\\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); */\\r\\n    } else if (oystaTemplate == 'True') { // Oysta Template \\r\\n        // first decoding data of Oysta templates\\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 'BATCN': // Battery Charging - On\\r\\n                AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                configsToAck.push(configIds.ReadState.Charging);\\r\\n                //configs.AlertSettings.Welfare.Mode\\r\\n                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'false');\\r\\n                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'true');\\r\\n                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'false');\\r\\n                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                }\\r\\n                break;\\r\\n            case 'BATCF': // Battery Charging - Off\\r\\n                AddValue(configsToUpdate, configIds.ReadState.Charging, 'false');\\r\\n                configsToAck.push(configIds.ReadState.Charging);\\r\\n                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'true');\\r\\n                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'false');\\r\\n                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'true');\\r\\n                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                }\\r\\n                break;\\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 Sentry-')) {\\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 = (`Sentry-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 = (`Sentry;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 = (`Sentry;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 = (`Sentry-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    // end of main operation\\r\\n    // define functions used in operation\\r\\n    // decoder global template function\\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                                // no 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  ¿qué es fall OFF?\\r\\n                            if ((alarmCodeExtInt & 1) == 1) {\\r\\n                                var alarm = 'ALF-C'; // Fall-DownAlertending\\r\\n                            }\\r\\n                            // Welfare Check-out\\r\\n                            else if ((alarmCodeExtInt & 2) == 2) {\\r\\n                                //var alarm = 'WSTP';\\r\\n                                if (configs.Welfare !== undefined) {\\r\\n                                    if (configs.Welfare.Mode == '1') {\\r\\n                                        //info = 'Recurrent';\\r\\n                                        var alarm = 'WSTP';\\r\\n                                    } else {\\r\\n                                        //info = 'Amber';\\r\\n                                        var alarm = 'ALA-C';\\r\\n                                    }\\r\\n                                }\\r\\n                            }\\r\\n                            //Geo 5 in\\r\\n                            //else if ((alarmCodeInt & 16) == 16) {\\r\\n                            //    var alarm = 'BATL';\\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 Alert\\r\\n                            else if ((alarmCodeInt & 8) == 8) {\\r\\n                                var alarm = 'TLT';\\r\\n                            }\\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 Alert\\r\\n                            else if ((alarmCodeInt & 256) == 256) {\\r\\n                                var alarm = 'PWRF';\\r\\n                            }\\r\\n                            //Power On Alert\\r\\n                            else if ((alarmCodeInt & 512) == 512) {\\r\\n                                var alarm = 'PWRN';\\r\\n                            }\\r\\n                            //Motion Alert\\r\\n                            else if ((alarmCodeInt & 1024) == 1024) {\\r\\n                                var alarm = 'ALMOV';\\r\\n                            }\\r\\n                            //No Motion Alert\\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                            }\\r\\n                            // Side call button 1\\r\\n                            else if ((alarmCodeInt & 8192) == 8192) {\\r\\n                                var alarm = 'Side1';\\r\\n                            }\\r\\n                            // Side call button 2\\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                                /*AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                                configsToAck.push(configIds.ReadState.Charging);\\r\\n                                //configs.AlertSettings.Welfare.Mode\\r\\n                                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'false');\\r\\n                                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'true');\\r\\n                                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'false');\\r\\n                                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                                }*/\\r\\n                            }\\r\\n                            //Battery no charging\\r\\n                            else if ((alarmCodeInt & 65536) == 65536) {\\r\\n                                var alarm = 'BATCF';\\r\\n                                /* AddValue(configsToUpdate, configIds.ReadState.Charging, 'false');\\r\\n                                 configsToAck.push(configIds.ReadState.Charging);\\r\\n                                 if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                                     AddValue(configsToUpdate, configIds.ReadState.Welfare, 'true');\\r\\n                                     //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'false');\\r\\n                                     AddConfig(configsToSend, configIds.ReadState.Welfare, 'true');\\r\\n                                     configsToAck.push(configIds.ReadState.Welfare);\\r\\n                                 }*/\\r\\n                            }\\r\\n                            //Alert End\\r\\n                            else if ((alarmCodeInt & 131072) == 131072) {\\r\\n                                var alarm = 'ALA-F';\\r\\n                                info = 'Alarm Finished';\\r\\n                                //if (configs.Welfare !== undefined) {\\r\\n                                //    if (configs.Welfare.Mode == '1') {\\r\\n                                //        info = 'Recurrent';\\r\\n                                //    } else info = 'Amber';\\r\\n                                //}\\r\\n                            }\\r\\n                            //Amber Alert ON    Don`t know the dfference between ALA and ALA-O\\r\\n                            else if ((alarmCodeInt & 262144) == 262144) {\\r\\n                                var alarm = 'ALA';\\r\\n                            }\\r\\n                            // welfare check in  and amber alert ON\\r\\n                            else if ((alarmCodeInt & 524288) == 524288) {\\r\\n                                //var alarm = 'WTS';\\r\\n                                if (configs.Welfare !== undefined) {\\r\\n                                    if (configs.Welfare.Mode == '1') {\\r\\n                                        //info = 'Recurrent';\\r\\n                                        var alarm = 'WTS';\\r\\n                                    } else {\\r\\n                                        //info = 'Amber';\\r\\n                                        var alarm = 'ALA-O';\\r\\n                                    }\\r\\n                                }\\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\\r\\n                            else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n                                //var alarm = 'ALA-W';\\r\\n                                if (configs.Welfare !== undefined) {\\r\\n                                    if (configs.Welfare.Mode == '1') {\\r\\n                                        var alarm = 'ALA-W';\\r\\n                                        //info = 'Recurrent';\\r\\n                                    } else {\\r\\n                                        //info = 'Amber';\\r\\n                                        var alarm = 'ALA';\\r\\n                                    }\\r\\n                                }\\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                            //update customID to check if belongs to this type of device\\r\\n                            customID = value;\\r\\n                            if (value != '64') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\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                                    //no 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 != '64') {\\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 = (`Sentry-${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 = (`Sentry-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                            if ((statusInt & 16) == 16) {\\r\\n                                statusDevice += 'Charging,';\\r\\n                                // AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                                // configsToAck.push(configIds.ReadState.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 location: ' + lbs_data;\\r\\n                            break;\\r\\n                        case '30':\\r\\n                            //G-sensor. \\r\\n                            if (customID != '64') {\\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 = (`Sentry-${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 != '64') {\\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 = (`Sentry-${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 = (`Sentry-${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 = (`Sentry-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, quizas meter dentro del if (alarmcode)\\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 = (`Sentry;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 = (`Sentry;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                            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': // Incoming call Ringtone Volume\\r\\n                            var volume = hexToDecimal(value);\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Sentry;ACK-VOL;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"Ringtone\\\", volume);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.IncomingCallRingtoneVolume, volume);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.IncomingCallRingtoneVolume);\\r\\n                            break;\\r\\n                        case '12': // Speaker Volume\\r\\n                            var volume = hexToDecimal(value);\\r\\n                            AddValue(codeValues, \\\"Speaker\\\", volume);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.InCallSpeakerVolume, volume);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.InCallSpeakerVolume);\\r\\n                            break;\\r\\n                        case '1C': // Notifications and Alerts Volume\\r\\n                            var volume = hexToDecimal(value);\\r\\n                            AddValue(codeValues, \\\"Notifications\\\", volume);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.NotificationsandAlerts, volume);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.NotificationsandAlerts);\\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 = (`Sentry;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 = (`Sentry;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                                var allow = 'true';\\r\\n                            } else var allow = 'false';\\r\\n                            // To find LT setup\\r\\n                            if (statusPhone.substring(5, 6) == '1') { // 1 Enable\\r\\n                                var silentCall = 'true';\\r\\n                            } else var silentCall = '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                            AddValue(configsToUpdate, configIds.ReadProfiles.SilentCallMode, silentCall);\\r\\n                            //configsToAck.push(configIds.ReadSystemSettings.Statusphone);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AllowList);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AutoAnswer);\\r\\n                            configsToAck.push(configIds.ReadProfiles.SilentCallMode);\\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                            var report;\\r\\n                            switch (contactNumber) {\\r\\n                                // Emergency Number\\r\\n                                // [Value]:80 2B 33 34 36 33 35 36 30 37 39 33 30\\r\\n                                //{\\\"number\\\":{\\\"call\\\":0,\\\"noCard\\\":0,\\\"number\\\":\\\"+34635607930\\\",\\\"enable\\\":1,\\\"sms\\\":0,\\\"index\\\":0}}\\r\\n                                case '0':\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.length < 6) { //if no telephone defined\\r\\n                                        tel = '';\\r\\n                                    }\\r\\n                                    report = hex2bin(value.substring(0, 2)); // To find report mode Call &data or DAta only\\r\\n                                    AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                                    AddValue(codeValues, \\\"ReportMode\\\", report.substring(2, 3));\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.ReportMode, report.substring(2, 3));\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.ReportMode);\\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                                    if (tel.length < 6) { //if no telephone defined\\r\\n                                        tel = '';\\r\\n                                    }\\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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 '55': // Tilt Angle Alert\\r\\n                            //[Value]:0A 00 1E 00\\r\\n                            //{\\\"tiltAlert\\\":{\\\"angle\\\":30,\\\"time\\\":10,\\\"status\\\":0,\\\"dial\\\":0}}\\r\\n                            var angle = hexToDecimal(value.substring(4, 6));\\r\\n                            var timeout = hexToDecimal(value.substring(0, 2));\\r\\n                            var status = hexToDecimal(value.substring(6, 8));\\r\\n                            if (status == 0) angle = 0;\\r\\n                            //var alertSetting = angle;\\r\\n                            //imei = serverParams.Imei;\\r\\n                            //messageForReceiver = (`Sentry;ACK-TILTANG;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"tiltangle\\\", angle);\\r\\n                            AddValue(codeValues, \\\"tiltimeout\\\", timeout);\\r\\n                            AddValue(codeValues, \\\"tiltstatus\\\", status);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltTimeout, timeout);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltAngle, angle);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltTimeout);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltAngle);\\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 = (`Sentry;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.ManDownSettings, sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.EnableDisableManDownSettings, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.Sensitivity, sesibityOptionValue);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.EnableDisableManDownSettings);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.Sensitivity);\\r\\n                            break;\\r\\n                        case '57': // Welfare\\r\\n                            // [Value]:10 0E 00 80 58 02 00 80\\r\\n                            //{\\\"welfareAlert\\\":{\\\"time\\\":600,\\\"value\\\":3600,\\\"status\\\":1,\\\"dial\\\":1}}\\r\\n                            var welfareStatus = hex2bin(value.substring(6, 8)); // check status\\r\\n                            var welfareValue = hexToDecimal(changeEndianness(value.substring(0, 6)));\\r\\n                            var welfareTime = hexToDecimal(changeEndianness(value.substring(8, 14)));\\r\\n                            var enalbleDisable = '';\\r\\n                            if ((configs.ReadState.Charging == 'true') && (configs.Welfare.Mode == '1') && (configs.Welfare.EnableDisableWelfare == 'true')) { // Force Read to enable welfare when device is charging in recurrent mode\\r\\n                                var sensibility = 'Enable, '\\r\\n                                enalbleDisable = '1'\\r\\n                            } else {\\r\\n                                if (welfareStatus.substring(0, 1) == '1') {\\r\\n                                    var sensibility = 'Enable, '\\r\\n                                    enalbleDisable = '1'\\r\\n                                } else {\\r\\n                                    var sensibility = 'Disable, '\\r\\n                                    //enalbleDisable = '0'\\r\\n                                }\\r\\n                            };\\r\\n                            //var imei = serverParams.Imei;\\r\\n                            //messageForReceiver = (`Sentry;ACK-WELFALERT;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            sensibility += welfareValue / 60;\\r\\n                            sensibility += ', ' + welfareTime / 60;\\r\\n                            AddValue(codeValues, \\\"welfare\\\", sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.EnableDisableReadWelfare, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Prealarm, welfareTime / 60);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Timeout, welfareValue / 60);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.EnableDisableReadWelfare);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Prealarm);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Timeout);\\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 = (`Sentry;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 '75': // Extra Enable control   Welfare Mode\\r\\n                            //[Value]:80 00 00 10  last two digit for new/old welfare\\r\\n                            //{\\\"extraControl\\\":{\\\"bit29\\\":0,\\\"bit27\\\":0,\\\"bit28\\\":1,\\\"bit25\\\":0,\\\"bit26\\\":0,\\\"flagValue\\\":268435584,\\\"bit23\\\":0,\\\"bit24\\\":0,\\\"bit21\\\":0,\\\"bit22\\\":0,\\\"bit20\\\":0,\\\"bit9\\\":0,\\\"bit18\\\":0,\\\"bit19\\\":0,\\\"bit7\\\":1,\\\"bit16\\\":0,\\\"bit8\\\":0,\\\"bit17\\\":0,\\\"bit5\\\":0,\\\"bit14\\\":0,\\\"bit6\\\":0,\\\"bit15\\\":0,\\\"bit3\\\":0,\\\"bit4\\\":0,\\\"bit1\\\":0,\\\"bit2\\\":0,\\\"bit0\\\":0,\\\"bit12\\\":0,\\\"bit13\\\":0,\\\"bit10\\\":0,\\\"bit11\\\":0,\\\"bit30\\\":0,\\\"bit31\\\":0}}\\r\\n                            var extraStatus = hex2bin(value.substring(6, 7)).substring(7, 8);\\r\\n                            //if (extraStatus.substring(7, 8) == '1') {\\r\\n                            //    extra += ' Enable, '\\r\\n                            //} else {\\r\\n                            //    extra += ' 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, \\\"welfare Mode\\\", extraStatus);\\r\\n                            // messageForReceiver = (`Sentry;ACK-EXTRA;${imei};`);\\r\\n                            // sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Mode, extraStatus);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Mode);\\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 = (`Sentry;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                            var triggerMode = '';\\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                            triggerMode = status.substring(2, 3);\\r\\n                            if (triggerMode == '1') {\\r\\n                                alertSetting += 'Double Press, '\\r\\n                            } else {\\r\\n                                alertSetting += 'Long Press, '\\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 = (`Sentry;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.ReadInterfaceOptions.SpeedActivationDialButton, triggerMode);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n                            configsToAck.push(configIds.ReadInterfaceOptions.SpeedActivationDialButton);\\r\\n                            break;\\r\\n                        case '20': // SOS Button Settings\\r\\n                            // [Length]:03 [Key]:20 [Value]:7B 9E {\\\"sosButton\\\":{\\\"mode\\\":0,\\\"feedBack\\\":3,\\\"task\\\":15,\\\"time\\\":30,\\\"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                            var triggerMode = '';\\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                            triggerMode = status.substring(2, 3);\\r\\n                            if (triggerMode == '1') {\\r\\n                                alertSetting += 'Double Press, '\\r\\n                            } else {\\r\\n                                alertSetting += 'Long Press, '\\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 = (`Sentry;ACK-SPEED;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"sos\\\", alertSetting);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadInterfaceOptions.SOSActivationButton, triggerMode);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            //configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n                            configsToAck.push(configIds.ReadInterfaceOptions.SOSActivationButton);\\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 = (`Sentry-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 = (`Sentry-${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 = (`Sentry-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 = (`Sentry-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 = (`Sentry-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":1757443369},{"Type":1,"NewValue":"{\"Id\":362,\"Name\":\"Access PS Sentry\",\"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    // Sentry protocol - please see variables and typical values in order below\\r\\n    // Sentry-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    // Sentry-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 N.\\r\\n    // Created: 01/01/2025\\r\\n    // Last modified: 09/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', 'Sentry');\\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 = (`Sentry-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        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        /*        // Check if total lenght of the complete message is higher than total lenght of the first message\\r\\n        // to know if the message includes more than one\\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 longitud = message.length - 16;\\r\\n        // Loop to decode multi msg, includes \\\"AB\\\" more than one time\\r\\n        //const matches = message.match(/AB/g);\\r\\n        //if (matches && matches.length > 1) {\\r\\n        if (total_length != longitud) { //if true then the msg contains more than one msg (possible bug of the device)\\r\\n            const multiack = message.split('AB');\\r\\n            for (let i = 1; i < multiack.length; i++) {\\r\\n                message = 'AB' + multiack[i];\\r\\n                debug(message);\\r\\n                decoder(message);\\r\\n            }\\r\\n        } else decoder(message); // it contains only one msg\\r\\nif (message.includes('AB00030008C7')) {// IF multiACK\\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); */\\r\\n    } else if (oystaTemplate == 'True') { // Oysta Template \\r\\n        // first decoding data of Oysta templates\\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 'BATCN': // Battery Charging - On\\r\\n                AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                configsToAck.push(configIds.ReadState.Charging);\\r\\n                //configs.AlertSettings.Welfare.Mode\\r\\n                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'false');\\r\\n                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'true');\\r\\n                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'false');\\r\\n                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                }\\r\\n                break;\\r\\n            case 'BATCF': // Battery Charging - Off\\r\\n                AddValue(configsToUpdate, configIds.ReadState.Charging, 'false');\\r\\n                configsToAck.push(configIds.ReadState.Charging);\\r\\n                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'true');\\r\\n                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'false');\\r\\n                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'true');\\r\\n                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                }\\r\\n                break;\\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 Sentry-')) {\\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 = (`Sentry-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 = (`Sentry;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 = (`Sentry;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 = (`Sentry-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    // end of main operation\\r\\n    // define functions used in operation\\r\\n    // decoder global template function\\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                                // no 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  ¿qué es fall OFF?\\r\\n                            if ((alarmCodeExtInt & 1) == 1) {\\r\\n                                var alarm = 'ALF-C'; // Fall-DownAlertending\\r\\n                            }\\r\\n                            // Welfare Check-out\\r\\n                            else if ((alarmCodeExtInt & 2) == 2) {\\r\\n                                //var alarm = 'WSTP';\\r\\n                                if (configs.Welfare !== undefined) {\\r\\n                                    if (configs.Welfare.Mode == '1') {\\r\\n                                        //info = 'Recurrent';\\r\\n                                        var alarm = 'WSTP';\\r\\n                                    } else {\\r\\n                                        //info = 'Amber';\\r\\n                                        var alarm = 'ALA-C';\\r\\n                                    }\\r\\n                                }\\r\\n                            }\\r\\n                            //Geo 5 in\\r\\n                            //else if ((alarmCodeInt & 16) == 16) {\\r\\n                            //    var alarm = 'BATL';\\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 Alert\\r\\n                            else if ((alarmCodeInt & 8) == 8) {\\r\\n                                var alarm = 'TLT';\\r\\n                            }\\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 Alert\\r\\n                            else if ((alarmCodeInt & 256) == 256) {\\r\\n                                var alarm = 'PWRF';\\r\\n                            }\\r\\n                            //Power On Alert\\r\\n                            else if ((alarmCodeInt & 512) == 512) {\\r\\n                                var alarm = 'PWRN';\\r\\n                            }\\r\\n                            //Motion Alert\\r\\n                            else if ((alarmCodeInt & 1024) == 1024) {\\r\\n                                var alarm = 'ALMOV';\\r\\n                            }\\r\\n                            //No Motion Alert\\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                            }\\r\\n                            // Side call button 1\\r\\n                            else if ((alarmCodeInt & 8192) == 8192) {\\r\\n                                var alarm = 'Side1';\\r\\n                            }\\r\\n                            // Side call button 2\\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                                /*AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                                configsToAck.push(configIds.ReadState.Charging);\\r\\n                                //configs.AlertSettings.Welfare.Mode\\r\\n                                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'false');\\r\\n                                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'true');\\r\\n                                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'false');\\r\\n                                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                                }*/\\r\\n                            }\\r\\n                            //Battery no charging\\r\\n                            else if ((alarmCodeInt & 65536) == 65536) {\\r\\n                                var alarm = 'BATCF';\\r\\n                                /* AddValue(configsToUpdate, configIds.ReadState.Charging, 'false');\\r\\n                                 configsToAck.push(configIds.ReadState.Charging);\\r\\n                                 if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                                     AddValue(configsToUpdate, configIds.ReadState.Welfare, 'true');\\r\\n                                     //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'false');\\r\\n                                     AddConfig(configsToSend, configIds.ReadState.Welfare, 'true');\\r\\n                                     configsToAck.push(configIds.ReadState.Welfare);\\r\\n                                 }*/\\r\\n                            }\\r\\n                            //Alert End\\r\\n                            else if ((alarmCodeInt & 131072) == 131072) {\\r\\n                                var alarm = 'ALA-F';\\r\\n                                info = 'Alarm Finished';\\r\\n                                //if (configs.Welfare !== undefined) {\\r\\n                                //    if (configs.Welfare.Mode == '1') {\\r\\n                                //        info = 'Recurrent';\\r\\n                                //    } else info = 'Amber';\\r\\n                                //}\\r\\n                            }\\r\\n                            //Amber Alert ON    Don`t know the dfference between ALA and ALA-O\\r\\n                            else if ((alarmCodeInt & 262144) == 262144) {\\r\\n                                var alarm = 'ALA';\\r\\n                            }\\r\\n                            // welfare check in  and amber alert ON\\r\\n                            else if ((alarmCodeInt & 524288) == 524288) {\\r\\n                                //var alarm = 'WTS';\\r\\n                                if (configs.Welfare !== undefined) {\\r\\n                                    if (configs.Welfare.Mode == '1') {\\r\\n                                        //info = 'Recurrent';\\r\\n                                        var alarm = 'WTS';\\r\\n                                    } else {\\r\\n                                        //info = 'Amber';\\r\\n                                        var alarm = 'ALA-O';\\r\\n                                    }\\r\\n                                }\\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\\r\\n                            else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n                                //var alarm = 'ALA-W';\\r\\n                                if (configs.Welfare !== undefined) {\\r\\n                                    if (configs.Welfare.Mode == '1') {\\r\\n                                        var alarm = 'ALA-W';\\r\\n                                        //info = 'Recurrent';\\r\\n                                    } else {\\r\\n                                        //info = 'Amber';\\r\\n                                        var alarm = 'ALA';\\r\\n                                    }\\r\\n                                }\\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                            //update customID to check if belongs to this type of device\\r\\n                            customID = value;\\r\\n                            if (value != '64') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\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                                    //no 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 != '64') {\\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 = (`Sentry-${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 = (`Sentry-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                            if ((statusInt & 16) == 16) {\\r\\n                                statusDevice += 'Charging,';\\r\\n                                // AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                                // configsToAck.push(configIds.ReadState.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 location: ' + lbs_data;\\r\\n                            break;\\r\\n                        case '30':\\r\\n                            //G-sensor. \\r\\n                            if (customID != '64') {\\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 = (`Sentry-${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 != '64') {\\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 = (`Sentry-${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 = (`Sentry-${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 = (`Sentry-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, quizas meter dentro del if (alarmcode)\\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 = (`Sentry;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 = (`Sentry;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                            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': // Incoming call Ringtone Volume\\r\\n                            var volume = hexToDecimal(value);\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Sentry;ACK-VOL;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"Ringtone\\\", volume);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.IncomingCallRingtoneVolume, volume);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.IncomingCallRingtoneVolume);\\r\\n                            break;\\r\\n                        case '12': // Speaker Volume\\r\\n                            var volume = hexToDecimal(value);\\r\\n                            AddValue(codeValues, \\\"Speaker\\\", volume);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.InCallSpeakerVolume, volume);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.InCallSpeakerVolume);\\r\\n                            break;\\r\\n                        case '1C': // Notifications and Alerts Volume\\r\\n                            var volume = hexToDecimal(value);\\r\\n                            AddValue(codeValues, \\\"Notifications\\\", volume);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.NotificationsandAlerts, volume);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.NotificationsandAlerts);\\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 = (`Sentry;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 = (`Sentry;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                                var allow = 'true';\\r\\n                            } else var allow = 'false';\\r\\n                            // To find LT setup\\r\\n                            if (statusPhone.substring(5, 6) == '1') { // 1 Enable\\r\\n                                var silentCall = 'true';\\r\\n                            } else var silentCall = '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                            AddValue(configsToUpdate, configIds.ReadProfiles.SilentCallMode, silentCall);\\r\\n                            //configsToAck.push(configIds.ReadSystemSettings.Statusphone);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AllowList);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AutoAnswer);\\r\\n                            configsToAck.push(configIds.ReadProfiles.SilentCallMode);\\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                            var report;\\r\\n                            switch (contactNumber) {\\r\\n                                // Emergency Number\\r\\n                                // [Value]:80 2B 33 34 36 33 35 36 30 37 39 33 30\\r\\n                                //{\\\"number\\\":{\\\"call\\\":0,\\\"noCard\\\":0,\\\"number\\\":\\\"+34635607930\\\",\\\"enable\\\":1,\\\"sms\\\":0,\\\"index\\\":0}}\\r\\n                                case '0':\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.length < 6) { //if no telephone defined\\r\\n                                        tel = '';\\r\\n                                    }\\r\\n                                    report = hex2bin(value.substring(0, 2)); // To find report mode Call &data or DAta only\\r\\n                                    AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                                    AddValue(codeValues, \\\"ReportMode\\\", report.substring(2, 3));\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.ReportMode, report.substring(2, 3));\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.ReportMode);\\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                                    if (tel.length < 6) { //if no telephone defined\\r\\n                                        tel = '';\\r\\n                                    }\\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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 '55': // Tilt Angle Alert\\r\\n                            //[Value]:0A 00 1E 00\\r\\n                            //{\\\"tiltAlert\\\":{\\\"angle\\\":30,\\\"time\\\":10,\\\"status\\\":0,\\\"dial\\\":0}}\\r\\n                            var angle = hexToDecimal(value.substring(4, 6));\\r\\n                            var timeout = hexToDecimal(value.substring(0, 2));\\r\\n                            var status = hexToDecimal(value.substring(6, 8));\\r\\n                            if (status == 0) angle = 0;\\r\\n                            //var alertSetting = angle;\\r\\n                            //imei = serverParams.Imei;\\r\\n                            //messageForReceiver = (`Sentry;ACK-TILTANG;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"tiltangle\\\", angle);\\r\\n                            AddValue(codeValues, \\\"tiltimeout\\\", timeout);\\r\\n                            AddValue(codeValues, \\\"tiltstatus\\\", status);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltTimeout, timeout);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltAngle, angle);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltTimeout);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltAngle);\\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 = (`Sentry;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.ManDownSettings, sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.EnableDisableManDownSettings, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.Sensitivity, sesibityOptionValue);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.EnableDisableManDownSettings);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.Sensitivity);\\r\\n                            break;\\r\\n                        case '57': // Welfare\\r\\n                            // [Value]:10 0E 00 80 58 02 00 80\\r\\n                            //{\\\"welfareAlert\\\":{\\\"time\\\":600,\\\"value\\\":3600,\\\"status\\\":1,\\\"dial\\\":1}}\\r\\n                            var welfareStatus = hex2bin(value.substring(6, 8)); // check status\\r\\n                            var welfareValue = hexToDecimal(changeEndianness(value.substring(0, 6)));\\r\\n                            var welfareTime = hexToDecimal(changeEndianness(value.substring(8, 14)));\\r\\n                            var enalbleDisable = '';\\r\\n                            if ((configs.ReadState.Charging == 'true') && (configs.Welfare.Mode == '1') && (configs.Welfare.EnableDisableWelfare == 'true')) { // Force Read to enable welfare when device is charging in recurrent mode\\r\\n                                var sensibility = 'Enable, '\\r\\n                                enalbleDisable = '1'\\r\\n                            } else {\\r\\n                                if (welfareStatus.substring(0, 1) == '1') {\\r\\n                                    var sensibility = 'Enable, '\\r\\n                                    enalbleDisable = '1'\\r\\n                                } else {\\r\\n                                    var sensibility = 'Disable, '\\r\\n                                    //enalbleDisable = '0'\\r\\n                                }\\r\\n                            };\\r\\n                            //var imei = serverParams.Imei;\\r\\n                            //messageForReceiver = (`Sentry;ACK-WELFALERT;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            sensibility += welfareValue / 60;\\r\\n                            sensibility += ', ' + welfareTime / 60;\\r\\n                            AddValue(codeValues, \\\"welfare\\\", sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.EnableDisableReadWelfare, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Prealarm, welfareTime / 60);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Timeout, welfareValue / 60);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.EnableDisableReadWelfare);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Prealarm);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Timeout);\\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 = (`Sentry;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 '75': // Extra Enable control   Welfare Mode\\r\\n                            //[Value]:80 00 00 10  last two digit for new/old welfare\\r\\n                            //{\\\"extraControl\\\":{\\\"bit29\\\":0,\\\"bit27\\\":0,\\\"bit28\\\":1,\\\"bit25\\\":0,\\\"bit26\\\":0,\\\"flagValue\\\":268435584,\\\"bit23\\\":0,\\\"bit24\\\":0,\\\"bit21\\\":0,\\\"bit22\\\":0,\\\"bit20\\\":0,\\\"bit9\\\":0,\\\"bit18\\\":0,\\\"bit19\\\":0,\\\"bit7\\\":1,\\\"bit16\\\":0,\\\"bit8\\\":0,\\\"bit17\\\":0,\\\"bit5\\\":0,\\\"bit14\\\":0,\\\"bit6\\\":0,\\\"bit15\\\":0,\\\"bit3\\\":0,\\\"bit4\\\":0,\\\"bit1\\\":0,\\\"bit2\\\":0,\\\"bit0\\\":0,\\\"bit12\\\":0,\\\"bit13\\\":0,\\\"bit10\\\":0,\\\"bit11\\\":0,\\\"bit30\\\":0,\\\"bit31\\\":0}}\\r\\n                            var extraStatus = hex2bin(value.substring(6, 7)).substring(7, 8);\\r\\n                            //if (extraStatus.substring(7, 8) == '1') {\\r\\n                            //    extra += ' Enable, '\\r\\n                            //} else {\\r\\n                            //    extra += ' 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, \\\"welfare Mode\\\", extraStatus);\\r\\n                            // messageForReceiver = (`Sentry;ACK-EXTRA;${imei};`);\\r\\n                            // sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Mode, extraStatus);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Mode);\\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 = (`Sentry;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                            var triggerMode = '';\\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                            triggerMode = status.substring(2, 3);\\r\\n                            if (triggerMode == '1') {\\r\\n                                alertSetting += 'Double Press, '\\r\\n                            } else {\\r\\n                                alertSetting += 'Long Press, '\\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 = (`Sentry;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.ReadInterfaceOptions.SpeedActivationDialButton, triggerMode);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n                            configsToAck.push(configIds.ReadInterfaceOptions.SpeedActivationDialButton);\\r\\n                            break;\\r\\n                        case '20': // SOS Button Settings\\r\\n                            // [Length]:03 [Key]:20 [Value]:7B 9E {\\\"sosButton\\\":{\\\"mode\\\":0,\\\"feedBack\\\":3,\\\"task\\\":15,\\\"time\\\":30,\\\"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                            var triggerMode = '';\\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                            triggerMode = status.substring(2, 3);\\r\\n                            if (triggerMode == '1') {\\r\\n                                alertSetting += 'Double Press, '\\r\\n                            } else {\\r\\n                                alertSetting += 'Long Press, '\\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 = (`Sentry;ACK-SPEED;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"sos\\\", alertSetting);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadInterfaceOptions.SOSActivationButton, triggerMode);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            //configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n                            configsToAck.push(configIds.ReadInterfaceOptions.SOSActivationButton);\\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 = (`Sentry-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 = (`Sentry-${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 = (`Sentry-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 = (`Sentry-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 = (`Sentry-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":1757592825},{"Type":1,"NewValue":"{\"Id\":362,\"Name\":\"Access PS Sentry\",\"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    // Sentry protocol - please see variables and typical values in order below\\r\\n    // Sentry-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    // Sentry-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 N.\\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', 'Sentry');\\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 = (`Sentry-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        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        /*        // Check if total lenght of the complete message is higher than total lenght of the first message\\r\\n        // to know if the message includes more than one\\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 longitud = message.length - 16;\\r\\n        // Loop to decode multi msg, includes \\\"AB\\\" more than one time\\r\\n        //const matches = message.match(/AB/g);\\r\\n        //if (matches && matches.length > 1) {\\r\\n        if (total_length != longitud) { //if true then the msg contains more than one msg (possible bug of the device)\\r\\n            const multiack = message.split('AB');\\r\\n            for (let i = 1; i < multiack.length; i++) {\\r\\n                message = 'AB' + multiack[i];\\r\\n                debug(message);\\r\\n                decoder(message);\\r\\n            }\\r\\n        } else decoder(message); // it contains only one msg\\r\\nif (message.includes('AB00030008C7')) {// IF multiACK\\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); */\\r\\n    } else if (oystaTemplate == 'True') { // Oysta Template \\r\\n        // first decoding data of Oysta templates\\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 'BATCN': // Battery Charging - On\\r\\n                AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                configsToAck.push(configIds.ReadState.Charging);\\r\\n                //configs.AlertSettings.Welfare.Mode\\r\\n                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'false');\\r\\n                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'true');\\r\\n                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'false');\\r\\n                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                }\\r\\n                break;\\r\\n            case 'BATCF': // Battery Charging - Off\\r\\n                AddValue(configsToUpdate, configIds.ReadState.Charging, 'false');\\r\\n                configsToAck.push(configIds.ReadState.Charging);\\r\\n                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'true');\\r\\n                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'false');\\r\\n                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'true');\\r\\n                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                }\\r\\n                break;\\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 Sentry-')) {\\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 = (`Sentry-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 = (`Sentry;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 = (`Sentry;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 = (`Sentry-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    // 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    // decoder global template function\\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                                // no 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  ¿qué es fall OFF?\\r\\n                            if ((alarmCodeExtInt & 1) == 1) {\\r\\n                                var alarm = 'ALF-C'; // Fall-DownAlertending\\r\\n                            }\\r\\n                            // Welfare Check-out\\r\\n                            else if ((alarmCodeExtInt & 2) == 2) {\\r\\n                                //var alarm = 'WSTP';\\r\\n                                if (configs.Welfare !== undefined) {\\r\\n                                    if (configs.Welfare.Mode == '1') {\\r\\n                                        //info = 'Recurrent';\\r\\n                                        var alarm = 'WSTP';\\r\\n                                    } else {\\r\\n                                        //info = 'Amber';\\r\\n                                        var alarm = 'ALA-C';\\r\\n                                    }\\r\\n                                }\\r\\n                            }\\r\\n                            //Geo 5 in\\r\\n                            //else if ((alarmCodeInt & 16) == 16) {\\r\\n                            //    var alarm = 'BATL';\\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 Alert\\r\\n                            else if ((alarmCodeInt & 8) == 8) {\\r\\n                                var alarm = 'TLT';\\r\\n                            }\\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 Alert\\r\\n                            else if ((alarmCodeInt & 256) == 256) {\\r\\n                                var alarm = 'PWRF';\\r\\n                            }\\r\\n                            //Power On Alert\\r\\n                            else if ((alarmCodeInt & 512) == 512) {\\r\\n                                var alarm = 'PWRN';\\r\\n                            }\\r\\n                            //Motion Alert\\r\\n                            else if ((alarmCodeInt & 1024) == 1024) {\\r\\n                                var alarm = 'ALMOV';\\r\\n                            }\\r\\n                            //No Motion Alert\\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                            }\\r\\n                            // Side call button 1\\r\\n                            else if ((alarmCodeInt & 8192) == 8192) {\\r\\n                                var alarm = 'Side1';\\r\\n                            }\\r\\n                            // Side call button 2\\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                                /*AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                                configsToAck.push(configIds.ReadState.Charging);\\r\\n                                //configs.AlertSettings.Welfare.Mode\\r\\n                                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'false');\\r\\n                                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'true');\\r\\n                                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'false');\\r\\n                                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                                }*/\\r\\n                            }\\r\\n                            //Battery no charging\\r\\n                            else if ((alarmCodeInt & 65536) == 65536) {\\r\\n                                var alarm = 'BATCF';\\r\\n                                /* AddValue(configsToUpdate, configIds.ReadState.Charging, 'false');\\r\\n                                 configsToAck.push(configIds.ReadState.Charging);\\r\\n                                 if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                                     AddValue(configsToUpdate, configIds.ReadState.Welfare, 'true');\\r\\n                                     //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'false');\\r\\n                                     AddConfig(configsToSend, configIds.ReadState.Welfare, 'true');\\r\\n                                     configsToAck.push(configIds.ReadState.Welfare);\\r\\n                                 }*/\\r\\n                            }\\r\\n                            //Alert End\\r\\n                            else if ((alarmCodeInt & 131072) == 131072) {\\r\\n                                var alarm = 'ALA-F';\\r\\n                                info = 'Alarm Finished';\\r\\n                                //if (configs.Welfare !== undefined) {\\r\\n                                //    if (configs.Welfare.Mode == '1') {\\r\\n                                //        info = 'Recurrent';\\r\\n                                //    } else info = 'Amber';\\r\\n                                //}\\r\\n                            }\\r\\n                            //Amber Alert ON    Don`t know the dfference between ALA and ALA-O\\r\\n                            else if ((alarmCodeInt & 262144) == 262144) {\\r\\n                                var alarm = 'ALA';\\r\\n                            }\\r\\n                            // welfare check in  and amber alert ON\\r\\n                            else if ((alarmCodeInt & 524288) == 524288) {\\r\\n                                //var alarm = 'WTS';\\r\\n                                if (configs.Welfare !== undefined) {\\r\\n                                    if (configs.Welfare.Mode == '1') {\\r\\n                                        //info = 'Recurrent';\\r\\n                                        var alarm = 'WTS';\\r\\n                                    } else {\\r\\n                                        //info = 'Amber';\\r\\n                                        var alarm = 'ALA-O';\\r\\n                                    }\\r\\n                                }\\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\\r\\n                            else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n                                //var alarm = 'ALA-W';\\r\\n                                if (configs.Welfare !== undefined) {\\r\\n                                    if (configs.Welfare.Mode == '1') {\\r\\n                                        var alarm = 'ALA-W';\\r\\n                                        //info = 'Recurrent';\\r\\n                                    } else {\\r\\n                                        //info = 'Amber';\\r\\n                                        var alarm = 'ALA';\\r\\n                                    }\\r\\n                                }\\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                            //update customID to check if belongs to this type of device\\r\\n                            customID = value;\\r\\n                            if (value != '64') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\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                                    //no 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 != '64') {\\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 = (`Sentry-${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 = (`Sentry-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                            if ((statusInt & 16) == 16) {\\r\\n                                statusDevice += 'Charging,';\\r\\n                                // AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                                // configsToAck.push(configIds.ReadState.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 location: ' + lbs_data;\\r\\n                            break;\\r\\n                        case '30':\\r\\n                            //G-sensor. \\r\\n                            if (customID != '64') {\\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 = (`Sentry-${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 != '64') {\\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 = (`Sentry-${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 = (`Sentry-${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 = (`Sentry-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, quizas meter dentro del if (alarmcode)\\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 = (`Sentry;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 = (`Sentry;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                            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': // Incoming call Ringtone Volume\\r\\n                            var volume = hexToDecimal(value);\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Sentry;ACK-VOL;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"Ringtone\\\", volume);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.IncomingCallRingtoneVolume, volume);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.IncomingCallRingtoneVolume);\\r\\n                            break;\\r\\n                        case '12': // Speaker Volume\\r\\n                            var volume = hexToDecimal(value);\\r\\n                            AddValue(codeValues, \\\"Speaker\\\", volume);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.InCallSpeakerVolume, volume);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.InCallSpeakerVolume);\\r\\n                            break;\\r\\n                        case '1C': // Notifications and Alerts Volume\\r\\n                            var volume = hexToDecimal(value);\\r\\n                            AddValue(codeValues, \\\"Notifications\\\", volume);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.NotificationsandAlerts, volume);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.NotificationsandAlerts);\\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 = (`Sentry;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 = (`Sentry;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                                var allow = 'true';\\r\\n                            } else var allow = 'false';\\r\\n                            // To find LT setup\\r\\n                            if (statusPhone.substring(5, 6) == '1') { // 1 Enable\\r\\n                                var silentCall = 'true';\\r\\n                            } else var silentCall = '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                            AddValue(configsToUpdate, configIds.ReadProfiles.SilentCallMode, silentCall);\\r\\n                            //configsToAck.push(configIds.ReadSystemSettings.Statusphone);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AllowList);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AutoAnswer);\\r\\n                            configsToAck.push(configIds.ReadProfiles.SilentCallMode);\\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                            var report;\\r\\n                            switch (contactNumber) {\\r\\n                                // Emergency Number\\r\\n                                // [Value]:80 2B 33 34 36 33 35 36 30 37 39 33 30\\r\\n                                //{\\\"number\\\":{\\\"call\\\":0,\\\"noCard\\\":0,\\\"number\\\":\\\"+34635607930\\\",\\\"enable\\\":1,\\\"sms\\\":0,\\\"index\\\":0}}\\r\\n                                case '0':\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.length < 6) { //if no telephone defined\\r\\n                                        tel = '';\\r\\n                                    }\\r\\n                                    report = hex2bin(value.substring(0, 2)); // To find report mode Call &data or DAta only\\r\\n                                    AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                                    AddValue(codeValues, \\\"ReportMode\\\", report.substring(2, 3));\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.ReportMode, report.substring(2, 3));\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.ReportMode);\\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                                    if (tel.length < 6) { //if no telephone defined\\r\\n                                        tel = '';\\r\\n                                    }\\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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 '55': // Tilt Angle Alert\\r\\n                            //[Value]:0A 00 1E 00\\r\\n                            //{\\\"tiltAlert\\\":{\\\"angle\\\":30,\\\"time\\\":10,\\\"status\\\":0,\\\"dial\\\":0}}\\r\\n                            var angle = hexToDecimal(value.substring(4, 6));\\r\\n                            var timeout = hexToDecimal(value.substring(0, 2));\\r\\n                            var status = hexToDecimal(value.substring(6, 8));\\r\\n                            if (status == 0) angle = 0;\\r\\n                            //var alertSetting = angle;\\r\\n                            //imei = serverParams.Imei;\\r\\n                            //messageForReceiver = (`Sentry;ACK-TILTANG;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"tiltangle\\\", angle);\\r\\n                            AddValue(codeValues, \\\"tiltimeout\\\", timeout);\\r\\n                            AddValue(codeValues, \\\"tiltstatus\\\", status);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltTimeout, timeout);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltAngle, angle);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltTimeout);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltAngle);\\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 = (`Sentry;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.ManDownSettings, sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.EnableDisableManDownSettings, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.Sensitivity, sesibityOptionValue);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.EnableDisableManDownSettings);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.Sensitivity);\\r\\n                            break;\\r\\n                        case '57': // Welfare\\r\\n                            // [Value]:10 0E 00 80 58 02 00 80\\r\\n                            //{\\\"welfareAlert\\\":{\\\"time\\\":600,\\\"value\\\":3600,\\\"status\\\":1,\\\"dial\\\":1}}\\r\\n                            var welfareStatus = hex2bin(value.substring(6, 8)); // check status\\r\\n                            var welfareValue = hexToDecimal(changeEndianness(value.substring(0, 6)));\\r\\n                            var welfareTime = hexToDecimal(changeEndianness(value.substring(8, 14)));\\r\\n                            var enalbleDisable = '';\\r\\n                            if ((configs.ReadState.Charging == 'true') && (configs.Welfare.Mode == '1') && (configs.Welfare.EnableDisableWelfare == 'true')) { // Force Read to enable welfare when device is charging in recurrent mode\\r\\n                                var sensibility = 'Enable, '\\r\\n                                enalbleDisable = '1'\\r\\n                            } else {\\r\\n                                if (welfareStatus.substring(0, 1) == '1') {\\r\\n                                    var sensibility = 'Enable, '\\r\\n                                    enalbleDisable = '1'\\r\\n                                } else {\\r\\n                                    var sensibility = 'Disable, '\\r\\n                                    //enalbleDisable = '0'\\r\\n                                }\\r\\n                            };\\r\\n                            //var imei = serverParams.Imei;\\r\\n                            //messageForReceiver = (`Sentry;ACK-WELFALERT;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            sensibility += welfareValue / 60;\\r\\n                            sensibility += ', ' + welfareTime / 60;\\r\\n                            AddValue(codeValues, \\\"welfare\\\", sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.EnableDisableReadWelfare, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Prealarm, welfareTime / 60);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Timeout, welfareValue / 60);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.EnableDisableReadWelfare);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Prealarm);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Timeout);\\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 = (`Sentry;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 '75': // Extra Enable control   Welfare Mode\\r\\n                            //[Value]:80 00 00 10  last two digit for new/old welfare\\r\\n                            //{\\\"extraControl\\\":{\\\"bit29\\\":0,\\\"bit27\\\":0,\\\"bit28\\\":1,\\\"bit25\\\":0,\\\"bit26\\\":0,\\\"flagValue\\\":268435584,\\\"bit23\\\":0,\\\"bit24\\\":0,\\\"bit21\\\":0,\\\"bit22\\\":0,\\\"bit20\\\":0,\\\"bit9\\\":0,\\\"bit18\\\":0,\\\"bit19\\\":0,\\\"bit7\\\":1,\\\"bit16\\\":0,\\\"bit8\\\":0,\\\"bit17\\\":0,\\\"bit5\\\":0,\\\"bit14\\\":0,\\\"bit6\\\":0,\\\"bit15\\\":0,\\\"bit3\\\":0,\\\"bit4\\\":0,\\\"bit1\\\":0,\\\"bit2\\\":0,\\\"bit0\\\":0,\\\"bit12\\\":0,\\\"bit13\\\":0,\\\"bit10\\\":0,\\\"bit11\\\":0,\\\"bit30\\\":0,\\\"bit31\\\":0}}\\r\\n                            var extraStatus = hex2bin(value.substring(6, 7)).substring(7, 8);\\r\\n                            //if (extraStatus.substring(7, 8) == '1') {\\r\\n                            //    extra += ' Enable, '\\r\\n                            //} else {\\r\\n                            //    extra += ' 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, \\\"welfare Mode\\\", extraStatus);\\r\\n                            // messageForReceiver = (`Sentry;ACK-EXTRA;${imei};`);\\r\\n                            // sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Mode, extraStatus);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Mode);\\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 = (`Sentry;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                            var triggerMode = '';\\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                            triggerMode = status.substring(2, 3);\\r\\n                            if (triggerMode == '1') {\\r\\n                                alertSetting += 'Double Press, '\\r\\n                            } else {\\r\\n                                alertSetting += 'Long Press, '\\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 = (`Sentry;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.ReadInterfaceOptions.SpeedActivationDialButton, triggerMode);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n                            configsToAck.push(configIds.ReadInterfaceOptions.SpeedActivationDialButton);\\r\\n                            break;\\r\\n                        case '20': // SOS Button Settings\\r\\n                            // [Length]:03 [Key]:20 [Value]:7B 9E {\\\"sosButton\\\":{\\\"mode\\\":0,\\\"feedBack\\\":3,\\\"task\\\":15,\\\"time\\\":30,\\\"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                            var triggerMode = '';\\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                            triggerMode = status.substring(2, 3);\\r\\n                            if (triggerMode == '1') {\\r\\n                                alertSetting += 'Double Press, '\\r\\n                            } else {\\r\\n                                alertSetting += 'Long Press, '\\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 = (`Sentry;ACK-SPEED;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"sos\\\", alertSetting);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadInterfaceOptions.SOSActivationButton, triggerMode);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            //configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n                            configsToAck.push(configIds.ReadInterfaceOptions.SOSActivationButton);\\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 = (`Sentry-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 = (`Sentry-${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 = (`Sentry-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 = (`Sentry-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 = (`Sentry-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":1774209589},{"Type":1,"NewValue":"{\"Id\":362,\"Name\":\"Access PS Sentry\",\"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    // Sentry protocol - please see variables and typical values in order below\\r\\n    // Sentry-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    // Sentry-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 N.\\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', 'Sentry');\\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 = (`Sentry-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        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        /*        // Check if total lenght of the complete message is higher than total lenght of the first message\\r\\n        // to know if the message includes more than one\\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 longitud = message.length - 16;\\r\\n        // Loop to decode multi msg, includes \\\"AB\\\" more than one time\\r\\n        //const matches = message.match(/AB/g);\\r\\n        //if (matches && matches.length > 1) {\\r\\n        if (total_length != longitud) { //if true then the msg contains more than one msg (possible bug of the device)\\r\\n            const multiack = message.split('AB');\\r\\n            for (let i = 1; i < multiack.length; i++) {\\r\\n                message = 'AB' + multiack[i];\\r\\n                debug(message);\\r\\n                decoder(message);\\r\\n            }\\r\\n        } else decoder(message); // it contains only one msg\\r\\nif (message.includes('AB00030008C7')) {// IF multiACK\\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); */\\r\\n    } else if (oystaTemplate == 'True') { // Oysta Template \\r\\n        // first decoding data of Oysta templates\\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 'BATCN': // Battery Charging - On\\r\\n                AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                configsToAck.push(configIds.ReadState.Charging);\\r\\n                //configs.AlertSettings.Welfare.Mode\\r\\n                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'false');\\r\\n                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'true');\\r\\n                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'false');\\r\\n                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                }\\r\\n                break;\\r\\n            case 'BATCF': // Battery Charging - Off\\r\\n                AddValue(configsToUpdate, configIds.ReadState.Charging, 'false');\\r\\n                configsToAck.push(configIds.ReadState.Charging);\\r\\n                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'true');\\r\\n                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'false');\\r\\n                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'true');\\r\\n                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                }\\r\\n                break;\\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 Sentry-')) {\\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 = (`Sentry-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 = (`Sentry;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 = (`Sentry;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 = (`Sentry-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    // 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    // decoder global template function\\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                                // no 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  ¿qué es fall OFF?\\r\\n                            if ((alarmCodeExtInt & 1) == 1) {\\r\\n                                var alarm = 'ALF-C'; // Fall-DownAlertending\\r\\n                            }\\r\\n                            // Welfare Check-out\\r\\n                            else if ((alarmCodeExtInt & 2) == 2) {\\r\\n                                //var alarm = 'WSTP';\\r\\n                                if (configs.Welfare !== undefined) {\\r\\n                                    if (configs.Welfare.Mode == '1') {\\r\\n                                        //info = 'Recurrent';\\r\\n                                        var alarm = 'WSTP';\\r\\n                                    } else {\\r\\n                                        //info = 'Amber';\\r\\n                                        var alarm = 'ALA-C';\\r\\n                                    }\\r\\n                                }\\r\\n                            }\\r\\n                            //Geo 5 in\\r\\n                            //else if ((alarmCodeInt & 16) == 16) {\\r\\n                            //    var alarm = 'BATL';\\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 Alert\\r\\n                            else if ((alarmCodeInt & 8) == 8) {\\r\\n                                var alarm = 'TLT';\\r\\n                            }\\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 Alert\\r\\n                            else if ((alarmCodeInt & 256) == 256) {\\r\\n                                var alarm = 'PWRF';\\r\\n                            }\\r\\n                            //Power On Alert\\r\\n                            else if ((alarmCodeInt & 512) == 512) {\\r\\n                                var alarm = 'PWRN';\\r\\n                            }\\r\\n                            //Motion Alert\\r\\n                            else if ((alarmCodeInt & 1024) == 1024) {\\r\\n                                var alarm = 'ALMOV';\\r\\n                            }\\r\\n                            //No Motion Alert\\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                            }\\r\\n                            // Side call button 1\\r\\n                            else if ((alarmCodeInt & 8192) == 8192) {\\r\\n                                var alarm = 'Side1';\\r\\n                            }\\r\\n                            // Side call button 2\\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                                /*AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                                configsToAck.push(configIds.ReadState.Charging);\\r\\n                                //configs.AlertSettings.Welfare.Mode\\r\\n                                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'false');\\r\\n                                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'true');\\r\\n                                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'false');\\r\\n                                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                                }*/\\r\\n                            }\\r\\n                            //Battery no charging\\r\\n                            else if ((alarmCodeInt & 65536) == 65536) {\\r\\n                                var alarm = 'BATCF';\\r\\n                                /* AddValue(configsToUpdate, configIds.ReadState.Charging, 'false');\\r\\n                                 configsToAck.push(configIds.ReadState.Charging);\\r\\n                                 if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                                     AddValue(configsToUpdate, configIds.ReadState.Welfare, 'true');\\r\\n                                     //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'false');\\r\\n                                     AddConfig(configsToSend, configIds.ReadState.Welfare, 'true');\\r\\n                                     configsToAck.push(configIds.ReadState.Welfare);\\r\\n                                 }*/\\r\\n                            }\\r\\n                            //Alert End\\r\\n                            else if ((alarmCodeInt & 131072) == 131072) {\\r\\n                                var alarm = 'ALA-F';\\r\\n                                info = 'Alarm Finished';\\r\\n                                //if (configs.Welfare !== undefined) {\\r\\n                                //    if (configs.Welfare.Mode == '1') {\\r\\n                                //        info = 'Recurrent';\\r\\n                                //    } else info = 'Amber';\\r\\n                                //}\\r\\n                            }\\r\\n                            //Amber Alert ON    Don`t know the dfference between ALA and ALA-O\\r\\n                            else if ((alarmCodeInt & 262144) == 262144) {\\r\\n                                var alarm = 'ALA';\\r\\n                            }\\r\\n                            // welfare check in  and amber alert ON\\r\\n                            else if ((alarmCodeInt & 524288) == 524288) {\\r\\n                                //var alarm = 'WTS';\\r\\n                                if (configs.Welfare !== undefined) {\\r\\n                                    if (configs.Welfare.Mode == '1') {\\r\\n                                        //info = 'Recurrent';\\r\\n                                        var alarm = 'WTS';\\r\\n                                    } else {\\r\\n                                        //info = 'Amber';\\r\\n                                        var alarm = 'ALA-O';\\r\\n                                    }\\r\\n                                }\\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\\r\\n                            else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n                                //var alarm = 'ALA-W';\\r\\n                                if (configs.Welfare !== undefined) {\\r\\n                                    if (configs.Welfare.Mode == '1') {\\r\\n                                        var alarm = 'ALA-W';\\r\\n                                        //info = 'Recurrent';\\r\\n                                    } else {\\r\\n                                        //info = 'Amber';\\r\\n                                        var alarm = 'ALA';\\r\\n                                    }\\r\\n                                }\\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                            //update customID to check if belongs to this type of device\\r\\n                            customID = value;\\r\\n                            if (value != '64') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\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                                    //no 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 != '64') {\\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 = (`Sentry-${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 = (`Sentry-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                            if ((statusInt & 16) == 16) {\\r\\n                                statusDevice += 'Charging,';\\r\\n                                // AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                                // configsToAck.push(configIds.ReadState.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 location: ' + lbs_data;\\r\\n                            break;\\r\\n                        case '30':\\r\\n                            //G-sensor. \\r\\n                            if (customID != '64') {\\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 = (`Sentry-${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 != '64') {\\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 = (`Sentry-${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 = (`Sentry-${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 = (`Sentry-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, quizas meter dentro del if (alarmcode)\\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 = (`Sentry;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 = (`Sentry;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                            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': // Incoming call Ringtone Volume\\r\\n                            var volume = hexToDecimal(value);\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Sentry;ACK-VOL;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"Ringtone\\\", volume);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.IncomingCallRingtoneVolume, volume);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.IncomingCallRingtoneVolume);\\r\\n                            break;\\r\\n                        case '12': // Speaker Volume\\r\\n                            var volume = hexToDecimal(value);\\r\\n                            AddValue(codeValues, \\\"Speaker\\\", volume);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.InCallSpeakerVolume, volume);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.InCallSpeakerVolume);\\r\\n                            break;\\r\\n                        case '1C': // Notifications and Alerts Volume\\r\\n                            var volume = hexToDecimal(value);\\r\\n                            AddValue(codeValues, \\\"Notifications\\\", volume);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.NotificationsandAlerts, volume);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.NotificationsandAlerts);\\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 = (`Sentry;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 = (`Sentry;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                                var allow = 'true';\\r\\n                            } else var allow = 'false';\\r\\n                            // To find LT setup\\r\\n                            if (statusPhone.substring(5, 6) == '1') { // 1 Enable\\r\\n                                var silentCall = 'true';\\r\\n                            } else var silentCall = '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                            AddValue(configsToUpdate, configIds.ReadProfiles.SilentCallMode, silentCall);\\r\\n                            //configsToAck.push(configIds.ReadSystemSettings.Statusphone);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AllowList);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AutoAnswer);\\r\\n                            configsToAck.push(configIds.ReadProfiles.SilentCallMode);\\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                            var report;\\r\\n                            switch (contactNumber) {\\r\\n                                // Emergency Number\\r\\n                                // [Value]:80 2B 33 34 36 33 35 36 30 37 39 33 30\\r\\n                                //{\\\"number\\\":{\\\"call\\\":0,\\\"noCard\\\":0,\\\"number\\\":\\\"+34635607930\\\",\\\"enable\\\":1,\\\"sms\\\":0,\\\"index\\\":0}}\\r\\n                                case '0':\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.length < 6) { //if no telephone defined\\r\\n                                        tel = '';\\r\\n                                    }\\r\\n                                    report = hex2bin(value.substring(0, 2)); // To find report mode Call &data or DAta only\\r\\n                                    AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                                    AddValue(codeValues, \\\"ReportMode\\\", report.substring(2, 3));\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.ReportMode, report.substring(2, 3));\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.ReportMode);\\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                                    if (tel.length < 6) { //if no telephone defined\\r\\n                                        tel = '';\\r\\n                                    }\\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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 '55': // Tilt Angle Alert\\r\\n                            //[Value]:0A 00 1E 00\\r\\n                            //{\\\"tiltAlert\\\":{\\\"angle\\\":30,\\\"time\\\":10,\\\"status\\\":0,\\\"dial\\\":0}}\\r\\n                            var angle = hexToDecimal(value.substring(4, 6));\\r\\n                            var timeout = hexToDecimal(value.substring(0, 2));\\r\\n                            var status = hexToDecimal(value.substring(6, 8));\\r\\n                            if (status == 0) angle = 0;\\r\\n                            //var alertSetting = angle;\\r\\n                            //imei = serverParams.Imei;\\r\\n                            //messageForReceiver = (`Sentry;ACK-TILTANG;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"tiltangle\\\", angle);\\r\\n                            AddValue(codeValues, \\\"tiltimeout\\\", timeout);\\r\\n                            AddValue(codeValues, \\\"tiltstatus\\\", status);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltTimeout, timeout);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltAngle, angle);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltTimeout);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltAngle);\\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 = (`Sentry;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.ManDownSettings, sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.EnableDisableManDownSettings, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.Sensitivity, sesibityOptionValue);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.EnableDisableManDownSettings);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.Sensitivity);\\r\\n                            break;\\r\\n                        case '57': // Welfare\\r\\n                            // [Value]:10 0E 00 80 58 02 00 80\\r\\n                            //{\\\"welfareAlert\\\":{\\\"time\\\":600,\\\"value\\\":3600,\\\"status\\\":1,\\\"dial\\\":1}}\\r\\n                            var welfareStatus = hex2bin(value.substring(6, 8)); // check status\\r\\n                            var welfareValue = hexToDecimal(changeEndianness(value.substring(0, 6)));\\r\\n                            var welfareTime = hexToDecimal(changeEndianness(value.substring(8, 14)));\\r\\n                            var enalbleDisable = '';\\r\\n                            if ((configs.ReadState.Charging == 'true') && (configs.Welfare.Mode == '1') && (configs.Welfare.EnableDisableWelfare == 'true')) { // Force Read to enable welfare when device is charging in recurrent mode\\r\\n                                var sensibility = 'Enable, '\\r\\n                                enalbleDisable = '1'\\r\\n                            } else {\\r\\n                                if (welfareStatus.substring(0, 1) == '1') {\\r\\n                                    var sensibility = 'Enable, '\\r\\n                                    enalbleDisable = '1'\\r\\n                                } else {\\r\\n                                    var sensibility = 'Disable, '\\r\\n                                    //enalbleDisable = '0'\\r\\n                                }\\r\\n                            };\\r\\n                            //var imei = serverParams.Imei;\\r\\n                            //messageForReceiver = (`Sentry;ACK-WELFALERT;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            sensibility += welfareValue / 60;\\r\\n                            sensibility += ', ' + welfareTime / 60;\\r\\n                            AddValue(codeValues, \\\"welfare\\\", sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.EnableDisableReadWelfare, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Prealarm, welfareTime / 60);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Timeout, welfareValue / 60);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.EnableDisableReadWelfare);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Prealarm);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Timeout);\\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 = (`Sentry;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 '75': // Extra Enable control   Welfare Mode\\r\\n                            //[Value]:80 00 00 10  last two digit for new/old welfare\\r\\n                            //{\\\"extraControl\\\":{\\\"bit29\\\":0,\\\"bit27\\\":0,\\\"bit28\\\":1,\\\"bit25\\\":0,\\\"bit26\\\":0,\\\"flagValue\\\":268435584,\\\"bit23\\\":0,\\\"bit24\\\":0,\\\"bit21\\\":0,\\\"bit22\\\":0,\\\"bit20\\\":0,\\\"bit9\\\":0,\\\"bit18\\\":0,\\\"bit19\\\":0,\\\"bit7\\\":1,\\\"bit16\\\":0,\\\"bit8\\\":0,\\\"bit17\\\":0,\\\"bit5\\\":0,\\\"bit14\\\":0,\\\"bit6\\\":0,\\\"bit15\\\":0,\\\"bit3\\\":0,\\\"bit4\\\":0,\\\"bit1\\\":0,\\\"bit2\\\":0,\\\"bit0\\\":0,\\\"bit12\\\":0,\\\"bit13\\\":0,\\\"bit10\\\":0,\\\"bit11\\\":0,\\\"bit30\\\":0,\\\"bit31\\\":0}}\\r\\n                            var extraStatus = hex2bin(value.substring(6, 7)).substring(7, 8);\\r\\n                            //if (extraStatus.substring(7, 8) == '1') {\\r\\n                            //    extra += ' Enable, '\\r\\n                            //} else {\\r\\n                            //    extra += ' 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, \\\"welfare Mode\\\", extraStatus);\\r\\n                            // messageForReceiver = (`Sentry;ACK-EXTRA;${imei};`);\\r\\n                            // sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Mode, extraStatus);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Mode);\\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 = (`Sentry;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                            var triggerMode = '';\\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                            triggerMode = status.substring(2, 3);\\r\\n                            if (triggerMode == '1') {\\r\\n                                alertSetting += 'Double Press, '\\r\\n                            } else {\\r\\n                                alertSetting += 'Long Press, '\\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 = (`Sentry;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.ReadInterfaceOptions.SpeedActivationDialButton, triggerMode);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n                            configsToAck.push(configIds.ReadInterfaceOptions.SpeedActivationDialButton);\\r\\n                            break;\\r\\n                        case '20': // SOS Button Settings\\r\\n                            // [Length]:03 [Key]:20 [Value]:7B 9E {\\\"sosButton\\\":{\\\"mode\\\":0,\\\"feedBack\\\":3,\\\"task\\\":15,\\\"time\\\":30,\\\"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                            var triggerMode = '';\\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                            triggerMode = status.substring(2, 3);\\r\\n                            if (triggerMode == '1') {\\r\\n                                alertSetting += 'Double Press, '\\r\\n                            } else {\\r\\n                                alertSetting += 'Long Press, '\\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 = (`Sentry;ACK-SPEED;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"sos\\\", alertSetting);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadInterfaceOptions.SOSActivationButton, triggerMode);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            //configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n                            configsToAck.push(configIds.ReadInterfaceOptions.SOSActivationButton);\\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 = (`Sentry-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 = (`Sentry-${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 = (`Sentry-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 = (`Sentry-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 = (`Sentry-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":1775039196},{"Type":1,"NewValue":"{\"Id\":362,\"Name\":\"Access PS Sentry\",\"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    // Sentry protocol - please see variables and typical values in order below\\r\\n    // Sentry-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    // Sentry-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 N.\\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', 'Sentry');\\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 = (`Sentry-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        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        /*        // Check if total lenght of the complete message is higher than total lenght of the first message\\r\\n        // to know if the message includes more than one\\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 longitud = message.length - 16;\\r\\n        // Loop to decode multi msg, includes \\\"AB\\\" more than one time\\r\\n        //const matches = message.match(/AB/g);\\r\\n        //if (matches && matches.length > 1) {\\r\\n        if (total_length != longitud) { //if true then the msg contains more than one msg (possible bug of the device)\\r\\n            const multiack = message.split('AB');\\r\\n            for (let i = 1; i < multiack.length; i++) {\\r\\n                message = 'AB' + multiack[i];\\r\\n                debug(message);\\r\\n                decoder(message);\\r\\n            }\\r\\n        } else decoder(message); // it contains only one msg\\r\\nif (message.includes('AB00030008C7')) {// IF multiACK\\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); */\\r\\n    } else if (oystaTemplate == 'True') { // Oysta Template \\r\\n        // first decoding data of Oysta templates\\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 'BATCN': // Battery Charging - On\\r\\n                AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                configsToAck.push(configIds.ReadState.Charging);\\r\\n                //configs.AlertSettings.Welfare.Mode\\r\\n                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'false');\\r\\n                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'true');\\r\\n                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'false');\\r\\n                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                }\\r\\n                break;\\r\\n            case 'BATCF': // Battery Charging - Off\\r\\n                AddValue(configsToUpdate, configIds.ReadState.Charging, 'false');\\r\\n                configsToAck.push(configIds.ReadState.Charging);\\r\\n                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'true');\\r\\n                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'false');\\r\\n                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'true');\\r\\n                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                }\\r\\n                break;\\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 Sentry-')) {\\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 = (`Sentry-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 = (`Sentry;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 = (`Sentry;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 = (`Sentry-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    // 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    // decoder global template function\\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                                // no 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  ¿qué es fall OFF?\\r\\n                            if ((alarmCodeExtInt & 1) == 1) {\\r\\n                                var alarm = 'ALF-C'; // Fall-DownAlertending\\r\\n                            }\\r\\n                            // Welfare Check-out\\r\\n                            else if ((alarmCodeExtInt & 2) == 2) {\\r\\n                                //var alarm = 'WSTP';\\r\\n                                if (configs.Welfare !== undefined) {\\r\\n                                    if (configs.Welfare.Mode == '1') {\\r\\n                                        //info = 'Recurrent';\\r\\n                                        var alarm = 'WSTP';\\r\\n                                    } else {\\r\\n                                        //info = 'Amber';\\r\\n                                        var alarm = 'ALA-C';\\r\\n                                    }\\r\\n                                }\\r\\n                            }\\r\\n                            //Geo 5 in\\r\\n                            //else if ((alarmCodeInt & 16) == 16) {\\r\\n                            //    var alarm = 'BATL';\\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 Alert\\r\\n                            else if ((alarmCodeInt & 8) == 8) {\\r\\n                                var alarm = 'TLT';\\r\\n                            }\\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 Alert\\r\\n                            else if ((alarmCodeInt & 256) == 256) {\\r\\n                                var alarm = 'PWRF';\\r\\n                            }\\r\\n                            //Power On Alert\\r\\n                            else if ((alarmCodeInt & 512) == 512) {\\r\\n                                var alarm = 'PWRN';\\r\\n                            }\\r\\n                            //Motion Alert\\r\\n                            else if ((alarmCodeInt & 1024) == 1024) {\\r\\n                                var alarm = 'ALMOV';\\r\\n                            }\\r\\n                            //No Motion Alert\\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                            }\\r\\n                            // Side call button 1\\r\\n                            else if ((alarmCodeInt & 8192) == 8192) {\\r\\n                                var alarm = 'Side1';\\r\\n                            }\\r\\n                            // Side call button 2\\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                                /*AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                                configsToAck.push(configIds.ReadState.Charging);\\r\\n                                //configs.AlertSettings.Welfare.Mode\\r\\n                                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'false');\\r\\n                                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'true');\\r\\n                                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'false');\\r\\n                                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                                }*/\\r\\n                            }\\r\\n                            //Battery no charging\\r\\n                            else if ((alarmCodeInt & 65536) == 65536) {\\r\\n                                var alarm = 'BATCF';\\r\\n                                /* AddValue(configsToUpdate, configIds.ReadState.Charging, 'false');\\r\\n                                 configsToAck.push(configIds.ReadState.Charging);\\r\\n                                 if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                                     AddValue(configsToUpdate, configIds.ReadState.Welfare, 'true');\\r\\n                                     //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'false');\\r\\n                                     AddConfig(configsToSend, configIds.ReadState.Welfare, 'true');\\r\\n                                     configsToAck.push(configIds.ReadState.Welfare);\\r\\n                                 }*/\\r\\n                            }\\r\\n                            //Alert End\\r\\n                            else if ((alarmCodeInt & 131072) == 131072) {\\r\\n                                var alarm = 'ALA-F';\\r\\n                                info = 'Alarm Finished';\\r\\n                                //if (configs.Welfare !== undefined) {\\r\\n                                //    if (configs.Welfare.Mode == '1') {\\r\\n                                //        info = 'Recurrent';\\r\\n                                //    } else info = 'Amber';\\r\\n                                //}\\r\\n                            }\\r\\n                            //Amber Alert ON    Don`t know the dfference between ALA and ALA-O\\r\\n                            else if ((alarmCodeInt & 262144) == 262144) {\\r\\n                                var alarm = 'ALA';\\r\\n                            }\\r\\n                            // welfare check in  and amber alert ON\\r\\n                            else if ((alarmCodeInt & 524288) == 524288) {\\r\\n                                //var alarm = 'WTS';\\r\\n                                if (configs.Welfare !== undefined) {\\r\\n                                    if (configs.Welfare.Mode == '1') {\\r\\n                                        //info = 'Recurrent';\\r\\n                                        var alarm = 'WTS';\\r\\n                                    } else {\\r\\n                                        //info = 'Amber';\\r\\n                                        var alarm = 'ALA-O';\\r\\n                                    }\\r\\n                                }\\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\\r\\n                            else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n                                //var alarm = 'ALA-W';\\r\\n                                if (configs.Welfare !== undefined) {\\r\\n                                    if (configs.Welfare.Mode == '1') {\\r\\n                                        var alarm = 'ALA-W';\\r\\n                                        //info = 'Recurrent';\\r\\n                                    } else {\\r\\n                                        //info = 'Amber';\\r\\n                                        var alarm = 'ALA';\\r\\n                                    }\\r\\n                                }\\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                            //update customID to check if belongs to this type of device\\r\\n                            customID = value;\\r\\n                            if (value != '64') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\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                                    //no 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 != '64') {\\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 = (`Sentry-${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 = (`Sentry-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                            if ((statusInt & 16) == 16) {\\r\\n                                statusDevice += 'Charging,';\\r\\n                                // AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                                // configsToAck.push(configIds.ReadState.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 location: ' + lbs_data;\\r\\n                            break;\\r\\n                        case '30':\\r\\n                            //G-sensor. \\r\\n                            if (customID != '64') {\\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 = (`Sentry-${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 != '64') {\\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 = (`Sentry-${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                //  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 = (`Sentry-${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 = (`Sentry-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, quizas meter dentro del if (alarmcode)\\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 = (`Sentry;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 = (`Sentry;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                            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': // Incoming call Ringtone Volume\\r\\n                            var volume = hexToDecimal(value);\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Sentry;ACK-VOL;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"Ringtone\\\", volume);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.IncomingCallRingtoneVolume, volume);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.IncomingCallRingtoneVolume);\\r\\n                            break;\\r\\n                        case '12': // Speaker Volume\\r\\n                            var volume = hexToDecimal(value);\\r\\n                            AddValue(codeValues, \\\"Speaker\\\", volume);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.InCallSpeakerVolume, volume);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.InCallSpeakerVolume);\\r\\n                            break;\\r\\n                        case '1C': // Notifications and Alerts Volume\\r\\n                            var volume = hexToDecimal(value);\\r\\n                            AddValue(codeValues, \\\"Notifications\\\", volume);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.NotificationsandAlerts, volume);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.NotificationsandAlerts);\\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 = (`Sentry;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 = (`Sentry;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                                var allow = 'true';\\r\\n                            } else var allow = 'false';\\r\\n                            // To find LT setup\\r\\n                            if (statusPhone.substring(5, 6) == '1') { // 1 Enable\\r\\n                                var silentCall = 'true';\\r\\n                            } else var silentCall = '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                            AddValue(configsToUpdate, configIds.ReadProfiles.SilentCallMode, silentCall);\\r\\n                            //configsToAck.push(configIds.ReadSystemSettings.Statusphone);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AllowList);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AutoAnswer);\\r\\n                            configsToAck.push(configIds.ReadProfiles.SilentCallMode);\\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                            var report;\\r\\n                            switch (contactNumber) {\\r\\n                                // Emergency Number\\r\\n                                // [Value]:80 2B 33 34 36 33 35 36 30 37 39 33 30\\r\\n                                //{\\\"number\\\":{\\\"call\\\":0,\\\"noCard\\\":0,\\\"number\\\":\\\"+34635607930\\\",\\\"enable\\\":1,\\\"sms\\\":0,\\\"index\\\":0}}\\r\\n                                case '0':\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.length < 6) { //if no telephone defined\\r\\n                                        tel = '';\\r\\n                                    }\\r\\n                                    report = hex2bin(value.substring(0, 2)); // To find report mode Call &data or DAta only\\r\\n                                    AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                                    AddValue(codeValues, \\\"ReportMode\\\", report.substring(2, 3));\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.ReportMode, report.substring(2, 3));\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.ReportMode);\\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                                    if (tel.length < 6) { //if no telephone defined\\r\\n                                        tel = '';\\r\\n                                    }\\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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 '55': // Tilt Angle Alert\\r\\n                            //[Value]:0A 00 1E 00\\r\\n                            //{\\\"tiltAlert\\\":{\\\"angle\\\":30,\\\"time\\\":10,\\\"status\\\":0,\\\"dial\\\":0}}\\r\\n                            var angle = hexToDecimal(value.substring(4, 6));\\r\\n                            var timeout = hexToDecimal(value.substring(0, 2));\\r\\n                            var status = hexToDecimal(value.substring(6, 8));\\r\\n                            if (status == 0) angle = 0;\\r\\n                            //var alertSetting = angle;\\r\\n                            //imei = serverParams.Imei;\\r\\n                            //messageForReceiver = (`Sentry;ACK-TILTANG;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"tiltangle\\\", angle);\\r\\n                            AddValue(codeValues, \\\"tiltimeout\\\", timeout);\\r\\n                            AddValue(codeValues, \\\"tiltstatus\\\", status);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltTimeout, timeout);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltAngle, angle);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltTimeout);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltAngle);\\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 = (`Sentry;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.ManDownSettings, sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.EnableDisableManDownSettings, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.Sensitivity, sesibityOptionValue);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.EnableDisableManDownSettings);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.Sensitivity);\\r\\n                            break;\\r\\n                        case '57': // Welfare\\r\\n                            // [Value]:10 0E 00 80 58 02 00 80\\r\\n                            //{\\\"welfareAlert\\\":{\\\"time\\\":600,\\\"value\\\":3600,\\\"status\\\":1,\\\"dial\\\":1}}\\r\\n                            var welfareStatus = hex2bin(value.substring(6, 8)); // check status\\r\\n                            var welfareValue = hexToDecimal(changeEndianness(value.substring(0, 6)));\\r\\n                            var welfareTime = hexToDecimal(changeEndianness(value.substring(8, 14)));\\r\\n                            var enalbleDisable = '';\\r\\n                            if ((configs.ReadState.Charging == 'true') && (configs.Welfare.Mode == '1') && (configs.Welfare.EnableDisableWelfare == 'true')) { // Force Read to enable welfare when device is charging in recurrent mode\\r\\n                                var sensibility = 'Enable, '\\r\\n                                enalbleDisable = '1'\\r\\n                            } else {\\r\\n                                if (welfareStatus.substring(0, 1) == '1') {\\r\\n                                    var sensibility = 'Enable, '\\r\\n                                    enalbleDisable = '1'\\r\\n                                } else {\\r\\n                                    var sensibility = 'Disable, '\\r\\n                                    //enalbleDisable = '0'\\r\\n                                }\\r\\n                            };\\r\\n                            //var imei = serverParams.Imei;\\r\\n                            //messageForReceiver = (`Sentry;ACK-WELFALERT;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            sensibility += welfareValue / 60;\\r\\n                            sensibility += ', ' + welfareTime / 60;\\r\\n                            AddValue(codeValues, \\\"welfare\\\", sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.EnableDisableReadWelfare, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Prealarm, welfareTime / 60);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Timeout, welfareValue / 60);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.EnableDisableReadWelfare);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Prealarm);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Timeout);\\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 = (`Sentry;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 '75': // Extra Enable control   Welfare Mode\\r\\n                            //[Value]:80 00 00 10  last two digit for new/old welfare\\r\\n                            //{\\\"extraControl\\\":{\\\"bit29\\\":0,\\\"bit27\\\":0,\\\"bit28\\\":1,\\\"bit25\\\":0,\\\"bit26\\\":0,\\\"flagValue\\\":268435584,\\\"bit23\\\":0,\\\"bit24\\\":0,\\\"bit21\\\":0,\\\"bit22\\\":0,\\\"bit20\\\":0,\\\"bit9\\\":0,\\\"bit18\\\":0,\\\"bit19\\\":0,\\\"bit7\\\":1,\\\"bit16\\\":0,\\\"bit8\\\":0,\\\"bit17\\\":0,\\\"bit5\\\":0,\\\"bit14\\\":0,\\\"bit6\\\":0,\\\"bit15\\\":0,\\\"bit3\\\":0,\\\"bit4\\\":0,\\\"bit1\\\":0,\\\"bit2\\\":0,\\\"bit0\\\":0,\\\"bit12\\\":0,\\\"bit13\\\":0,\\\"bit10\\\":0,\\\"bit11\\\":0,\\\"bit30\\\":0,\\\"bit31\\\":0}}\\r\\n                            var extraStatus = hex2bin(value.substring(6, 7)).substring(7, 8);\\r\\n                            //if (extraStatus.substring(7, 8) == '1') {\\r\\n                            //    extra += ' Enable, '\\r\\n                            //} else {\\r\\n                            //    extra += ' 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, \\\"welfare Mode\\\", extraStatus);\\r\\n                            // messageForReceiver = (`Sentry;ACK-EXTRA;${imei};`);\\r\\n                            // sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Mode, extraStatus);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Mode);\\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 = (`Sentry;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                            var triggerMode = '';\\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                            triggerMode = status.substring(2, 3);\\r\\n                            if (triggerMode == '1') {\\r\\n                                alertSetting += 'Double Press, '\\r\\n                            } else {\\r\\n                                alertSetting += 'Long Press, '\\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 = (`Sentry;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.ReadInterfaceOptions.SpeedActivationDialButton, triggerMode);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n                            configsToAck.push(configIds.ReadInterfaceOptions.SpeedActivationDialButton);\\r\\n                            break;\\r\\n                        case '20': // SOS Button Settings\\r\\n                            // [Length]:03 [Key]:20 [Value]:7B 9E {\\\"sosButton\\\":{\\\"mode\\\":0,\\\"feedBack\\\":3,\\\"task\\\":15,\\\"time\\\":30,\\\"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                            var triggerMode = '';\\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                            triggerMode = status.substring(2, 3);\\r\\n                            if (triggerMode == '1') {\\r\\n                                alertSetting += 'Double Press, '\\r\\n                            } else {\\r\\n                                alertSetting += 'Long Press, '\\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 = (`Sentry;ACK-SPEED;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"sos\\\", alertSetting);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadInterfaceOptions.SOSActivationButton, triggerMode);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            //configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n                            configsToAck.push(configIds.ReadInterfaceOptions.SOSActivationButton);\\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 = (`Sentry-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 = (`Sentry-${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 = (`Sentry-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 = (`Sentry-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 = (`Sentry-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":1775726105},{"Type":1,"NewValue":"{\"Id\":362,\"Name\":\"Access PS Sentry\",\"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    // Sentry protocol - please see variables and typical values in order below\\r\\n    // Sentry-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    // Sentry-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 N.\\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', 'Sentry');\\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 = (`Sentry-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        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        /*        // Check if total lenght of the complete message is higher than total lenght of the first message\\r\\n        // to know if the message includes more than one\\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 longitud = message.length - 16;\\r\\n        // Loop to decode multi msg, includes \\\"AB\\\" more than one time\\r\\n        //const matches = message.match(/AB/g);\\r\\n        //if (matches && matches.length > 1) {\\r\\n        if (total_length != longitud) { //if true then the msg contains more than one msg (possible bug of the device)\\r\\n            const multiack = message.split('AB');\\r\\n            for (let i = 1; i < multiack.length; i++) {\\r\\n                message = 'AB' + multiack[i];\\r\\n                debug(message);\\r\\n                decoder(message);\\r\\n            }\\r\\n        } else decoder(message); // it contains only one msg\\r\\nif (message.includes('AB00030008C7')) {// IF multiACK\\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); */\\r\\n    } else if (oystaTemplate == 'True') { // Oysta Template \\r\\n        // first decoding data of Oysta templates\\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 'BATCN': // Battery Charging - On\\r\\n                AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                configsToAck.push(configIds.ReadState.Charging);\\r\\n                //configs.AlertSettings.Welfare.Mode\\r\\n                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'false');\\r\\n                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'true');\\r\\n                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'false');\\r\\n                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                }\\r\\n                break;\\r\\n            case 'BATCF': // Battery Charging - Off\\r\\n                AddValue(configsToUpdate, configIds.ReadState.Charging, 'false');\\r\\n                configsToAck.push(configIds.ReadState.Charging);\\r\\n                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'true');\\r\\n                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'false');\\r\\n                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'true');\\r\\n                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                }\\r\\n                break;\\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 Sentry-')) {\\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 = (`Sentry-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 = (`Sentry;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 = (`Sentry;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 = (`Sentry-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    // 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    // decoder global template function\\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                                // no 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  ¿qué es fall OFF?\\r\\n                            if ((alarmCodeExtInt & 1) == 1) {\\r\\n                                var alarm = 'ALF-C'; // Fall-DownAlertending\\r\\n                            }\\r\\n                            // Welfare Check-out\\r\\n                            else if ((alarmCodeExtInt & 2) == 2) {\\r\\n                                //var alarm = 'WSTP';\\r\\n                                if (configs.Welfare !== undefined) {\\r\\n                                    if (configs.Welfare.Mode == '1') {\\r\\n                                        //info = 'Recurrent';\\r\\n                                        var alarm = 'WSTP';\\r\\n                                    } else {\\r\\n                                        //info = 'Amber';\\r\\n                                        var alarm = 'ALA-C';\\r\\n                                    }\\r\\n                                }\\r\\n                            }\\r\\n                            //Geo 5 in\\r\\n                            //else if ((alarmCodeInt & 16) == 16) {\\r\\n                            //    var alarm = 'BATL';\\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 Alert\\r\\n                            else if ((alarmCodeInt & 8) == 8) {\\r\\n                                var alarm = 'TLT';\\r\\n                            }\\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 Alert\\r\\n                            else if ((alarmCodeInt & 256) == 256) {\\r\\n                                var alarm = 'PWRF';\\r\\n                            }\\r\\n                            //Power On Alert\\r\\n                            else if ((alarmCodeInt & 512) == 512) {\\r\\n                                var alarm = 'PWRN';\\r\\n                            }\\r\\n                            //Motion Alert\\r\\n                            else if ((alarmCodeInt & 1024) == 1024) {\\r\\n                                var alarm = 'ALMOV';\\r\\n                            }\\r\\n                            //No Motion Alert\\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                            }\\r\\n                            // Side call button 1\\r\\n                            else if ((alarmCodeInt & 8192) == 8192) {\\r\\n                                var alarm = 'Side1';\\r\\n                            }\\r\\n                            // Side call button 2\\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                                /*AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                                configsToAck.push(configIds.ReadState.Charging);\\r\\n                                //configs.AlertSettings.Welfare.Mode\\r\\n                                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'false');\\r\\n                                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'true');\\r\\n                                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'false');\\r\\n                                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                                }*/\\r\\n                            }\\r\\n                            //Battery no charging\\r\\n                            else if ((alarmCodeInt & 65536) == 65536) {\\r\\n                                var alarm = 'BATCF';\\r\\n                                /* AddValue(configsToUpdate, configIds.ReadState.Charging, 'false');\\r\\n                                 configsToAck.push(configIds.ReadState.Charging);\\r\\n                                 if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                                     AddValue(configsToUpdate, configIds.ReadState.Welfare, 'true');\\r\\n                                     //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'false');\\r\\n                                     AddConfig(configsToSend, configIds.ReadState.Welfare, 'true');\\r\\n                                     configsToAck.push(configIds.ReadState.Welfare);\\r\\n                                 }*/\\r\\n                            }\\r\\n                            //Alert End\\r\\n                            else if ((alarmCodeInt & 131072) == 131072) {\\r\\n                                var alarm = 'ALA-F';\\r\\n                                info = 'Alarm Finished';\\r\\n                                //if (configs.Welfare !== undefined) {\\r\\n                                //    if (configs.Welfare.Mode == '1') {\\r\\n                                //        info = 'Recurrent';\\r\\n                                //    } else info = 'Amber';\\r\\n                                //}\\r\\n                            }\\r\\n                            //Amber Alert ON    Don`t know the dfference between ALA and ALA-O\\r\\n                            else if ((alarmCodeInt & 262144) == 262144) {\\r\\n                                var alarm = 'ALA';\\r\\n                            }\\r\\n                            // welfare check in  and amber alert ON\\r\\n                            else if ((alarmCodeInt & 524288) == 524288) {\\r\\n                                //var alarm = 'WTS';\\r\\n                                if (configs.Welfare !== undefined) {\\r\\n                                    if (configs.Welfare.Mode == '1') {\\r\\n                                        //info = 'Recurrent';\\r\\n                                        var alarm = 'WTS';\\r\\n                                    } else {\\r\\n                                        //info = 'Amber';\\r\\n                                        var alarm = 'ALA-O';\\r\\n                                    }\\r\\n                                }\\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\\r\\n                            else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n                                //var alarm = 'ALA-W';\\r\\n                                if (configs.Welfare !== undefined) {\\r\\n                                    if (configs.Welfare.Mode == '1') {\\r\\n                                        var alarm = 'ALA-W';\\r\\n                                        //info = 'Recurrent';\\r\\n                                    } else {\\r\\n                                        //info = 'Amber';\\r\\n                                        var alarm = 'ALA';\\r\\n                                    }\\r\\n                                }\\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                            //update customID to check if belongs to this type of device\\r\\n                            customID = value;\\r\\n                            if (value != '64') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\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                                    //no 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 != '64') {\\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 = (`Sentry-${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 = (`Sentry-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                            if ((statusInt & 16) == 16) {\\r\\n                                statusDevice += 'Charging,';\\r\\n                                // AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                                // configsToAck.push(configIds.ReadState.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 location: ' + lbs_data;\\r\\n                            break;\\r\\n                        case '30':\\r\\n                            //G-sensor. \\r\\n                            if (customID != '64') {\\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 = (`Sentry-${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 != '64') {\\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 = (`Sentry-${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                //  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 = (`Sentry-${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 = (`Sentry-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, quizas meter dentro del if (alarmcode)\\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 = (`Sentry;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 = (`Sentry;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                            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': // Incoming call Ringtone Volume\\r\\n                            var volume = hexToDecimal(value);\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Sentry;ACK-VOL;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"Ringtone\\\", volume);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.IncomingCallRingtoneVolume, volume);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.IncomingCallRingtoneVolume);\\r\\n                            break;\\r\\n                        case '12': // Speaker Volume\\r\\n                            var volume = hexToDecimal(value);\\r\\n                            AddValue(codeValues, \\\"Speaker\\\", volume);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.InCallSpeakerVolume, volume);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.InCallSpeakerVolume);\\r\\n                            break;\\r\\n                        case '1C': // Notifications and Alerts Volume\\r\\n                            var volume = hexToDecimal(value);\\r\\n                            AddValue(codeValues, \\\"Notifications\\\", volume);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.NotificationsandAlerts, volume);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.NotificationsandAlerts);\\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 = (`Sentry;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 = (`Sentry;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                                var allow = 'true';\\r\\n                            } else var allow = 'false';\\r\\n                            // To find LT setup\\r\\n                            if (statusPhone.substring(5, 6) == '1') { // 1 Enable\\r\\n                                var silentCall = 'true';\\r\\n                            } else var silentCall = '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                            AddValue(configsToUpdate, configIds.ReadProfiles.SilentCallMode, silentCall);\\r\\n                            //configsToAck.push(configIds.ReadSystemSettings.Statusphone);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AllowList);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AutoAnswer);\\r\\n                            configsToAck.push(configIds.ReadProfiles.SilentCallMode);\\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                            var report;\\r\\n                            switch (contactNumber) {\\r\\n                                // Emergency Number\\r\\n                                // [Value]:80 2B 33 34 36 33 35 36 30 37 39 33 30\\r\\n                                //{\\\"number\\\":{\\\"call\\\":0,\\\"noCard\\\":0,\\\"number\\\":\\\"+34635607930\\\",\\\"enable\\\":1,\\\"sms\\\":0,\\\"index\\\":0}}\\r\\n                                case '0':\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.length < 6) { //if no telephone defined\\r\\n                                        tel = '';\\r\\n                                    }\\r\\n                                    report = hex2bin(value.substring(0, 2)); // To find report mode Call &data or DAta only\\r\\n                                    AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                                    AddValue(codeValues, \\\"ReportMode\\\", report.substring(2, 3));\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.ReportMode, report.substring(2, 3));\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.ReportMode);\\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                                    if (tel.length < 6) { //if no telephone defined\\r\\n                                        tel = '';\\r\\n                                    }\\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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 '55': // Tilt Angle Alert\\r\\n                            //[Value]:0A 00 1E 00\\r\\n                            //{\\\"tiltAlert\\\":{\\\"angle\\\":30,\\\"time\\\":10,\\\"status\\\":0,\\\"dial\\\":0}}\\r\\n                            var angle = hexToDecimal(value.substring(4, 6));\\r\\n                            var timeout = hexToDecimal(value.substring(0, 2));\\r\\n                            var status = hexToDecimal(value.substring(6, 8));\\r\\n                            if (status == 0) angle = 0;\\r\\n                            //var alertSetting = angle;\\r\\n                            //imei = serverParams.Imei;\\r\\n                            //messageForReceiver = (`Sentry;ACK-TILTANG;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"tiltangle\\\", angle);\\r\\n                            AddValue(codeValues, \\\"tiltimeout\\\", timeout);\\r\\n                            AddValue(codeValues, \\\"tiltstatus\\\", status);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltTimeout, timeout);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltAngle, angle);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltTimeout);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltAngle);\\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 = (`Sentry;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.ManDownSettings, sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.EnableDisableManDownSettings, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.Sensitivity, sesibityOptionValue);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.EnableDisableManDownSettings);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.Sensitivity);\\r\\n                            break;\\r\\n                        case '57': // Welfare\\r\\n                            // [Value]:10 0E 00 80 58 02 00 80\\r\\n                            //{\\\"welfareAlert\\\":{\\\"time\\\":600,\\\"value\\\":3600,\\\"status\\\":1,\\\"dial\\\":1}}\\r\\n                            var welfareStatus = hex2bin(value.substring(6, 8)); // check status\\r\\n                            var welfareValue = hexToDecimal(changeEndianness(value.substring(0, 6)));\\r\\n                            var welfareTime = hexToDecimal(changeEndianness(value.substring(8, 14)));\\r\\n                            var enalbleDisable = '';\\r\\n                            if ((configs.ReadState.Charging == 'true') && (configs.Welfare.Mode == '1') && (configs.Welfare.EnableDisableWelfare == 'true')) { // Force Read to enable welfare when device is charging in recurrent mode\\r\\n                                var sensibility = 'Enable, '\\r\\n                                enalbleDisable = '1'\\r\\n                            } else {\\r\\n                                if (welfareStatus.substring(0, 1) == '1') {\\r\\n                                    var sensibility = 'Enable, '\\r\\n                                    enalbleDisable = '1'\\r\\n                                } else {\\r\\n                                    var sensibility = 'Disable, '\\r\\n                                    //enalbleDisable = '0'\\r\\n                                }\\r\\n                            };\\r\\n                            //var imei = serverParams.Imei;\\r\\n                            //messageForReceiver = (`Sentry;ACK-WELFALERT;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            sensibility += welfareValue / 60;\\r\\n                            sensibility += ', ' + welfareTime / 60;\\r\\n                            AddValue(codeValues, \\\"welfare\\\", sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.EnableDisableReadWelfare, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Prealarm, welfareTime / 60);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Timeout, welfareValue / 60);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.EnableDisableReadWelfare);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Prealarm);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Timeout);\\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 = (`Sentry;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 '75': // Extra Enable control   Welfare Mode\\r\\n                            //[Value]:80 00 00 10  last two digit for new/old welfare\\r\\n                            //{\\\"extraControl\\\":{\\\"bit29\\\":0,\\\"bit27\\\":0,\\\"bit28\\\":1,\\\"bit25\\\":0,\\\"bit26\\\":0,\\\"flagValue\\\":268435584,\\\"bit23\\\":0,\\\"bit24\\\":0,\\\"bit21\\\":0,\\\"bit22\\\":0,\\\"bit20\\\":0,\\\"bit9\\\":0,\\\"bit18\\\":0,\\\"bit19\\\":0,\\\"bit7\\\":1,\\\"bit16\\\":0,\\\"bit8\\\":0,\\\"bit17\\\":0,\\\"bit5\\\":0,\\\"bit14\\\":0,\\\"bit6\\\":0,\\\"bit15\\\":0,\\\"bit3\\\":0,\\\"bit4\\\":0,\\\"bit1\\\":0,\\\"bit2\\\":0,\\\"bit0\\\":0,\\\"bit12\\\":0,\\\"bit13\\\":0,\\\"bit10\\\":0,\\\"bit11\\\":0,\\\"bit30\\\":0,\\\"bit31\\\":0}}\\r\\n                            var extraStatus = hex2bin(value.substring(6, 7)).substring(7, 8);\\r\\n                            //if (extraStatus.substring(7, 8) == '1') {\\r\\n                            //    extra += ' Enable, '\\r\\n                            //} else {\\r\\n                            //    extra += ' 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, \\\"welfare Mode\\\", extraStatus);\\r\\n                            // messageForReceiver = (`Sentry;ACK-EXTRA;${imei};`);\\r\\n                            // sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Mode, extraStatus);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Mode);\\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 = (`Sentry;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                            var triggerMode = '';\\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                            triggerMode = status.substring(2, 3);\\r\\n                            if (triggerMode == '1') {\\r\\n                                alertSetting += 'Double Press, '\\r\\n                            } else {\\r\\n                                alertSetting += 'Long Press, '\\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 = (`Sentry;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.ReadInterfaceOptions.SpeedActivationDialButton, triggerMode);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n                            configsToAck.push(configIds.ReadInterfaceOptions.SpeedActivationDialButton);\\r\\n                            break;\\r\\n                        case '20': // SOS Button Settings\\r\\n                            // [Length]:03 [Key]:20 [Value]:7B 9E {\\\"sosButton\\\":{\\\"mode\\\":0,\\\"feedBack\\\":3,\\\"task\\\":15,\\\"time\\\":30,\\\"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                            var triggerMode = '';\\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                            triggerMode = status.substring(2, 3);\\r\\n                            if (triggerMode == '1') {\\r\\n                                alertSetting += 'Double Press, '\\r\\n                            } else {\\r\\n                                alertSetting += 'Long Press, '\\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 = (`Sentry;ACK-SPEED;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"sos\\\", alertSetting);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadInterfaceOptions.SOSActivationButton, triggerMode);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            //configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n                            configsToAck.push(configIds.ReadInterfaceOptions.SOSActivationButton);\\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 = (`Sentry-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 = (`Sentry-${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 = (`Sentry-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 = (`Sentry-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 = (`Sentry-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":1776190645},{"Type":1,"NewValue":"{\"Id\":362,\"Name\":\"Access PS Sentry\",\"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    // Sentry protocol - please see variables and typical values in order below\\r\\n    // Sentry-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    // Sentry-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 N.\\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', 'Sentry');\\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 = (`Sentry-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        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        /*        // Check if total lenght of the complete message is higher than total lenght of the first message\\r\\n        // to know if the message includes more than one\\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 longitud = message.length - 16;\\r\\n        // Loop to decode multi msg, includes \\\"AB\\\" more than one time\\r\\n        //const matches = message.match(/AB/g);\\r\\n        //if (matches && matches.length > 1) {\\r\\n        if (total_length != longitud) { //if true then the msg contains more than one msg (possible bug of the device)\\r\\n            const multiack = message.split('AB');\\r\\n            for (let i = 1; i < multiack.length; i++) {\\r\\n                message = 'AB' + multiack[i];\\r\\n                debug(message);\\r\\n                decoder(message);\\r\\n            }\\r\\n        } else decoder(message); // it contains only one msg\\r\\nif (message.includes('AB00030008C7')) {// IF multiACK\\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); */\\r\\n    } else if (oystaTemplate == 'True') { // Oysta Template \\r\\n        // first decoding data of Oysta templates\\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 'BATCN': // Battery Charging - On\\r\\n                AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                configsToAck.push(configIds.ReadState.Charging);\\r\\n                //configs.AlertSettings.Welfare.Mode\\r\\n                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'false');\\r\\n                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'true');\\r\\n                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'false');\\r\\n                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                }\\r\\n                break;\\r\\n            case 'BATCF': // Battery Charging - Off\\r\\n                AddValue(configsToUpdate, configIds.ReadState.Charging, 'false');\\r\\n                configsToAck.push(configIds.ReadState.Charging);\\r\\n                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'true');\\r\\n                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'false');\\r\\n                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'true');\\r\\n                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                }\\r\\n                break;\\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 Sentry-')) {\\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 = (`Sentry-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 = (`Sentry;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 = (`Sentry;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 = (`Sentry-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    // 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    // decoder global template function\\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                                // no 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  ¿qué es fall OFF?\\r\\n                            if ((alarmCodeExtInt & 1) == 1) {\\r\\n                                var alarm = 'ALF-C'; // Fall-DownAlertending\\r\\n                            }\\r\\n                            // Welfare Check-out\\r\\n                            else if ((alarmCodeExtInt & 2) == 2) {\\r\\n                                //var alarm = 'WSTP';\\r\\n                                if (configs.Welfare !== undefined) {\\r\\n                                    if (configs.Welfare.Mode == '1') {\\r\\n                                        //info = 'Recurrent';\\r\\n                                        var alarm = 'WSTP';\\r\\n                                    } else {\\r\\n                                        //info = 'Amber';\\r\\n                                        var alarm = 'ALA-C';\\r\\n                                    }\\r\\n                                }\\r\\n                            }\\r\\n                            //Geo 5 in\\r\\n                            //else if ((alarmCodeInt & 16) == 16) {\\r\\n                            //    var alarm = 'BATL';\\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 Alert\\r\\n                            else if ((alarmCodeInt & 8) == 8) {\\r\\n                                var alarm = 'TLT';\\r\\n                            }\\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 Alert\\r\\n                            else if ((alarmCodeInt & 256) == 256) {\\r\\n                                var alarm = 'PWRF';\\r\\n                            }\\r\\n                            //Power On Alert\\r\\n                            else if ((alarmCodeInt & 512) == 512) {\\r\\n                                var alarm = 'PWRN';\\r\\n                            }\\r\\n                            //Motion Alert\\r\\n                            else if ((alarmCodeInt & 1024) == 1024) {\\r\\n                                var alarm = 'ALMOV';\\r\\n                            }\\r\\n                            //No Motion Alert\\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                            }\\r\\n                            // Side call button 1\\r\\n                            else if ((alarmCodeInt & 8192) == 8192) {\\r\\n                                var alarm = 'Side1';\\r\\n                            }\\r\\n                            // Side call button 2\\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                                /*AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                                configsToAck.push(configIds.ReadState.Charging);\\r\\n                                //configs.AlertSettings.Welfare.Mode\\r\\n                                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'false');\\r\\n                                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'true');\\r\\n                                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'false');\\r\\n                                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                                }*/\\r\\n                            }\\r\\n                            //Battery no charging\\r\\n                            else if ((alarmCodeInt & 65536) == 65536) {\\r\\n                                var alarm = 'BATCF';\\r\\n                                /* AddValue(configsToUpdate, configIds.ReadState.Charging, 'false');\\r\\n                                 configsToAck.push(configIds.ReadState.Charging);\\r\\n                                 if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                                     AddValue(configsToUpdate, configIds.ReadState.Welfare, 'true');\\r\\n                                     //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'false');\\r\\n                                     AddConfig(configsToSend, configIds.ReadState.Welfare, 'true');\\r\\n                                     configsToAck.push(configIds.ReadState.Welfare);\\r\\n                                 }*/\\r\\n                            }\\r\\n                            //Alert End\\r\\n                            else if ((alarmCodeInt & 131072) == 131072) {\\r\\n                                var alarm = 'ALA-F';\\r\\n                                info = 'Alarm Finished';\\r\\n                                //if (configs.Welfare !== undefined) {\\r\\n                                //    if (configs.Welfare.Mode == '1') {\\r\\n                                //        info = 'Recurrent';\\r\\n                                //    } else info = 'Amber';\\r\\n                                //}\\r\\n                            }\\r\\n                            //Amber Alert ON    Don`t know the dfference between ALA and ALA-O\\r\\n                            else if ((alarmCodeInt & 262144) == 262144) {\\r\\n                                var alarm = 'ALA';\\r\\n                            }\\r\\n                            // welfare check in  and amber alert ON\\r\\n                            else if ((alarmCodeInt & 524288) == 524288) {\\r\\n                                //var alarm = 'WTS';\\r\\n                                if (configs.Welfare !== undefined) {\\r\\n                                    if (configs.Welfare.Mode == '1') {\\r\\n                                        //info = 'Recurrent';\\r\\n                                        var alarm = 'WTS';\\r\\n                                    } else {\\r\\n                                        //info = 'Amber';\\r\\n                                        var alarm = 'ALA-O';\\r\\n                                    }\\r\\n                                }\\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\\r\\n                            else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n                                //var alarm = 'ALA-W';\\r\\n                                if (configs.Welfare !== undefined) {\\r\\n                                    if (configs.Welfare.Mode == '1') {\\r\\n                                        var alarm = 'ALA-W';\\r\\n                                        //info = 'Recurrent';\\r\\n                                    } else {\\r\\n                                        //info = 'Amber';\\r\\n                                        var alarm = 'ALA';\\r\\n                                    }\\r\\n                                }\\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                            //update customID to check if belongs to this type of device\\r\\n                            customID = value;\\r\\n                            if (value != '64') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\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                                    //no 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 != '64') {\\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 = (`Sentry-${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 = (`Sentry-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                            if ((statusInt & 16) == 16) {\\r\\n                                statusDevice += 'Charging,';\\r\\n                                // AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                                // configsToAck.push(configIds.ReadState.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 location: ' + lbs_data;\\r\\n                            break;\\r\\n                        case '30':\\r\\n                            //G-sensor. \\r\\n                            if (customID != '64') {\\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 = (`Sentry-${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 != '64') {\\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 = (`Sentry-${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                //  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 = (`Sentry-${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 = (`Sentry-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, quizas meter dentro del if (alarmcode)\\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 = (`Sentry;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 = (`Sentry;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                            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': // Incoming call Ringtone Volume\\r\\n                            var volume = hexToDecimal(value);\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Sentry;ACK-VOL;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"Ringtone\\\", volume);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.IncomingCallRingtoneVolume, volume);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.IncomingCallRingtoneVolume);\\r\\n                            break;\\r\\n                        case '12': // Speaker Volume\\r\\n                            var volume = hexToDecimal(value);\\r\\n                            AddValue(codeValues, \\\"Speaker\\\", volume);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.InCallSpeakerVolume, volume);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.InCallSpeakerVolume);\\r\\n                            break;\\r\\n                        case '1C': // Notifications and Alerts Volume\\r\\n                            var volume = hexToDecimal(value);\\r\\n                            AddValue(codeValues, \\\"Notifications\\\", volume);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.NotificationsandAlerts, volume);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.NotificationsandAlerts);\\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 = (`Sentry;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 = (`Sentry;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                                var allow = 'true';\\r\\n                            } else var allow = 'false';\\r\\n                            // To find LT setup\\r\\n                            if (statusPhone.substring(5, 6) == '1') { // 1 Enable\\r\\n                                var silentCall = 'true';\\r\\n                            } else var silentCall = '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                            AddValue(configsToUpdate, configIds.ReadProfiles.SilentCallMode, silentCall);\\r\\n                            //configsToAck.push(configIds.ReadSystemSettings.Statusphone);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AllowList);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AutoAnswer);\\r\\n                            configsToAck.push(configIds.ReadProfiles.SilentCallMode);\\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                            var report;\\r\\n                            switch (contactNumber) {\\r\\n                                // Emergency Number\\r\\n                                // [Value]:80 2B 33 34 36 33 35 36 30 37 39 33 30\\r\\n                                //{\\\"number\\\":{\\\"call\\\":0,\\\"noCard\\\":0,\\\"number\\\":\\\"+34635607930\\\",\\\"enable\\\":1,\\\"sms\\\":0,\\\"index\\\":0}}\\r\\n                                case '0':\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.length < 6) { //if no telephone defined\\r\\n                                        tel = '';\\r\\n                                    }\\r\\n                                    report = hex2bin(value.substring(0, 2)); // To find report mode Call &data or DAta only\\r\\n                                    AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                                    AddValue(codeValues, \\\"ReportMode\\\", report.substring(2, 3));\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.ReportMode, report.substring(2, 3));\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.ReportMode);\\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                                    if (tel.length < 6) { //if no telephone defined\\r\\n                                        tel = '';\\r\\n                                    }\\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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 '55': // Tilt Angle Alert\\r\\n                            //[Value]:0A 00 1E 00\\r\\n                            //{\\\"tiltAlert\\\":{\\\"angle\\\":30,\\\"time\\\":10,\\\"status\\\":0,\\\"dial\\\":0}}\\r\\n                            var angle = hexToDecimal(value.substring(4, 6));\\r\\n                            var timeout = hexToDecimal(value.substring(0, 2));\\r\\n                            var status = hexToDecimal(value.substring(6, 8));\\r\\n                            if (status == 0) angle = 0;\\r\\n                            //var alertSetting = angle;\\r\\n                            //imei = serverParams.Imei;\\r\\n                            //messageForReceiver = (`Sentry;ACK-TILTANG;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"tiltangle\\\", angle);\\r\\n                            AddValue(codeValues, \\\"tiltimeout\\\", timeout);\\r\\n                            AddValue(codeValues, \\\"tiltstatus\\\", status);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltTimeout, timeout);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltAngle, angle);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltTimeout);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltAngle);\\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 = (`Sentry;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.ManDownSettings, sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.EnableDisableManDownSettings, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.Sensitivity, sesibityOptionValue);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.EnableDisableManDownSettings);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.Sensitivity);\\r\\n                            break;\\r\\n                        case '57': // Welfare\\r\\n                            // [Value]:10 0E 00 80 58 02 00 80\\r\\n                            //{\\\"welfareAlert\\\":{\\\"time\\\":600,\\\"value\\\":3600,\\\"status\\\":1,\\\"dial\\\":1}}\\r\\n                            var welfareStatus = hex2bin(value.substring(6, 8)); // check status\\r\\n                            var welfareValue = hexToDecimal(changeEndianness(value.substring(0, 6)));\\r\\n                            var welfareTime = hexToDecimal(changeEndianness(value.substring(8, 14)));\\r\\n                            var enalbleDisable = '';\\r\\n                            if ((configs.ReadState.Charging == 'true') && (configs.Welfare.Mode == '1') && (configs.Welfare.EnableDisableWelfare == 'true')) { // Force Read to enable welfare when device is charging in recurrent mode\\r\\n                                var sensibility = 'Enable, '\\r\\n                                enalbleDisable = '1'\\r\\n                            } else {\\r\\n                                if (welfareStatus.substring(0, 1) == '1') {\\r\\n                                    var sensibility = 'Enable, '\\r\\n                                    enalbleDisable = '1'\\r\\n                                } else {\\r\\n                                    var sensibility = 'Disable, '\\r\\n                                    //enalbleDisable = '0'\\r\\n                                }\\r\\n                            };\\r\\n                            //var imei = serverParams.Imei;\\r\\n                            //messageForReceiver = (`Sentry;ACK-WELFALERT;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            sensibility += welfareValue / 60;\\r\\n                            sensibility += ', ' + welfareTime / 60;\\r\\n                            AddValue(codeValues, \\\"welfare\\\", sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.EnableDisableReadWelfare, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Prealarm, welfareTime / 60);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Timeout, welfareValue / 60);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.EnableDisableReadWelfare);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Prealarm);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Timeout);\\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 = (`Sentry;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 '75': // Extra Enable control   Welfare Mode\\r\\n                            //[Value]:80 00 00 10  last two digit for new/old welfare\\r\\n                            //{\\\"extraControl\\\":{\\\"bit29\\\":0,\\\"bit27\\\":0,\\\"bit28\\\":1,\\\"bit25\\\":0,\\\"bit26\\\":0,\\\"flagValue\\\":268435584,\\\"bit23\\\":0,\\\"bit24\\\":0,\\\"bit21\\\":0,\\\"bit22\\\":0,\\\"bit20\\\":0,\\\"bit9\\\":0,\\\"bit18\\\":0,\\\"bit19\\\":0,\\\"bit7\\\":1,\\\"bit16\\\":0,\\\"bit8\\\":0,\\\"bit17\\\":0,\\\"bit5\\\":0,\\\"bit14\\\":0,\\\"bit6\\\":0,\\\"bit15\\\":0,\\\"bit3\\\":0,\\\"bit4\\\":0,\\\"bit1\\\":0,\\\"bit2\\\":0,\\\"bit0\\\":0,\\\"bit12\\\":0,\\\"bit13\\\":0,\\\"bit10\\\":0,\\\"bit11\\\":0,\\\"bit30\\\":0,\\\"bit31\\\":0}}\\r\\n                            var extraStatus = hex2bin(value.substring(6, 7)).substring(7, 8);\\r\\n                            //if (extraStatus.substring(7, 8) == '1') {\\r\\n                            //    extra += ' Enable, '\\r\\n                            //} else {\\r\\n                            //    extra += ' 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, \\\"welfare Mode\\\", extraStatus);\\r\\n                            // messageForReceiver = (`Sentry;ACK-EXTRA;${imei};`);\\r\\n                            // sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Mode, extraStatus);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Mode);\\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 = (`Sentry;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                            var triggerMode = '';\\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                            triggerMode = status.substring(2, 3);\\r\\n                            if (triggerMode == '1') {\\r\\n                                alertSetting += 'Double Press, '\\r\\n                            } else {\\r\\n                                alertSetting += 'Long Press, '\\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 = (`Sentry;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.ReadInterfaceOptions.SpeedActivationDialButton, triggerMode);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n                            configsToAck.push(configIds.ReadInterfaceOptions.SpeedActivationDialButton);\\r\\n                            break;\\r\\n                        case '20': // SOS Button Settings\\r\\n                            // [Length]:03 [Key]:20 [Value]:7B 9E {\\\"sosButton\\\":{\\\"mode\\\":0,\\\"feedBack\\\":3,\\\"task\\\":15,\\\"time\\\":30,\\\"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                            var triggerMode = '';\\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                            triggerMode = status.substring(2, 3);\\r\\n                            if (triggerMode == '1') {\\r\\n                                alertSetting += 'Double Press, '\\r\\n                            } else {\\r\\n                                alertSetting += 'Long Press, '\\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 = (`Sentry;ACK-SPEED;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"sos\\\", alertSetting);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadInterfaceOptions.SOSActivationButton, triggerMode);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            //configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n                            configsToAck.push(configIds.ReadInterfaceOptions.SOSActivationButton);\\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 = (`Sentry-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 = (`Sentry-${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 = (`Sentry-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 = (`Sentry-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 = (`Sentry-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 = '5678'; // 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":1777307077},{"Type":1,"NewValue":"{\"Id\":362,\"Name\":\"Access PS Sentry\",\"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    // Sentry protocol - please see variables and typical values in order below\\r\\n    // Sentry-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    // Sentry-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 N.\\r\\n    // Created: 01/01/2025\\r\\n    // Last modified: 03/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', 'Sentry');\\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 = (`Sentry-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        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        /*        // Check if total lenght of the complete message is higher than total lenght of the first message\\r\\n        // to know if the message includes more than one\\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 longitud = message.length - 16;\\r\\n        // Loop to decode multi msg, includes \\\"AB\\\" more than one time\\r\\n        //const matches = message.match(/AB/g);\\r\\n        //if (matches && matches.length > 1) {\\r\\n        if (total_length != longitud) { //if true then the msg contains more than one msg (possible bug of the device)\\r\\n            const multiack = message.split('AB');\\r\\n            for (let i = 1; i < multiack.length; i++) {\\r\\n                message = 'AB' + multiack[i];\\r\\n                debug(message);\\r\\n                decoder(message);\\r\\n            }\\r\\n        } else decoder(message); // it contains only one msg\\r\\nif (message.includes('AB00030008C7')) {// IF multiACK\\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); */\\r\\n    } else if (oystaTemplate == 'True') { // Oysta Template \\r\\n        // first decoding data of Oysta templates\\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 'BATCN': // Battery Charging - On\\r\\n                AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                configsToAck.push(configIds.ReadState.Charging);\\r\\n                //configs.AlertSettings.Welfare.Mode\\r\\n                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'false');\\r\\n                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'true');\\r\\n                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'false');\\r\\n                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                }\\r\\n                break;\\r\\n            case 'BATCF': // Battery Charging - Off\\r\\n                AddValue(configsToUpdate, configIds.ReadState.Charging, 'false');\\r\\n                configsToAck.push(configIds.ReadState.Charging);\\r\\n                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'true');\\r\\n                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'false');\\r\\n                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'true');\\r\\n                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                }\\r\\n                break;\\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 Sentry-')) {\\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 = (`Sentry-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 = (`Sentry;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 = (`Sentry;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 = (`Sentry-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    // 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    // decoder global template function\\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                                // no 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  ¿qué es fall OFF?\\r\\n                            if ((alarmCodeExtInt & 1) == 1) {\\r\\n                                var alarm = 'ALF-C'; // Fall-DownAlertending\\r\\n                            }\\r\\n                            // Welfare Check-out\\r\\n                            else if ((alarmCodeExtInt & 2) == 2) {\\r\\n                                //var alarm = 'WSTP';\\r\\n                                if (configs.Welfare !== undefined) {\\r\\n                                    if (configs.Welfare.Mode == '1') {\\r\\n                                        //info = 'Recurrent';\\r\\n                                        var alarm = 'WSTP';\\r\\n                                    } else {\\r\\n                                        //info = 'Amber';\\r\\n                                        var alarm = 'ALA-C';\\r\\n                                    }\\r\\n                                }\\r\\n                            }\\r\\n                            //Geo 5 in\\r\\n                            //else if ((alarmCodeInt & 16) == 16) {\\r\\n                            //    var alarm = 'BATL';\\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 Alert\\r\\n                            else if ((alarmCodeInt & 8) == 8) {\\r\\n                                var alarm = 'TLT';\\r\\n                            }\\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 Alert\\r\\n                            else if ((alarmCodeInt & 256) == 256) {\\r\\n                                var alarm = 'PWRF';\\r\\n                            }\\r\\n                            //Power On Alert\\r\\n                            else if ((alarmCodeInt & 512) == 512) {\\r\\n                                var alarm = 'PWRN';\\r\\n                            }\\r\\n                            //Motion Alert\\r\\n                            else if ((alarmCodeInt & 1024) == 1024) {\\r\\n                                var alarm = 'ALMOV';\\r\\n                            }\\r\\n                            //No Motion Alert\\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                            }\\r\\n                            // Side call button 1\\r\\n                            else if ((alarmCodeInt & 8192) == 8192) {\\r\\n                                var alarm = 'Side1';\\r\\n                            }\\r\\n                            // Side call button 2\\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                                /*AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                                configsToAck.push(configIds.ReadState.Charging);\\r\\n                                //configs.AlertSettings.Welfare.Mode\\r\\n                                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'false');\\r\\n                                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'true');\\r\\n                                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'false');\\r\\n                                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                                }*/\\r\\n                            }\\r\\n                            //Battery no charging\\r\\n                            else if ((alarmCodeInt & 65536) == 65536) {\\r\\n                                var alarm = 'BATCF';\\r\\n                                /* AddValue(configsToUpdate, configIds.ReadState.Charging, 'false');\\r\\n                                 configsToAck.push(configIds.ReadState.Charging);\\r\\n                                 if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                                     AddValue(configsToUpdate, configIds.ReadState.Welfare, 'true');\\r\\n                                     //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'false');\\r\\n                                     AddConfig(configsToSend, configIds.ReadState.Welfare, 'true');\\r\\n                                     configsToAck.push(configIds.ReadState.Welfare);\\r\\n                                 }*/\\r\\n                            }\\r\\n                            //Alert End\\r\\n                            else if ((alarmCodeInt & 131072) == 131072) {\\r\\n                                var alarm = 'ALA-F';\\r\\n                                info = 'Alarm Finished';\\r\\n                                //if (configs.Welfare !== undefined) {\\r\\n                                //    if (configs.Welfare.Mode == '1') {\\r\\n                                //        info = 'Recurrent';\\r\\n                                //    } else info = 'Amber';\\r\\n                                //}\\r\\n                            }\\r\\n                            //Amber Alert ON    Don`t know the dfference between ALA and ALA-O\\r\\n                            else if ((alarmCodeInt & 262144) == 262144) {\\r\\n                                var alarm = 'ALA';\\r\\n                            }\\r\\n                            // welfare check in  and amber alert ON\\r\\n                            else if ((alarmCodeInt & 524288) == 524288) {\\r\\n                                //var alarm = 'WTS';\\r\\n                                if (configs.Welfare !== undefined) {\\r\\n                                    if (configs.Welfare.Mode == '1') {\\r\\n                                        //info = 'Recurrent';\\r\\n                                        var alarm = 'WTS';\\r\\n                                    } else {\\r\\n                                        //info = 'Amber';\\r\\n                                        var alarm = 'ALA-O';\\r\\n                                    }\\r\\n                                }\\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\\r\\n                            else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n                                //var alarm = 'ALA-W';\\r\\n                                if (configs.Welfare !== undefined) {\\r\\n                                    if (configs.Welfare.Mode == '1') {\\r\\n                                        var alarm = 'ALA-W';\\r\\n                                        //info = 'Recurrent';\\r\\n                                    } else {\\r\\n                                        //info = 'Amber';\\r\\n                                        var alarm = 'ALA';\\r\\n                                    }\\r\\n                                }\\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                            //update customID to check if belongs to this type of device\\r\\n                            customID = value;\\r\\n                            if (value != '64') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\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                                    //no 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 != '64') {\\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 = (`Sentry-${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 = (`Sentry-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                            if ((statusInt & 16) == 16) {\\r\\n                                statusDevice += 'Charging,';\\r\\n                                // AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                                // configsToAck.push(configIds.ReadState.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 location: ' + lbs_data;\\r\\n                            break;\\r\\n                        case '30':\\r\\n                            //G-sensor. \\r\\n                            if (customID != '64') {\\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 = (`Sentry-${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 != '64') {\\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 = (`Sentry-${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                //  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 = (`Sentry-${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 = (`Sentry-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, quizas meter dentro del if (alarmcode)\\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 = (`Sentry;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 = (`Sentry;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                            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': // Incoming call Ringtone Volume\\r\\n                            var volume = hexToDecimal(value);\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Sentry;ACK-VOL;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"Ringtone\\\", volume);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.IncomingCallRingtoneVolume, volume);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.IncomingCallRingtoneVolume);\\r\\n                            break;\\r\\n                        case '12': // Speaker Volume\\r\\n                            var volume = hexToDecimal(value);\\r\\n                            AddValue(codeValues, \\\"Speaker\\\", volume);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.InCallSpeakerVolume, volume);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.InCallSpeakerVolume);\\r\\n                            break;\\r\\n                        case '1C': // Notifications and Alerts Volume\\r\\n                            var volume = hexToDecimal(value);\\r\\n                            AddValue(codeValues, \\\"Notifications\\\", volume);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.NotificationsandAlerts, volume);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.NotificationsandAlerts);\\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 = (`Sentry;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 = (`Sentry;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                                var allow = 'true';\\r\\n                            } else var allow = 'false';\\r\\n                            // To find LT setup\\r\\n                            if (statusPhone.substring(5, 6) == '1') { // 1 Enable\\r\\n                                var silentCall = 'true';\\r\\n                            } else var silentCall = '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                            AddValue(configsToUpdate, configIds.ReadProfiles.SilentCallMode, silentCall);\\r\\n                            //configsToAck.push(configIds.ReadSystemSettings.Statusphone);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AllowList);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AutoAnswer);\\r\\n                            configsToAck.push(configIds.ReadProfiles.SilentCallMode);\\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                            var report;\\r\\n                            switch (contactNumber) {\\r\\n                                // Emergency Number\\r\\n                                // [Value]:80 2B 33 34 36 33 35 36 30 37 39 33 30\\r\\n                                //{\\\"number\\\":{\\\"call\\\":0,\\\"noCard\\\":0,\\\"number\\\":\\\"+34635607930\\\",\\\"enable\\\":1,\\\"sms\\\":0,\\\"index\\\":0}}\\r\\n                                case '0':\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.length < 6) { //if no telephone defined\\r\\n                                        tel = '';\\r\\n                                    }\\r\\n                                    report = hex2bin(value.substring(0, 2)); // To find report mode Call &data or DAta only\\r\\n                                    AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                                    AddValue(codeValues, \\\"ReportMode\\\", report.substring(2, 3));\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.ReportMode, report.substring(2, 3));\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.ReportMode);\\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                                    if (tel.length < 6) { //if no telephone defined\\r\\n                                        tel = '';\\r\\n                                    }\\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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 '55': // Tilt Angle Alert\\r\\n                            //[Value]:0A 00 1E 00\\r\\n                            //{\\\"tiltAlert\\\":{\\\"angle\\\":30,\\\"time\\\":10,\\\"status\\\":0,\\\"dial\\\":0}}\\r\\n                            var angle = hexToDecimal(value.substring(4, 6));\\r\\n                            var timeout = hexToDecimal(value.substring(0, 2));\\r\\n                            var status = hexToDecimal(value.substring(6, 8));\\r\\n                            if (status == 0) angle = 0;\\r\\n                            //var alertSetting = angle;\\r\\n                            //imei = serverParams.Imei;\\r\\n                            //messageForReceiver = (`Sentry;ACK-TILTANG;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"tiltangle\\\", angle);\\r\\n                            AddValue(codeValues, \\\"tiltimeout\\\", timeout);\\r\\n                            AddValue(codeValues, \\\"tiltstatus\\\", status);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltTimeout, timeout);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltAngle, angle);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltTimeout);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltAngle);\\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 = (`Sentry;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.ManDownSettings, sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.EnableDisableManDownSettings, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.Sensitivity, sesibityOptionValue);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.EnableDisableManDownSettings);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.Sensitivity);\\r\\n                            break;\\r\\n                        case '57': // Welfare\\r\\n                            // [Value]:10 0E 00 80 58 02 00 80\\r\\n                            //{\\\"welfareAlert\\\":{\\\"time\\\":600,\\\"value\\\":3600,\\\"status\\\":1,\\\"dial\\\":1}}\\r\\n                            var welfareStatus = hex2bin(value.substring(6, 8)); // check status\\r\\n                            var welfareValue = hexToDecimal(changeEndianness(value.substring(0, 6)));\\r\\n                            var welfareTime = hexToDecimal(changeEndianness(value.substring(8, 14)));\\r\\n                            var enalbleDisable = '';\\r\\n                            if ((configs.ReadState.Charging == 'true') && (configs.Welfare.Mode == '1') && (configs.Welfare.EnableDisableWelfare == 'true')) { // Force Read to enable welfare when device is charging in recurrent mode\\r\\n                                var sensibility = 'Enable, '\\r\\n                                enalbleDisable = '1'\\r\\n                            } else {\\r\\n                                if (welfareStatus.substring(0, 1) == '1') {\\r\\n                                    var sensibility = 'Enable, '\\r\\n                                    enalbleDisable = '1'\\r\\n                                } else {\\r\\n                                    var sensibility = 'Disable, '\\r\\n                                    //enalbleDisable = '0'\\r\\n                                }\\r\\n                            };\\r\\n                            //var imei = serverParams.Imei;\\r\\n                            //messageForReceiver = (`Sentry;ACK-WELFALERT;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            sensibility += welfareValue / 60;\\r\\n                            sensibility += ', ' + welfareTime / 60;\\r\\n                            AddValue(codeValues, \\\"welfare\\\", sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.EnableDisableReadWelfare, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Prealarm, welfareTime / 60);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Timeout, welfareValue / 60);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.EnableDisableReadWelfare);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Prealarm);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Timeout);\\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 = (`Sentry;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 '75': // Extra Enable control   Welfare Mode\\r\\n                            //[Value]:80 00 00 10  last two digit for new/old welfare\\r\\n                            //{\\\"extraControl\\\":{\\\"bit29\\\":0,\\\"bit27\\\":0,\\\"bit28\\\":1,\\\"bit25\\\":0,\\\"bit26\\\":0,\\\"flagValue\\\":268435584,\\\"bit23\\\":0,\\\"bit24\\\":0,\\\"bit21\\\":0,\\\"bit22\\\":0,\\\"bit20\\\":0,\\\"bit9\\\":0,\\\"bit18\\\":0,\\\"bit19\\\":0,\\\"bit7\\\":1,\\\"bit16\\\":0,\\\"bit8\\\":0,\\\"bit17\\\":0,\\\"bit5\\\":0,\\\"bit14\\\":0,\\\"bit6\\\":0,\\\"bit15\\\":0,\\\"bit3\\\":0,\\\"bit4\\\":0,\\\"bit1\\\":0,\\\"bit2\\\":0,\\\"bit0\\\":0,\\\"bit12\\\":0,\\\"bit13\\\":0,\\\"bit10\\\":0,\\\"bit11\\\":0,\\\"bit30\\\":0,\\\"bit31\\\":0}}\\r\\n                            var extraStatus = hex2bin(value.substring(6, 7)).substring(7, 8);\\r\\n                            //if (extraStatus.substring(7, 8) == '1') {\\r\\n                            //    extra += ' Enable, '\\r\\n                            //} else {\\r\\n                            //    extra += ' 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, \\\"welfare Mode\\\", extraStatus);\\r\\n                            // messageForReceiver = (`Sentry;ACK-EXTRA;${imei};`);\\r\\n                            // sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Mode, extraStatus);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Mode);\\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 = (`Sentry;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                            var triggerMode = '';\\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                            triggerMode = status.substring(2, 3);\\r\\n                            if (triggerMode == '1') {\\r\\n                                alertSetting += 'Double Press, '\\r\\n                            } else {\\r\\n                                alertSetting += 'Long Press, '\\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 = (`Sentry;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.ReadInterfaceOptions.SpeedActivationDialButton, triggerMode);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n                            configsToAck.push(configIds.ReadInterfaceOptions.SpeedActivationDialButton);\\r\\n                            break;\\r\\n                        case '20': // SOS Button Settings\\r\\n                            // [Length]:03 [Key]:20 [Value]:7B 9E {\\\"sosButton\\\":{\\\"mode\\\":0,\\\"feedBack\\\":3,\\\"task\\\":15,\\\"time\\\":30,\\\"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                            var triggerMode = '';\\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                            triggerMode = status.substring(2, 3);\\r\\n                            if (triggerMode == '1') {\\r\\n                                alertSetting += 'Double Press, '\\r\\n                            } else {\\r\\n                                alertSetting += 'Long Press, '\\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 = (`Sentry;ACK-SPEED;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"sos\\\", alertSetting);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadInterfaceOptions.SOSActivationButton, triggerMode);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            //configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n                            configsToAck.push(configIds.ReadInterfaceOptions.SOSActivationButton);\\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 = (`Sentry-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 = (`Sentry-${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 = (`Sentry-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 = (`Sentry-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 = (`Sentry-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 = (`Sentry-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                }\\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":1780505441},{"Type":1,"NewValue":"{\"Id\":362,\"Name\":\"Access PS Sentry\",\"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    // Sentry protocol - please see variables and typical values in order below\\r\\n    // Sentry-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    // Sentry-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 N.\\r\\n    // Created: 01/01/2025\\r\\n    // Last modified: 03/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', 'Sentry');\\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 = (`Sentry-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        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        /*        // Check if total lenght of the complete message is higher than total lenght of the first message\\r\\n        // to know if the message includes more than one\\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 longitud = message.length - 16;\\r\\n        // Loop to decode multi msg, includes \\\"AB\\\" more than one time\\r\\n        //const matches = message.match(/AB/g);\\r\\n        //if (matches && matches.length > 1) {\\r\\n        if (total_length != longitud) { //if true then the msg contains more than one msg (possible bug of the device)\\r\\n            const multiack = message.split('AB');\\r\\n            for (let i = 1; i < multiack.length; i++) {\\r\\n                message = 'AB' + multiack[i];\\r\\n                debug(message);\\r\\n                decoder(message);\\r\\n            }\\r\\n        } else decoder(message); // it contains only one msg\\r\\nif (message.includes('AB00030008C7')) {// IF multiACK\\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); */\\r\\n    } else if (oystaTemplate == 'True') { // Oysta Template \\r\\n        // first decoding data of Oysta templates\\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 'BATCN': // Battery Charging - On\\r\\n                AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                configsToAck.push(configIds.ReadState.Charging);\\r\\n                //configs.AlertSettings.Welfare.Mode\\r\\n                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'false');\\r\\n                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'true');\\r\\n                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'false');\\r\\n                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                }\\r\\n                break;\\r\\n            case 'BATCF': // Battery Charging - Off\\r\\n                AddValue(configsToUpdate, configIds.ReadState.Charging, 'false');\\r\\n                configsToAck.push(configIds.ReadState.Charging);\\r\\n                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'true');\\r\\n                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'false');\\r\\n                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'true');\\r\\n                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                }\\r\\n                break;\\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 Sentry-')) {\\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 = (`Sentry-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 = (`Sentry;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 = (`Sentry;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 = (`Sentry-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    // 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    // decoder global template function\\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                                // no 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  ¿qué es fall OFF?\\r\\n                            if ((alarmCodeExtInt & 1) == 1) {\\r\\n                                var alarm = 'ALF-C'; // Fall-DownAlertending\\r\\n                            }\\r\\n                            // Welfare Check-out\\r\\n                            else if ((alarmCodeExtInt & 2) == 2) {\\r\\n                                //var alarm = 'WSTP';\\r\\n                                if (configs.Welfare !== undefined) {\\r\\n                                    if (configs.Welfare.Mode == '1') {\\r\\n                                        //info = 'Recurrent';\\r\\n                                        var alarm = 'WSTP';\\r\\n                                    } else {\\r\\n                                        //info = 'Amber';\\r\\n                                        var alarm = 'ALA-C';\\r\\n                                    }\\r\\n                                }\\r\\n                            }\\r\\n                            //Geo 5 in\\r\\n                            //else if ((alarmCodeInt & 16) == 16) {\\r\\n                            //    var alarm = 'BATL';\\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 Alert\\r\\n                            else if ((alarmCodeInt & 8) == 8) {\\r\\n                                var alarm = 'TLT';\\r\\n                            }\\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 Alert\\r\\n                            else if ((alarmCodeInt & 256) == 256) {\\r\\n                                var alarm = 'PWRF';\\r\\n                            }\\r\\n                            //Power On Alert\\r\\n                            else if ((alarmCodeInt & 512) == 512) {\\r\\n                                var alarm = 'PWRN';\\r\\n                            }\\r\\n                            //Motion Alert\\r\\n                            else if ((alarmCodeInt & 1024) == 1024) {\\r\\n                                var alarm = 'ALMOV';\\r\\n                            }\\r\\n                            //No Motion Alert\\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                            }\\r\\n                            // Side call button 1\\r\\n                            else if ((alarmCodeInt & 8192) == 8192) {\\r\\n                                var alarm = 'Side1';\\r\\n                            }\\r\\n                            // Side call button 2\\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                                /*AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                                configsToAck.push(configIds.ReadState.Charging);\\r\\n                                //configs.AlertSettings.Welfare.Mode\\r\\n                                if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                                    AddValue(configsToUpdate, configIds.ReadState.Welfare, 'false');\\r\\n                                    //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'true');\\r\\n                                    AddConfig(configsToSend, configIds.ReadState.Welfare, 'false');\\r\\n                                    configsToAck.push(configIds.ReadState.Welfare);\\r\\n                                }*/\\r\\n                            }\\r\\n                            //Battery no charging\\r\\n                            else if ((alarmCodeInt & 65536) == 65536) {\\r\\n                                var alarm = 'BATCF';\\r\\n                                /* AddValue(configsToUpdate, configIds.ReadState.Charging, 'false');\\r\\n                                 configsToAck.push(configIds.ReadState.Charging);\\r\\n                                 if ((configs.Welfare.EnableDisableWelfare == 'true') && (configs.Welfare.Mode == '1')) {\\r\\n                                     AddValue(configsToUpdate, configIds.ReadState.Welfare, 'true');\\r\\n                                     //AddConfig(configsToSend, configIds.Welfare.EnableDisableWelfare, 'false');\\r\\n                                     AddConfig(configsToSend, configIds.ReadState.Welfare, 'true');\\r\\n                                     configsToAck.push(configIds.ReadState.Welfare);\\r\\n                                 }*/\\r\\n                            }\\r\\n                            //Alert End\\r\\n                            else if ((alarmCodeInt & 131072) == 131072) {\\r\\n                                var alarm = 'ALA-F';\\r\\n                                info = 'Alarm Finished';\\r\\n                                //if (configs.Welfare !== undefined) {\\r\\n                                //    if (configs.Welfare.Mode == '1') {\\r\\n                                //        info = 'Recurrent';\\r\\n                                //    } else info = 'Amber';\\r\\n                                //}\\r\\n                            }\\r\\n                            //Amber Alert ON    Don`t know the dfference between ALA and ALA-O\\r\\n                            else if ((alarmCodeInt & 262144) == 262144) {\\r\\n                                var alarm = 'ALA';\\r\\n                            }\\r\\n                            // welfare check in  and amber alert ON\\r\\n                            else if ((alarmCodeInt & 524288) == 524288) {\\r\\n                                //var alarm = 'WTS';\\r\\n                                if (configs.Welfare !== undefined) {\\r\\n                                    if (configs.Welfare.Mode == '1') {\\r\\n                                        //info = 'Recurrent';\\r\\n                                        var alarm = 'WTS';\\r\\n                                    } else {\\r\\n                                        //info = 'Amber';\\r\\n                                        var alarm = 'ALA-O';\\r\\n                                    }\\r\\n                                }\\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\\r\\n                            else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n                                //var alarm = 'ALA-W';\\r\\n                                if (configs.Welfare !== undefined) {\\r\\n                                    if (configs.Welfare.Mode == '1') {\\r\\n                                        var alarm = 'ALA-W';\\r\\n                                        //info = 'Recurrent';\\r\\n                                    } else {\\r\\n                                        //info = 'Amber';\\r\\n                                        var alarm = 'ALA';\\r\\n                                    }\\r\\n                                }\\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                            //update customID to check if belongs to this type of device\\r\\n                            customID = value;\\r\\n                            if (value != '64') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\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                                    //no 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 != '64') {\\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 = (`Sentry-${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 = (`Sentry-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                            if ((statusInt & 16) == 16) {\\r\\n                                statusDevice += 'Charging,';\\r\\n                                // AddValue(configsToUpdate, configIds.ReadState.Charging, 'true');\\r\\n                                // configsToAck.push(configIds.ReadState.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 location: ' + lbs_data;\\r\\n                            break;\\r\\n                        case '30':\\r\\n                            //G-sensor. \\r\\n                            if (customID != '64') {\\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 = (`Sentry-${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 != '64') {\\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 = (`Sentry-${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                //  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 = (`Sentry-${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 = (`Sentry-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, quizas meter dentro del if (alarmcode)\\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 = (`Sentry;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 = (`Sentry;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                            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': // Incoming call Ringtone Volume\\r\\n                            var volume = hexToDecimal(value);\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Sentry;ACK-VOL;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"Ringtone\\\", volume);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.IncomingCallRingtoneVolume, volume);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.IncomingCallRingtoneVolume);\\r\\n                            break;\\r\\n                        case '12': // Speaker Volume\\r\\n                            var volume = hexToDecimal(value);\\r\\n                            AddValue(codeValues, \\\"Speaker\\\", volume);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.InCallSpeakerVolume, volume);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.InCallSpeakerVolume);\\r\\n                            break;\\r\\n                        case '1C': // Notifications and Alerts Volume\\r\\n                            var volume = hexToDecimal(value);\\r\\n                            AddValue(codeValues, \\\"Notifications\\\", volume);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.NotificationsandAlerts, volume);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.NotificationsandAlerts);\\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 = (`Sentry;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 = (`Sentry;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                                var allow = 'true';\\r\\n                            } else var allow = 'false';\\r\\n                            // To find LT setup\\r\\n                            if (statusPhone.substring(5, 6) == '1') { // 1 Enable\\r\\n                                var silentCall = 'true';\\r\\n                            } else var silentCall = '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                            AddValue(configsToUpdate, configIds.ReadProfiles.SilentCallMode, silentCall);\\r\\n                            //configsToAck.push(configIds.ReadSystemSettings.Statusphone);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AllowList);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AutoAnswer);\\r\\n                            configsToAck.push(configIds.ReadProfiles.SilentCallMode);\\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                            var report;\\r\\n                            switch (contactNumber) {\\r\\n                                // Emergency Number\\r\\n                                // [Value]:80 2B 33 34 36 33 35 36 30 37 39 33 30\\r\\n                                //{\\\"number\\\":{\\\"call\\\":0,\\\"noCard\\\":0,\\\"number\\\":\\\"+34635607930\\\",\\\"enable\\\":1,\\\"sms\\\":0,\\\"index\\\":0}}\\r\\n                                case '0':\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.length < 6) { //if no telephone defined\\r\\n                                        tel = '';\\r\\n                                    }\\r\\n                                    report = hex2bin(value.substring(0, 2)); // To find report mode Call &data or DAta only\\r\\n                                    AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                                    AddValue(codeValues, \\\"ReportMode\\\", report.substring(2, 3));\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.ReportMode, report.substring(2, 3));\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.ReportMode);\\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                                    if (tel.length < 6) { //if no telephone defined\\r\\n                                        tel = '';\\r\\n                                    }\\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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 = (`Sentry;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 '55': // Tilt Angle Alert\\r\\n                            //[Value]:0A 00 1E 00\\r\\n                            //{\\\"tiltAlert\\\":{\\\"angle\\\":30,\\\"time\\\":10,\\\"status\\\":0,\\\"dial\\\":0}}\\r\\n                            var angle = hexToDecimal(value.substring(4, 6));\\r\\n                            var timeout = hexToDecimal(value.substring(0, 2));\\r\\n                            var status = hexToDecimal(value.substring(6, 8));\\r\\n                            if (status == 0) angle = 0;\\r\\n                            //var alertSetting = angle;\\r\\n                            //imei = serverParams.Imei;\\r\\n                            //messageForReceiver = (`Sentry;ACK-TILTANG;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"tiltangle\\\", angle);\\r\\n                            AddValue(codeValues, \\\"tiltimeout\\\", timeout);\\r\\n                            AddValue(codeValues, \\\"tiltstatus\\\", status);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltTimeout, timeout);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.TiltAngle, angle);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltTimeout);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.TiltAngle);\\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 = (`Sentry;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.ManDownSettings, sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.EnableDisableManDownSettings, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadManDownSettings.Sensitivity, sesibityOptionValue);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.EnableDisableManDownSettings);\\r\\n                            configsToAck.push(configIds.ReadManDownSettings.Sensitivity);\\r\\n                            break;\\r\\n                        case '57': // Welfare\\r\\n                            // [Value]:10 0E 00 80 58 02 00 80\\r\\n                            //{\\\"welfareAlert\\\":{\\\"time\\\":600,\\\"value\\\":3600,\\\"status\\\":1,\\\"dial\\\":1}}\\r\\n                            var welfareStatus = hex2bin(value.substring(6, 8)); // check status\\r\\n                            var welfareValue = hexToDecimal(changeEndianness(value.substring(0, 6)));\\r\\n                            var welfareTime = hexToDecimal(changeEndianness(value.substring(8, 14)));\\r\\n                            var enalbleDisable = '';\\r\\n                            if ((configs.ReadState.Charging == 'true') && (configs.Welfare.Mode == '1') && (configs.Welfare.EnableDisableWelfare == 'true')) { // Force Read to enable welfare when device is charging in recurrent mode\\r\\n                                var sensibility = 'Enable, '\\r\\n                                enalbleDisable = '1'\\r\\n                            } else {\\r\\n                                if (welfareStatus.substring(0, 1) == '1') {\\r\\n                                    var sensibility = 'Enable, '\\r\\n                                    enalbleDisable = '1'\\r\\n                                } else {\\r\\n                                    var sensibility = 'Disable, '\\r\\n                                    //enalbleDisable = '0'\\r\\n                                }\\r\\n                            };\\r\\n                            //var imei = serverParams.Imei;\\r\\n                            //messageForReceiver = (`Sentry;ACK-WELFALERT;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            sensibility += welfareValue / 60;\\r\\n                            sensibility += ', ' + welfareTime / 60;\\r\\n                            AddValue(codeValues, \\\"welfare\\\", sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.EnableDisableReadWelfare, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Prealarm, welfareTime / 60);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Timeout, welfareValue / 60);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.EnableDisableReadWelfare);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Prealarm);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Timeout);\\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 = (`Sentry;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 '75': // Extra Enable control   Welfare Mode\\r\\n                            //[Value]:80 00 00 10  last two digit for new/old welfare\\r\\n                            //{\\\"extraControl\\\":{\\\"bit29\\\":0,\\\"bit27\\\":0,\\\"bit28\\\":1,\\\"bit25\\\":0,\\\"bit26\\\":0,\\\"flagValue\\\":268435584,\\\"bit23\\\":0,\\\"bit24\\\":0,\\\"bit21\\\":0,\\\"bit22\\\":0,\\\"bit20\\\":0,\\\"bit9\\\":0,\\\"bit18\\\":0,\\\"bit19\\\":0,\\\"bit7\\\":1,\\\"bit16\\\":0,\\\"bit8\\\":0,\\\"bit17\\\":0,\\\"bit5\\\":0,\\\"bit14\\\":0,\\\"bit6\\\":0,\\\"bit15\\\":0,\\\"bit3\\\":0,\\\"bit4\\\":0,\\\"bit1\\\":0,\\\"bit2\\\":0,\\\"bit0\\\":0,\\\"bit12\\\":0,\\\"bit13\\\":0,\\\"bit10\\\":0,\\\"bit11\\\":0,\\\"bit30\\\":0,\\\"bit31\\\":0}}\\r\\n                            var extraStatus = hex2bin(value.substring(6, 7)).substring(7, 8);\\r\\n                            //if (extraStatus.substring(7, 8) == '1') {\\r\\n                            //    extra += ' Enable, '\\r\\n                            //} else {\\r\\n                            //    extra += ' 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, \\\"welfare Mode\\\", extraStatus);\\r\\n                            // messageForReceiver = (`Sentry;ACK-EXTRA;${imei};`);\\r\\n                            // sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadWelfareSettings.Mode, extraStatus);\\r\\n                            configsToAck.push(configIds.ReadWelfareSettings.Mode);\\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 = (`Sentry;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                            var triggerMode = '';\\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                            triggerMode = status.substring(2, 3);\\r\\n                            if (triggerMode == '1') {\\r\\n                                alertSetting += 'Double Press, '\\r\\n                            } else {\\r\\n                                alertSetting += 'Long Press, '\\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 = (`Sentry;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.ReadInterfaceOptions.SpeedActivationDialButton, triggerMode);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n                            configsToAck.push(configIds.ReadInterfaceOptions.SpeedActivationDialButton);\\r\\n                            break;\\r\\n                        case '20': // SOS Button Settings\\r\\n                            // [Length]:03 [Key]:20 [Value]:7B 9E {\\\"sosButton\\\":{\\\"mode\\\":0,\\\"feedBack\\\":3,\\\"task\\\":15,\\\"time\\\":30,\\\"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                            var triggerMode = '';\\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                            triggerMode = status.substring(2, 3);\\r\\n                            if (triggerMode == '1') {\\r\\n                                alertSetting += 'Double Press, '\\r\\n                            } else {\\r\\n                                alertSetting += 'Long Press, '\\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 = (`Sentry;ACK-SPEED;${imei};`);\\r\\n                            //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"sos\\\", alertSetting);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadInterfaceOptions.SOSActivationButton, triggerMode);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            //configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n                            configsToAck.push(configIds.ReadInterfaceOptions.SOSActivationButton);\\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 = (`Sentry-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 = (`Sentry-${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 = (`Sentry-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 = (`Sentry-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 = (`Sentry-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 = (`Sentry-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":1780505715}]},{"Id":361,"Name":"OnUpdateProtocol_Sentry","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":[]}],"Groups":[{"Id":6999,"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":7000,"Parent":{"Id":6999,"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":7000,"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":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7005,"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":7015,"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":[]}]},{"Id":7006,"Name":"Read Additional 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":7016,"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":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7021,"Name":"Read Non Movement 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":7030,"Name":"Read Welfare Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7013,"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":[]}]},{"Id":7001,"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":7002,"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":7007,"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":[]},{"Id":7008,"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":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7009,"Name":"Alert 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":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":7029,"Name":"Welfare","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7010,"Name":"Additional 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":7019,"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":7022,"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":7023,"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":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":3,"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":7001,"Parent":{"Id":6999,"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":7000,"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":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7005,"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":7015,"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":[]}]},{"Id":7006,"Name":"Read Additional 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":7016,"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":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7021,"Name":"Read Non Movement 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":7030,"Name":"Read Welfare Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7013,"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":[]}]},{"Id":7001,"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":7002,"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":7007,"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":[]},{"Id":7008,"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":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7009,"Name":"Alert 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":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":7029,"Name":"Welfare","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7010,"Name":"Additional 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":7019,"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":7022,"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":7023,"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":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":3,"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\":7001,\"Parent\":{\"Id\":6999,\"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\":7001,\"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\":7002,\"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\":7000,\"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":1761073335},{"Type":1,"NewValue":"{\"Id\":7001,\"Parent\":{\"Id\":6999,\"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\":7001,\"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\":7002,\"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\":7000,\"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":1761816262}]},{"Id":7002,"Parent":{"Id":6999,"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":7000,"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":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7005,"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":7015,"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":[]}]},{"Id":7006,"Name":"Read Additional 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":7016,"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":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7021,"Name":"Read Non Movement 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":7030,"Name":"Read Welfare Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7013,"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":[]}]},{"Id":7001,"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":7002,"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":7007,"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":[]},{"Id":7008,"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":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7009,"Name":"Alert 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":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":7029,"Name":"Welfare","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7010,"Name":"Additional 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":7019,"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":7022,"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":7023,"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":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":3,"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":7003,"Parent":{"Id":7000,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7001,"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":7002,"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":7007,"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":[]},{"Id":7008,"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":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7009,"Name":"Alert 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":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":7029,"Name":"Welfare","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7010,"Name":"Additional 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":7019,"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":7022,"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":7023,"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":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","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":[{"Id":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7005,"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":7015,"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":[]}]},{"Id":7006,"Name":"Read Additional 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":7016,"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":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7021,"Name":"Read Non Movement 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":7030,"Name":"Read Welfare Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7013,"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":"Read Performance 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\":7003,\"Parent\":{\"Id\":7000,\"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\":7003,\"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\":7344,\"Name\":\"Read Profiles\",\"Json\":{\"description\":null,\"columns\":1,\"order\":2,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":7004,\"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\":7005,\"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\":7006,\"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\":7011,\"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\":7013,\"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\":[]}]},\"Name\":\"Read Performance Settings\",\"Json\":\"{\\\"description\\\":null,\\\"columns\\\":1,\\\"order\\\":4,\\\"listSize\\\":1,\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\"]}\",\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"LanguageId\":null,\"ProtocolActionObjects\":[]}","Timestamp":1746729512}]},{"Id":7004,"Parent":{"Id":7000,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7001,"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":7002,"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":7007,"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":[]},{"Id":7008,"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":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7009,"Name":"Alert 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":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":7029,"Name":"Welfare","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7010,"Name":"Additional 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":7019,"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":7022,"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":7023,"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":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","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":[{"Id":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7005,"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":7015,"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":[]}]},{"Id":7006,"Name":"Read Additional 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":7016,"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":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7021,"Name":"Read Non Movement 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":7030,"Name":"Read Welfare Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7013,"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":"Read State","Json":"{\"description\":null,\"columns\":1,\"order\":6,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]}","DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":7004,\"Parent\":{\"Id\":7000,\"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\":7004,\"Name\":\"Read State\",\"Json\":{\"description\":null,\"columns\":1,\"order\":7,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":7344,\"Name\":\"Read Profiles\",\"Json\":{\"description\":null,\"columns\":1,\"order\":2,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":7003,\"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\":7005,\"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\":7006,\"Name\":\"Read Additional Settings\",\"Json\":{\"description\":null,\"columns\":1,\"order\":5,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":7011,\"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\":7013,\"Name\":\"Read 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\":\"Read State\",\"Json\":\"{\\\"description\\\":null,\\\"columns\\\":1,\\\"order\\\":7,\\\"listSize\\\":1,\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\"]}\",\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"LanguageId\":null,\"ProtocolActionObjects\":[]}","Timestamp":1746729520}]},{"Id":7005,"Parent":{"Id":7000,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7001,"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":7002,"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":7007,"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":[]},{"Id":7008,"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":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7009,"Name":"Alert 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":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":7029,"Name":"Welfare","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7010,"Name":"Additional 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":7019,"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":7022,"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":7023,"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":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","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":[{"Id":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7005,"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":7015,"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":[]}]},{"Id":7006,"Name":"Read Additional 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":7016,"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":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7021,"Name":"Read Non Movement 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":7030,"Name":"Read Welfare Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7013,"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":"Read Communication Settings","Json":"{\"description\":\"\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]}","DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[]},{"Id":7006,"Parent":{"Id":7000,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7001,"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":7002,"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":7007,"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":[]},{"Id":7008,"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":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7009,"Name":"Alert 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":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":7029,"Name":"Welfare","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7010,"Name":"Additional 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":7019,"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":7022,"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":7023,"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":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","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":[{"Id":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7005,"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":7015,"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":[]}]},{"Id":7006,"Name":"Read Additional 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":7016,"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":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7021,"Name":"Read Non Movement 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":7030,"Name":"Read Welfare Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7013,"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":"Read Additional 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\":7006,\"Parent\":{\"Id\":7000,\"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\":7006,\"Name\":\"Read Additional Settings\",\"Json\":{\"description\":null,\"columns\":1,\"order\":5,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":7344,\"Name\":\"Read Profiles\",\"Json\":{\"description\":null,\"columns\":1,\"order\":2,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":7003,\"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\":7004,\"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\":7005,\"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\":7011,\"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\":7013,\"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\":[]}]},\"Name\":\"Read Additional Settings\",\"Json\":\"{\\\"description\\\":null,\\\"columns\\\":1,\\\"order\\\":5,\\\"listSize\\\":1,\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\"]}\",\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"LanguageId\":null,\"ProtocolActionObjects\":[]}","Timestamp":1746729515}]},{"Id":7007,"Parent":{"Id":7002,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7000,"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":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7005,"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":7015,"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":[]}]},{"Id":7006,"Name":"Read Additional 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":7016,"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":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7021,"Name":"Read Non Movement 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":7030,"Name":"Read Welfare Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7013,"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":[]}]},{"Id":7001,"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":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7007,"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":[]},{"Id":7008,"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":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7009,"Name":"Alert 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":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":7029,"Name":"Welfare","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7010,"Name":"Additional 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":7019,"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":7022,"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":7023,"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":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"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,"LanguageId":null,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":7007,\"Parent\":{\"Id\":7002,\"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\":7007,\"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\":7343,\"Name\":\"Profiles\",\"Json\":{\"description\":null,\"columns\":1,\"order\":2,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":7008,\"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\":7009,\"Name\":\"Alert 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\":7010,\"Name\":\"Additional Settings\",\"Json\":{\"description\":null,\"columns\":1,\"order\":5,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":7012,\"Name\":\"Performance Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":4,\"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,\"LanguageId\":null,\"ProtocolActionObjects\":[]}","Timestamp":1746724824}]},{"Id":7008,"Parent":{"Id":7002,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7000,"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":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7005,"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":7015,"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":[]}]},{"Id":7006,"Name":"Read Additional 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":7016,"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":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7021,"Name":"Read Non Movement 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":7030,"Name":"Read Welfare Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7013,"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":[]}]},{"Id":7001,"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":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7007,"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":[]},{"Id":7008,"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":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7009,"Name":"Alert 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":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":7029,"Name":"Welfare","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7010,"Name":"Additional 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":7019,"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":7022,"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":7023,"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":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":3,"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":7009,"Parent":{"Id":7002,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7000,"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":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7005,"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":7015,"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":[]}]},{"Id":7006,"Name":"Read Additional 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":7016,"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":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7021,"Name":"Read Non Movement 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":7030,"Name":"Read Welfare Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7013,"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":[]}]},{"Id":7001,"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":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7007,"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":[]},{"Id":7008,"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":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7009,"Name":"Alert 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":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":7029,"Name":"Welfare","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7010,"Name":"Additional 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":7019,"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":7022,"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":7023,"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":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":3,"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\":2,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]}","DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":7009,\"Parent\":{\"Id\":7002,\"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\":7009,\"Name\":\"Alert 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\":7343,\"Name\":\"Profiles\",\"Json\":{\"description\":null,\"columns\":1,\"order\":2,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":7007,\"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\":7008,\"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\":7010,\"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\":7012,\"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\":[]}]},\"Name\":\"Alert Settings\",\"Json\":\"{\\\"description\\\":null,\\\"columns\\\":1,\\\"order\\\":3,\\\"listSize\\\":1,\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\"]}\",\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"LanguageId\":null,\"ProtocolActionObjects\":[]}","Timestamp":1746724816}]},{"Id":7010,"Parent":{"Id":7002,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7000,"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":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7005,"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":7015,"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":[]}]},{"Id":7006,"Name":"Read Additional 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":7016,"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":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7021,"Name":"Read Non Movement 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":7030,"Name":"Read Welfare Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7013,"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":[]}]},{"Id":7001,"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":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7007,"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":[]},{"Id":7008,"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":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7009,"Name":"Alert 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":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":7029,"Name":"Welfare","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7010,"Name":"Additional 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":7019,"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":7022,"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":7023,"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":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":3,"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\":4,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]}","DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":7010,\"Parent\":{\"Id\":7002,\"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\":7010,\"Name\":\"Additional Settings\",\"Json\":{\"description\":null,\"columns\":1,\"order\":5,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":7343,\"Name\":\"Profiles\",\"Json\":{\"description\":null,\"columns\":1,\"order\":2,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":7007,\"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\":7008,\"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\":7009,\"Name\":\"Alert 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\":7012,\"Name\":\"Performance Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":4,\"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\\\":5,\\\"listSize\\\":1,\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\"]}\",\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"LanguageId\":null,\"ProtocolActionObjects\":[]}","Timestamp":1746724822}]},{"Id":7011,"Parent":{"Id":7000,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7001,"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":7002,"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":7007,"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":[]},{"Id":7008,"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":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7009,"Name":"Alert 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":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":7029,"Name":"Welfare","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7010,"Name":"Additional 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":7019,"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":7022,"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":7023,"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":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","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":[{"Id":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7005,"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":7015,"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":[]}]},{"Id":7006,"Name":"Read Additional 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":7016,"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":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7021,"Name":"Read Non Movement 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":7030,"Name":"Read Welfare Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7013,"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":"Read Alert Settings","Json":"{\"description\":\"Read Alert Settings\",\"columns\":1,\"order\":2,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]}","DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":7011,\"Parent\":{\"Id\":7000,\"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\":7011,\"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\":7344,\"Name\":\"Read Profiles\",\"Json\":{\"description\":null,\"columns\":1,\"order\":2,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":7003,\"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\":7004,\"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\":7005,\"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\":7006,\"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\":7013,\"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\":[]}]},\"Name\":\"Read Alert Settings\",\"Json\":\"{\\\"description\\\":\\\"Read Alert Settings\\\",\\\"columns\\\":1,\\\"order\\\":3,\\\"listSize\\\":1,\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\"]}\",\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"LanguageId\":null,\"ProtocolActionObjects\":[]}","Timestamp":1746729510}]},{"Id":7012,"Parent":{"Id":7002,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7000,"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":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7005,"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":7015,"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":[]}]},{"Id":7006,"Name":"Read Additional 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":7016,"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":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7021,"Name":"Read Non Movement 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":7030,"Name":"Read Welfare Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7013,"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":[]}]},{"Id":7001,"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":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7007,"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":[]},{"Id":7008,"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":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7009,"Name":"Alert 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":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":7029,"Name":"Welfare","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7010,"Name":"Additional 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":7019,"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":7022,"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":7023,"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":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":3,"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\":3,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]}","DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":7012,\"Parent\":{\"Id\":7002,\"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\":7012,\"Name\":\"Performance Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":4,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":7343,\"Name\":\"Profiles\",\"Json\":{\"description\":null,\"columns\":1,\"order\":2,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":7007,\"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\":7008,\"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\":7009,\"Name\":\"Alert 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\":7010,\"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\":[]}]},\"Name\":\"Performance Settings\",\"Json\":\"{\\\"description\\\":\\\"\\\",\\\"columns\\\":1,\\\"order\\\":4,\\\"listSize\\\":1,\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\"]}\",\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"LanguageId\":null,\"ProtocolActionObjects\":[]}","Timestamp":1746724819}]},{"Id":7013,"Parent":{"Id":7000,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7001,"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":7002,"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":7007,"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":[]},{"Id":7008,"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":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7009,"Name":"Alert 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":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":7029,"Name":"Welfare","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7010,"Name":"Additional 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":7019,"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":7022,"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":7023,"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":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","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":[{"Id":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7005,"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":7015,"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":[]}]},{"Id":7006,"Name":"Read Additional 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":7016,"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":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7021,"Name":"Read Non Movement 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":7030,"Name":"Read Welfare Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7013,"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":"Read System Settings","Json":"{\"description\":\"\",\"columns\":1,\"order\":5,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]}","DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":7013,\"Parent\":{\"Id\":7000,\"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\":7013,\"Name\":\"Read 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\":7344,\"Name\":\"Read Profiles\",\"Json\":{\"description\":null,\"columns\":1,\"order\":2,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":7003,\"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\":7004,\"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\":7005,\"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\":7006,\"Name\":\"Read Additional Settings\",\"Json\":{\"description\":null,\"columns\":1,\"order\":5,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":7011,\"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 System Settings\",\"Json\":\"{\\\"description\\\":\\\"\\\",\\\"columns\\\":1,\\\"order\\\":6,\\\"listSize\\\":1,\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\"]}\",\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"LanguageId\":null,\"ProtocolActionObjects\":[]}","Timestamp":1746729517}]},{"Id":7014,"Parent":{"Id":7008,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7002,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7000,"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":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7005,"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":7015,"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":[]}]},{"Id":7006,"Name":"Read Additional 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":7016,"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":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7021,"Name":"Read Non Movement 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":7030,"Name":"Read Welfare Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7013,"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":[]}]},{"Id":7001,"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":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7007,"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":[]},{"Id":7009,"Name":"Alert 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":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":7029,"Name":"Welfare","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7010,"Name":"Additional 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":7019,"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":7022,"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":7023,"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":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","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":[{"Id":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"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,"LanguageId":null,"ProtocolActionObjects":[]},{"Id":7015,"Parent":{"Id":7005,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7000,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7001,"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":7002,"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":7007,"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":[]},{"Id":7008,"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":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7009,"Name":"Alert 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":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":7029,"Name":"Welfare","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7010,"Name":"Additional 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":7019,"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":7022,"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":7023,"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":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","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":[{"Id":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7006,"Name":"Read Additional 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":7016,"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":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7021,"Name":"Read Non Movement 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":7030,"Name":"Read Welfare Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7013,"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":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7015,"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":"Read WiFi List","Json":"{\"description\":\"\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]}","DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[]},{"Id":7016,"Parent":{"Id":7006,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7000,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7001,"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":7002,"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":7007,"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":[]},{"Id":7008,"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":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7009,"Name":"Alert 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":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":7029,"Name":"Welfare","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7010,"Name":"Additional 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":7019,"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":7022,"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":7023,"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":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","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":[{"Id":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7005,"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":7015,"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":[]}]},{"Id":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7021,"Name":"Read Non Movement 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":7030,"Name":"Read Welfare Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7013,"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":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7016,"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":7017,"Parent":{"Id":7009,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7002,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7000,"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":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7005,"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":7015,"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":[]}]},{"Id":7006,"Name":"Read Additional 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":7016,"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":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7021,"Name":"Read Non Movement 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":7030,"Name":"Read Welfare Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7013,"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":[]}]},{"Id":7001,"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":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7007,"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":[]},{"Id":7008,"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":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7010,"Name":"Additional 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":7019,"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":7022,"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":7023,"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":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","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":[{"Id":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":7029,"Name":"Welfare","Json":{"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":"Man Down Settings","Json":"{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]}","DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[]},{"Id":7018,"Parent":{"Id":7009,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7002,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7000,"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":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7005,"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":7015,"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":[]}]},{"Id":7006,"Name":"Read Additional 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":7016,"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":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7021,"Name":"Read Non Movement 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":7030,"Name":"Read Welfare Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7013,"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":[]}]},{"Id":7001,"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":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7007,"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":[]},{"Id":7008,"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":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7010,"Name":"Additional 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":7019,"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":7022,"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":7023,"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":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","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":[{"Id":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":7029,"Name":"Welfare","Json":{"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\":\"\",\"columns\":1,\"order\":4,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]}","DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[]},{"Id":7019,"Parent":{"Id":7010,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7002,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7000,"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":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7005,"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":7015,"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":[]}]},{"Id":7006,"Name":"Read Additional 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":7016,"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":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7021,"Name":"Read Non Movement 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":7030,"Name":"Read Welfare Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7013,"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":[]}]},{"Id":7001,"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":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7007,"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":[]},{"Id":7008,"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":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7009,"Name":"Alert 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":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":7029,"Name":"Welfare","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","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":[{"Id":7019,"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":7022,"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":7023,"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":"Speed Dial","Json":"{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]}","DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[]},{"Id":7020,"Parent":{"Id":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7000,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7001,"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":7002,"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":7007,"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":[]},{"Id":7008,"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":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7009,"Name":"Alert 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":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":7029,"Name":"Welfare","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7010,"Name":"Additional 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":7019,"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":7022,"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":7023,"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":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","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":[{"Id":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7005,"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":7015,"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":[]}]},{"Id":7006,"Name":"Read Additional 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":7016,"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":7013,"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":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7021,"Name":"Read Non Movement 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":7030,"Name":"Read Welfare Settings","Json":{"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":"Read Man Down Settings","Json":"{\"description\":\"\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]}","DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[]},{"Id":7021,"Parent":{"Id":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7000,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7001,"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":7002,"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":7007,"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":[]},{"Id":7008,"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":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7009,"Name":"Alert 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":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":7029,"Name":"Welfare","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7010,"Name":"Additional 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":7019,"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":7022,"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":7023,"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":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","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":[{"Id":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7005,"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":7015,"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":[]}]},{"Id":7006,"Name":"Read Additional 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":7016,"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":7013,"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":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7021,"Name":"Read Non Movement 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":7030,"Name":"Read Welfare Settings","Json":{"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":"Read Non Movement Settings","Json":"{\"description\":\"\",\"columns\":1,\"order\":2,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]}","DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[]},{"Id":7022,"Parent":{"Id":7010,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7002,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7000,"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":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7005,"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":7015,"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":[]}]},{"Id":7006,"Name":"Read Additional 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":7016,"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":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7021,"Name":"Read Non Movement 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":7030,"Name":"Read Welfare Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7013,"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":[]}]},{"Id":7001,"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":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7007,"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":[]},{"Id":7008,"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":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7009,"Name":"Alert 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":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":7029,"Name":"Welfare","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","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":[{"Id":7019,"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":7022,"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":7023,"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":"Beacon List","Json":"{\"description\":null,\"columns\":1,\"order\":3,\"listSize\":10,\"toTranslate\":[\"name\",\"description\"]}","DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[]},{"Id":7023,"Parent":{"Id":7010,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7002,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7000,"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":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7005,"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":7015,"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":[]}]},{"Id":7006,"Name":"Read Additional 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":7016,"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":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7021,"Name":"Read Non Movement 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":7030,"Name":"Read Welfare Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7013,"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":[]}]},{"Id":7001,"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":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7007,"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":[]},{"Id":7008,"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":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7009,"Name":"Alert 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":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":7029,"Name":"Welfare","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","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":[{"Id":7019,"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":7022,"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":7023,"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":"Approved Contacts","Json":"{\"description\":\"\",\"columns\":1,\"order\":2,\"listSize\":7,\"toTranslate\":[\"name\",\"description\"]}","DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[]},{"Id":7024,"Parent":{"Id":7009,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7002,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7000,"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":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7005,"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":7015,"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":[]}]},{"Id":7006,"Name":"Read Additional 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":7016,"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":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7021,"Name":"Read Non Movement 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":7030,"Name":"Read Welfare Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7013,"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":[]}]},{"Id":7001,"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":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7007,"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":[]},{"Id":7008,"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":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7010,"Name":"Additional 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":7019,"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":7022,"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":7023,"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":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","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":[{"Id":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":7029,"Name":"Welfare","Json":{"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\":2,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]}","DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[]},{"Id":7029,"Parent":{"Id":7009,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7002,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7000,"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":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7005,"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":7015,"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":[]}]},{"Id":7006,"Name":"Read Additional 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":7016,"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":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7021,"Name":"Read Non Movement 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":7030,"Name":"Read Welfare Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7013,"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":[]}]},{"Id":7001,"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":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7007,"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":[]},{"Id":7008,"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":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7010,"Name":"Additional 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":7019,"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":7022,"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":7023,"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":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","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":[{"Id":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":7029,"Name":"Welfare","Json":{"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":"Welfare","Json":"{\"description\":null,\"columns\":1,\"order\":3,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]}","DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[]},{"Id":7030,"Parent":{"Id":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7000,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7001,"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":7002,"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":7007,"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":[]},{"Id":7008,"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":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7009,"Name":"Alert 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":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":7029,"Name":"Welfare","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7010,"Name":"Additional 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":7019,"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":7022,"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":7023,"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":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","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":[{"Id":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7005,"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":7015,"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":[]}]},{"Id":7006,"Name":"Read Additional 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":7016,"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":7013,"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":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7021,"Name":"Read Non Movement 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":7030,"Name":"Read Welfare Settings","Json":{"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":"Read Welfare Settings","Json":"{\"description\":null,\"columns\":1,\"order\":3,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]}","DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[]},{"Id":7076,"Parent":{"Id":7014,"Name":"WiFi List","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":{"Id":7008,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7002,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7000,"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":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7005,"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":7015,"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":[]}]},{"Id":7006,"Name":"Read Additional 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":7016,"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":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7021,"Name":"Read Non Movement 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":7030,"Name":"Read Welfare Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7013,"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":[]}]},{"Id":7001,"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":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7007,"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":[]},{"Id":7009,"Name":"Alert 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":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":7029,"Name":"Welfare","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7010,"Name":"Additional 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":7019,"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":7022,"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":7023,"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":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","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":[]},"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"home","Json":"{  \"description\": \"\",  \"columns\": 1,  \"order\": 1,  \"listSize\": 5,  \"toTranslate\": [    \"name\",    \"description\"  ],  \"index\": 1}","DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[]},{"Id":7343,"Parent":{"Id":7002,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":[]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7007,"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":[]},{"Id":7008,"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":7014,"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":[{"Id":7307,"Name":"Oysta","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7009,"Name":"Alert 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":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":7029,"Name":"Welfare","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7010,"Name":"Additional 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":7022,"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":7019,"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":7023,"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":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7343,"Name":"Profiles","Json":{"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":"Profiles","Json":"{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]}","DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[{"Type":0,"NewValue":"{\"Id\":7343,\"Parent\":{\"Id\":7002,\"Name\":\"Configure Device\",\"Json\":{\"description\":null,\"columns\":1,\"order\":3,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":{\"Id\":6999,\"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\":[]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[{\"Id\":7007,\"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\":7008,\"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\":7014,\"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\":7307,\"Name\":\"Oysta\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":1,\"listSize\":5,\"toTranslate\":[\"name\",\"description\"],\"index\":1},\"Device\":null,\"DeviceRelated\":true,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]}]}]},{\"Id\":7009,\"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\":7017,\"Name\":\"Man Down 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\":7018,\"Name\":\"No Activity\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":4,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":7024,\"Name\":\"Non Movement 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\":7029,\"Name\":\"Welfare\",\"Json\":{\"description\":null,\"columns\":1,\"order\":3,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]}]},{\"Id\":7010,\"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\":7022,\"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\":[]},{\"Id\":7019,\"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\":7023,\"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\":7012,\"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\":7343,\"Name\":\"Profiles\",\"Json\":{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]}]},\"Name\":\"Profiles\",\"Json\":\"{\\\"description\\\":null,\\\"columns\\\":1,\\\"order\\\":1,\\\"listSize\\\":1,\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\"]}\",\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"LanguageId\":null,\"ProtocolActionObjects\":[]}","Timestamp":1746724775},{"Type":1,"NewValue":"{\"Id\":7343,\"Parent\":{\"Id\":7002,\"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\":7343,\"Name\":\"Profiles\",\"Json\":{\"description\":null,\"columns\":1,\"order\":2,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":7007,\"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\":7008,\"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\":7009,\"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\":7010,\"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\":7012,\"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\":[]}]},\"Name\":\"Profiles\",\"Json\":\"{\\\"description\\\":null,\\\"columns\\\":1,\\\"order\\\":2,\\\"listSize\\\":1,\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\"]}\",\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"LanguageId\":null,\"ProtocolActionObjects\":[]}","Timestamp":1746724814}]},{"Id":7344,"Parent":{"Id":7000,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":[]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7005,"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":7006,"Name":"Read Additional 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":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7013,"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":[]},{"Id":7344,"Name":"Read Profiles","Json":{"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 Profiles","Json":"{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]}","DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[{"Type":0,"NewValue":"{\"Id\":7344,\"Parent\":{\"Id\":7000,\"Name\":\"On Device\",\"Json\":{\"description\":null,\"columns\":1,\"order\":2,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":{\"Id\":6999,\"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\":[]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[{\"Id\":7003,\"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\":7004,\"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\":7005,\"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\":7006,\"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\":7011,\"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\":7013,\"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\":7344,\"Name\":\"Read Profiles\",\"Json\":{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]}]},\"Name\":\"Read Profiles\",\"Json\":\"{\\\"description\\\":null,\\\"columns\\\":1,\\\"order\\\":1,\\\"listSize\\\":1,\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\"]}\",\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"LanguageId\":null,\"ProtocolActionObjects\":[]}","Timestamp":1746729497},{"Type":1,"NewValue":"{\"Id\":7344,\"Parent\":{\"Id\":7000,\"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\":7344,\"Name\":\"Read Profiles\",\"Json\":{\"description\":null,\"columns\":1,\"order\":2,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":7003,\"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\":7004,\"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\":7005,\"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\":7006,\"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\":7011,\"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\":7013,\"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\":[]}]},\"Name\":\"Read Profiles\",\"Json\":\"{\\\"description\\\":null,\\\"columns\\\":1,\\\"order\\\":2,\\\"listSize\\\":1,\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\"]}\",\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"LanguageId\":null,\"ProtocolActionObjects\":[]}","Timestamp":1746729507}]},{"Id":7359,"Parent":{"Id":7007,"Name":"System Settings","Json":{"description":"","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7002,"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":[]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7359,"Name":"Interface Options","Json":{"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":"Interface Options","Json":"{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]}","DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[{"Type":0,"NewValue":"{\"Id\":7359,\"Parent\":{\"Id\":7007,\"Name\":\"System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":6,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":{\"Id\":7002,\"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\":[]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[{\"Id\":7359,\"Name\":\"Interface Options\",\"Json\":{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]}]},\"Name\":\"Interface Options\",\"Json\":\"{\\\"description\\\":null,\\\"columns\\\":1,\\\"order\\\":1,\\\"listSize\\\":1,\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\"]}\",\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"LanguageId\":null,\"ProtocolActionObjects\":[]}","Timestamp":1747325120}]},{"Id":7360,"Parent":{"Id":7013,"Name":"Read System Settings","Json":{"description":"","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7000,"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":[]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7360,"Name":"Read Interface Options","Json":{"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 Interface Options","Json":"{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]}","DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[{"Type":0,"NewValue":"{\"Id\":7360,\"Parent\":{\"Id\":7013,\"Name\":\"Read System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":6,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":{\"Id\":7000,\"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\":[]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[{\"Id\":7360,\"Name\":\"Read Interface Options\",\"Json\":{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]}]},\"Name\":\"Read Interface Options\",\"Json\":\"{\\\"description\\\":null,\\\"columns\\\":1,\\\"order\\\":1,\\\"listSize\\\":1,\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\"]}\",\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"LanguageId\":null,\"ProtocolActionObjects\":[]}","Timestamp":1747327896}]}],"GroupParams":[{"Id":11805,"Group":{"Id":7000,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7001,"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":7002,"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":7007,"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":[]},{"Id":7008,"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":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7009,"Name":"Alert 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":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":7029,"Name":"Welfare","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7010,"Name":"Additional 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":7019,"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":7022,"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":7023,"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":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","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":[{"Id":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7005,"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":7015,"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":[]}]},{"Id":7006,"Name":"Read Additional 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":7016,"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":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7021,"Name":"Read Non Movement 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":7030,"Name":"Read Welfare Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7013,"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":"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\"],\"order\":1}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":11804,"Group":{"Id":7000,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7001,"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":7002,"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":7007,"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":[]},{"Id":7008,"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":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7009,"Name":"Alert 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":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":7029,"Name":"Welfare","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7010,"Name":"Additional 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":7019,"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":7022,"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":7023,"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":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","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":[{"Id":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7005,"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":7015,"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":[]}]},{"Id":7006,"Name":"Read Additional 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":7016,"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":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7021,"Name":"Read Non Movement 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":7030,"Name":"Read Welfare Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7013,"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":"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\"],\"order\":0}","Default":"false","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":11810,"Group":{"Id":7001,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7000,"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":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7005,"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":7015,"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":[]}]},{"Id":7006,"Name":"Read Additional 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":7016,"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":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7021,"Name":"Read Non Movement 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":7030,"Name":"Read Welfare Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7013,"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":[]}]},{"Id":7002,"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":7007,"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":[]},{"Id":7008,"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":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7009,"Name":"Alert 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":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":7029,"Name":"Welfare","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7010,"Name":"Additional 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":7019,"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":7022,"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":7023,"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":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","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":"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":[]},{"Id":11812,"Group":{"Id":7001,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7000,"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":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7005,"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":7015,"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":[]}]},{"Id":7006,"Name":"Read Additional 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":7016,"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":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7021,"Name":"Read Non Movement 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":7030,"Name":"Read Welfare Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7013,"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":[]}]},{"Id":7002,"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":7007,"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":[]},{"Id":7008,"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":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7009,"Name":"Alert 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":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":7029,"Name":"Welfare","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7010,"Name":"Additional 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":7019,"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":7022,"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":7023,"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":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","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":"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\":11812,\"Group\":{\"Id\":7001,\"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":1761816199}],"LanguageId":null,"Tags":[]},{"Id":11813,"Group":{"Id":7001,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7000,"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":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7005,"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":7015,"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":[]}]},{"Id":7006,"Name":"Read Additional 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":7016,"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":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7021,"Name":"Read Non Movement 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":7030,"Name":"Read Welfare Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7013,"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":[]}]},{"Id":7002,"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":7007,"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":[]},{"Id":7008,"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":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7009,"Name":"Alert 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":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":7029,"Name":"Welfare","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7010,"Name":"Additional 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":7019,"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":7022,"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":7023,"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":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","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":"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\":11813,\"Group\":{\"Id\":7001,\"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":1761816202}],"LanguageId":null,"Tags":[]},{"Id":11814,"Group":{"Id":7001,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7000,"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":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7005,"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":7015,"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":[]}]},{"Id":7006,"Name":"Read Additional 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":7016,"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":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7021,"Name":"Read Non Movement 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":7030,"Name":"Read Welfare Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7013,"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":[]}]},{"Id":7002,"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":7007,"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":[]},{"Id":7008,"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":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7009,"Name":"Alert 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":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":7029,"Name":"Welfare","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7010,"Name":"Additional 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":7019,"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":7022,"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":7023,"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":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","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":"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\":11814,\"Group\":{\"Id\":7001,\"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":1761073306}],"LanguageId":null,"Tags":[]},{"Id":11815,"Group":{"Id":7001,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7000,"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":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7005,"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":7015,"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":[]}]},{"Id":7006,"Name":"Read Additional 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":7016,"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":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7021,"Name":"Read Non Movement 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":7030,"Name":"Read Welfare Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7013,"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":[]}]},{"Id":7002,"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":7007,"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":[]},{"Id":7008,"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":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7009,"Name":"Alert 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":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":7029,"Name":"Welfare","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7010,"Name":"Additional 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":7019,"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":7022,"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":7023,"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":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","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":"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":11816,"Group":{"Id":7001,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7000,"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":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7005,"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":7015,"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":[]}]},{"Id":7006,"Name":"Read Additional 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":7016,"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":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7021,"Name":"Read Non Movement 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":7030,"Name":"Read Welfare Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7013,"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":[]}]},{"Id":7002,"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":7007,"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":[]},{"Id":7008,"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":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7009,"Name":"Alert 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":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":7029,"Name":"Welfare","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7010,"Name":"Additional 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":7019,"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":7022,"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":7023,"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":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","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":"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\":11816,\"Group\":{\"Id\":7001,\"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":1761073309}],"LanguageId":null,"Tags":[]},{"Id":11817,"Group":{"Id":7001,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7000,"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":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7005,"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":7015,"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":[]}]},{"Id":7006,"Name":"Read Additional 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":7016,"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":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7021,"Name":"Read Non Movement 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":7030,"Name":"Read Welfare Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7013,"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":[]}]},{"Id":7002,"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":7007,"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":[]},{"Id":7008,"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":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7009,"Name":"Alert 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":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":7029,"Name":"Welfare","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7010,"Name":"Additional 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":7019,"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":7022,"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":7023,"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":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","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":"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":11803,"Group":{"Id":7001,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7000,"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":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7005,"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":7015,"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":[]}]},{"Id":7006,"Name":"Read Additional 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":7016,"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":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7021,"Name":"Read Non Movement 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":7030,"Name":"Read Welfare Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7013,"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":[]}]},{"Id":7002,"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":7007,"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":[]},{"Id":7008,"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":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7009,"Name":"Alert 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":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":7029,"Name":"Welfare","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7010,"Name":"Additional 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":7019,"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":7022,"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":7023,"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":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","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":"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":11807,"Group":{"Id":7001,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7000,"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":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7005,"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":7015,"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":[]}]},{"Id":7006,"Name":"Read Additional 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":7016,"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":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7021,"Name":"Read Non Movement 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":7030,"Name":"Read Welfare Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7013,"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":[]}]},{"Id":7002,"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":7007,"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":[]},{"Id":7008,"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":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7009,"Name":"Alert 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":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":7029,"Name":"Welfare","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7010,"Name":"Additional 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":7019,"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":7022,"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":7023,"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":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","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":"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":11808,"Group":{"Id":7001,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7000,"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":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7005,"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":7015,"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":[]}]},{"Id":7006,"Name":"Read Additional 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":7016,"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":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7021,"Name":"Read Non Movement 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":7030,"Name":"Read Welfare Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7013,"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":[]}]},{"Id":7002,"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":7007,"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":[]},{"Id":7008,"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":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7009,"Name":"Alert 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":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":7029,"Name":"Welfare","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7010,"Name":"Additional 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":7019,"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":7022,"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":7023,"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":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","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":"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":11819,"Group":{"Id":7001,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7000,"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":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7005,"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":7015,"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":[]}]},{"Id":7006,"Name":"Read Additional 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":7016,"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":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7021,"Name":"Read Non Movement 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":7030,"Name":"Read Welfare Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7013,"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":[]}]},{"Id":7002,"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":7007,"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":[]},{"Id":7008,"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":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7009,"Name":"Alert 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":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":7029,"Name":"Welfare","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7010,"Name":"Additional 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":7019,"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":7022,"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":7023,"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":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","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":"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\":11819,\"Group\":{\"Id\":7001,\"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":1761073304}],"LanguageId":null,"Tags":[]},{"Id":11818,"Group":{"Id":7001,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7000,"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":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7005,"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":7015,"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":[]}]},{"Id":7006,"Name":"Read Additional 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":7016,"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":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7021,"Name":"Read Non Movement 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":7030,"Name":"Read Welfare Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7013,"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":[]}]},{"Id":7002,"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":7007,"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":[]},{"Id":7008,"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":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7009,"Name":"Alert 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":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":7029,"Name":"Welfare","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7010,"Name":"Additional 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":7019,"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":7022,"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":7023,"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":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","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":"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\":11818,\"Group\":{\"Id\":7001,\"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":1761683580},{"Type":0,"NewValue":"{\"Id\":11818,\"Group\":{\"Id\":7001,\"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\":5817,\"Protocol\":{\"Id\":253,\"Code\":\"Access PS Sentry\",\"Version\":\"1.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},\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1761683584},{"Type":1,"NewValue":"{\"Id\":11818,\"Group\":{\"Id\":7001,\"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":1761816197}],"LanguageId":null,"Tags":[]},{"Id":11809,"Group":{"Id":7001,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7000,"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":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7005,"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":7015,"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":[]}]},{"Id":7006,"Name":"Read Additional 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":7016,"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":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7021,"Name":"Read Non Movement 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":7030,"Name":"Read Welfare Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7013,"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":[]}]},{"Id":7002,"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":7007,"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":[]},{"Id":7008,"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":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7009,"Name":"Alert 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":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":7029,"Name":"Welfare","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7010,"Name":"Additional 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":7019,"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":7022,"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":7023,"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":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","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 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":11806,"Group":{"Id":7002,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7000,"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":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7005,"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":7015,"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":[]}]},{"Id":7006,"Name":"Read Additional 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":7016,"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":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7021,"Name":"Read Non Movement 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":7030,"Name":"Read Welfare Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7013,"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":[]}]},{"Id":7001,"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":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7007,"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":[]},{"Id":7008,"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":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7009,"Name":"Alert 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":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":7029,"Name":"Welfare","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7010,"Name":"Additional 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":7019,"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":7022,"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":7023,"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":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":3,"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":11811,"Group":{"Id":7002,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7000,"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":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7005,"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":7015,"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":[]}]},{"Id":7006,"Name":"Read Additional 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":7016,"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":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7021,"Name":"Read Non Movement 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":7030,"Name":"Read Welfare Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7013,"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":[]}]},{"Id":7001,"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":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7007,"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":[]},{"Id":7008,"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":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7009,"Name":"Alert 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":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":7029,"Name":"Welfare","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7010,"Name":"Additional 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":7019,"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":7022,"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":7023,"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":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":3,"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":11832,"Group":{"Id":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7000,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7001,"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":7002,"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":7007,"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":[]},{"Id":7008,"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":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7009,"Name":"Alert 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":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":7029,"Name":"Welfare","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7010,"Name":"Additional 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":7019,"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":7022,"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":7023,"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":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","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":[{"Id":7004,"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":7005,"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":7015,"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":[]}]},{"Id":7006,"Name":"Read Additional 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":7016,"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":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7021,"Name":"Read Non Movement 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":7030,"Name":"Read Welfare Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7013,"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":[]}]},"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":11942,"Group":{"Id":7004,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7000,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7001,"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":7002,"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":7007,"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":[]},{"Id":7008,"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":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7009,"Name":"Alert 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":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":7029,"Name":"Welfare","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7010,"Name":"Additional 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":7019,"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":7022,"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":7023,"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":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","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":[{"Id":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7005,"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":7015,"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":[]}]},{"Id":7006,"Name":"Read Additional 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":7016,"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":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7021,"Name":"Read Non Movement 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":7030,"Name":"Read Welfare Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7013,"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":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Welfare","Json":"{\"name\":\"Welfare\",\"default\":\"true\",\"description\":\"Welfare Check Status\",\"type\":\"checkbox\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":true,\"isHidden\":true,\"minLength\":null,\"maxLength\":null,\"helpText\":null,\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"true","Command":null,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":11942,\"Group\":{\"Id\":7004,\"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\":\"Welfare\",\"Json\":\"{\\\"name\\\":\\\"Welfare\\\",\\\"default\\\":\\\"true\\\",\\\"description\\\":\\\"Welfare Check Status\\\",\\\"type\\\":\\\"checkbox\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":true,\\\"isHidden\\\":true,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":null,\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":3}\",\"Default\":\"true\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1744388170},{"Type":1,"NewValue":"{\"Id\":11942,\"Group\":{\"Id\":7004,\"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\":\"Welfare\",\"Json\":\"{\\\"name\\\":\\\"Welfare\\\",\\\"default\\\":\\\"true\\\",\\\"description\\\":\\\"Welfare Check Status\\\",\\\"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\":\"true\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1744388202}],"LanguageId":null,"Tags":[]},{"Id":11941,"Group":{"Id":7004,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7000,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7001,"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":7002,"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":7007,"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":[]},{"Id":7008,"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":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7009,"Name":"Alert 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":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":7029,"Name":"Welfare","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7010,"Name":"Additional 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":7019,"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":7022,"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":7023,"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":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","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":[{"Id":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7005,"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":7015,"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":[]}]},{"Id":7006,"Name":"Read Additional 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":7016,"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":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7021,"Name":"Read Non Movement 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":7030,"Name":"Read Welfare Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7013,"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":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Charging","Json":"{\"name\":\"Charging\",\"default\":\"false\",\"description\":\"Charging Status\",\"type\":\"checkbox\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":true,\"isHidden\":true,\"minLength\":null,\"maxLength\":null,\"helpText\":null,\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"true","Command":null,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":11941,\"Group\":{\"Id\":7004,\"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\":\"Charging\",\"Json\":\"{\\\"name\\\":\\\"Charging\\\",\\\"default\\\":\\\"false\\\",\\\"description\\\":\\\"Charging Status\\\",\\\"type\\\":\\\"checkbox\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":true,\\\"isHidden\\\":true,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":null,\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":2}\",\"Default\":\"true\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1744388168},{"Type":1,"NewValue":"{\"Id\":11941,\"Group\":{\"Id\":7004,\"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\":\"Charging\",\"Json\":\"{\\\"name\\\":\\\"Charging\\\",\\\"default\\\":\\\"true\\\",\\\"description\\\":\\\"Charging Status\\\",\\\"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\":\"true\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1744388189}],"LanguageId":null,"Tags":[]},{"Id":11825,"Group":{"Id":7004,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7000,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7001,"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":7002,"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":7007,"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":[]},{"Id":7008,"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":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7009,"Name":"Alert 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":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":7029,"Name":"Welfare","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7010,"Name":"Additional 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":7019,"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":7022,"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":7023,"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":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","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":[{"Id":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7005,"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":7015,"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":[]}]},{"Id":7006,"Name":"Read Additional 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":7016,"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":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7021,"Name":"Read Non Movement 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":7030,"Name":"Read Welfare Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7013,"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":[]}]},"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\":3}","Default":"","Command":null,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":11825,\"Group\":{\"Id\":7004,\"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\\\":1}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1744388165}],"LanguageId":null,"Tags":[]},{"Id":11824,"Group":{"Id":7004,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7000,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7001,"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":7002,"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":7007,"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":[]},{"Id":7008,"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":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7009,"Name":"Alert 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":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":7029,"Name":"Welfare","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7010,"Name":"Additional 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":7019,"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":7022,"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":7023,"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":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","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":[{"Id":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7005,"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":7015,"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":[]}]},{"Id":7006,"Name":"Read Additional 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":7016,"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":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7021,"Name":"Read Non Movement 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":7030,"Name":"Read Welfare Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7013,"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":[]}]},"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\"],\"order\":2}","Default":"","Command":null,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":11824,\"Group\":{\"Id\":7004,\"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\\\":\\\"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\\\"],\\\"order\\\":0}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1744388162}],"LanguageId":null,"Tags":[]},{"Id":11822,"Group":{"Id":7005,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7000,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7001,"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":7002,"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":7007,"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":[]},{"Id":7008,"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":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7009,"Name":"Alert 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":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":7029,"Name":"Welfare","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7010,"Name":"Additional 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":7019,"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":7022,"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":7023,"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":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","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":[{"Id":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7006,"Name":"Read Additional 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":7016,"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":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7021,"Name":"Read Non Movement 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":7030,"Name":"Read Welfare Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7013,"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":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7015,"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":"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":11821,"Group":{"Id":7005,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7000,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7001,"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":7002,"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":7007,"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":[]},{"Id":7008,"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":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7009,"Name":"Alert 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":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":7029,"Name":"Welfare","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7010,"Name":"Additional 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":7019,"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":7022,"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":7023,"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":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","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":[{"Id":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7006,"Name":"Read Additional 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":7016,"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":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7021,"Name":"Read Non Movement 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":7030,"Name":"Read Welfare Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7013,"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":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7015,"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":"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":11823,"Group":{"Id":7005,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7000,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7001,"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":7002,"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":7007,"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":[]},{"Id":7008,"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":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7009,"Name":"Alert 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":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":7029,"Name":"Welfare","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7010,"Name":"Additional 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":7019,"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":7022,"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":7023,"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":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","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":[{"Id":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7006,"Name":"Read Additional 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":7016,"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":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7021,"Name":"Read Non Movement 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":7030,"Name":"Read Welfare Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7013,"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":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7015,"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":"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":11820,"Group":{"Id":7006,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7000,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7001,"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":7002,"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":7007,"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":[]},{"Id":7008,"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":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7009,"Name":"Alert 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":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":7029,"Name":"Welfare","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7010,"Name":"Additional 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":7019,"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":7022,"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":7023,"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":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","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":[{"Id":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7005,"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":7015,"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":[]}]},{"Id":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7021,"Name":"Read Non Movement 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":7030,"Name":"Read Welfare Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7013,"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":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7016,"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":[{"Type":1,"NewValue":"{\"Id\":11820,\"Group\":{\"Id\":7006,\"Name\":\"Read Additional 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\":[]},\"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\":[],\"Tags\":[]}","Timestamp":1740078115},{"Type":2,"NewValue":"{\"Id\":11820,\"Group\":{\"Id\":7006,\"Name\":\"Read Additional 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\":[]},\"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\":{\"Id\":5428,\"Protocol\":{\"Id\":253,\"Code\":\"Access PS Sentry\",\"Version\":\"0.3\",\"FirmwareVersion\":\"V04b.8601.2411.1.0.16.4411.2409.25\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"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}\",\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":true,\"SendAttempts\":3,\"Order\":null},\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1740078119}],"LanguageId":null,"Tags":[]},{"Id":11831,"Group":{"Id":7006,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7000,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7001,"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":7002,"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":7007,"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":[]},{"Id":7008,"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":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7009,"Name":"Alert 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":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":7029,"Name":"Welfare","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7010,"Name":"Additional 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":7019,"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":7022,"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":7023,"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":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","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":[{"Id":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7005,"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":7015,"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":[]}]},{"Id":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7021,"Name":"Read Non Movement 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":7030,"Name":"Read Welfare Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7013,"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":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7016,"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":[{"Type":1,"NewValue":"{\"Id\":11831,\"Group\":{\"Id\":7006,\"Name\":\"Read Additional 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\":[]},\"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\":[],\"Tags\":[]}","Timestamp":1740078087},{"Type":2,"NewValue":"{\"Id\":11831,\"Group\":{\"Id\":7006,\"Name\":\"Read Additional 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\":[]},\"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\":{\"Id\":5430,\"Protocol\":{\"Id\":253,\"Code\":\"Access PS Sentry\",\"Version\":\"0.3\",\"FirmwareVersion\":\"V04b.8601.2411.1.0.16.4411.2409.25\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"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}\",\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":true,\"SendAttempts\":3,\"Order\":null},\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1740078091}],"LanguageId":null,"Tags":[]},{"Id":11841,"Group":{"Id":7007,"Name":"System Settings","Json":{"description":"","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7002,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7000,"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":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7005,"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":7015,"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":[]}]},{"Id":7006,"Name":"Read Additional 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":7016,"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":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7021,"Name":"Read Non Movement 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":7030,"Name":"Read Welfare Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7013,"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":[]}]},{"Id":7001,"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":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7008,"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":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7009,"Name":"Alert 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":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":7029,"Name":"Welfare","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7010,"Name":"Additional 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":7019,"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":7022,"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":7023,"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":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","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":"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\":11841,\"Group\":{\"Id\":7007,\"Name\":\"System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":6,\"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\\\":[{\\\"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\\\"],\\\"order\\\":4}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1749742987},{"Type":1,"NewValue":"{\"Id\":11841,\"Group\":{\"Id\":7007,\"Name\":\"System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":6,\"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\\\":[{\\\"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\\\"],\\\"order\\\":5}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1749743069},{"Type":1,"NewValue":"{\"Id\":11841,\"Group\":{\"Id\":7007,\"Name\":\"System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":6,\"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\\\":[{\\\"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\\\"],\\\"order\\\":6}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1749743083},{"Type":1,"NewValue":"{\"Id\":11841,\"Group\":{\"Id\":7007,\"Name\":\"System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":6,\"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":1776189115}],"LanguageId":null,"Tags":[]},{"Id":11835,"Group":{"Id":7007,"Name":"System Settings","Json":{"description":"","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7002,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7000,"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":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7005,"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":7015,"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":[]}]},{"Id":7006,"Name":"Read Additional 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":7016,"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":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7021,"Name":"Read Non Movement 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":7030,"Name":"Read Welfare Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7013,"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":[]}]},{"Id":7001,"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":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7008,"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":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7009,"Name":"Alert 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":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":7029,"Name":"Welfare","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7010,"Name":"Additional 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":7019,"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":7022,"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":7023,"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":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","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":"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":[{"Type":1,"NewValue":"{\"Id\":11835,\"Group\":{\"Id\":7007,\"Name\":\"System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":6,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"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\\\"],\\\"order\\\":1}\",\"Default\":\"true\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1749742978}],"LanguageId":null,"Tags":[]},{"Id":11837,"Group":{"Id":7007,"Name":"System Settings","Json":{"description":"","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7002,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7000,"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":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7005,"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":7015,"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":[]}]},{"Id":7006,"Name":"Read Additional 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":7016,"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":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7021,"Name":"Read Non Movement 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":7030,"Name":"Read Welfare Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7013,"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":[]}]},{"Id":7001,"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":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7008,"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":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7009,"Name":"Alert 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":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":7029,"Name":"Welfare","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7010,"Name":"Additional 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":7019,"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":7022,"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":7023,"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":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","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":"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":[{"Type":1,"NewValue":"{\"Id\":11837,\"Group\":{\"Id\":7007,\"Name\":\"System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":6,\"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\\\":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\\\"],\\\"order\\\":5}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1749742990},{"Type":1,"NewValue":"{\"Id\":11837,\"Group\":{\"Id\":7007,\"Name\":\"System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":6,\"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\\\":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\\\"],\\\"order\\\":6}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1749743073},{"Type":1,"NewValue":"{\"Id\":11837,\"Group\":{\"Id\":7007,\"Name\":\"System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":6,\"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\\\":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\\\"],\\\"order\\\":5}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1749743080},{"Type":1,"NewValue":"{\"Id\":11837,\"Group\":{\"Id\":7007,\"Name\":\"System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":6,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"System Voice Prompt Volume\",\"Json\":\"{\\\"name\\\":\\\"System Voice Prompt Volume\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"System Voice Prompt 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 voice prompt from 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\":[]}","Timestamp":1749743751},{"Type":2,"NewValue":"{\"Id\":11837,\"Group\":{\"Id\":7007,\"Name\":\"System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":6,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"System Voice Prompt Volume\",\"Json\":\"{\\\"name\\\":\\\"System Voice Prompt Volume\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"System Voice Prompt 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 voice prompt from 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\":{\"Id\":5439,\"Protocol\":{\"Id\":253,\"Code\":\"Access PS Sentry\",\"Version\":\"1.2\",\"FirmwareVersion\":\"V04b.8601.2411.1.0.16.4411.2409.25\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"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}\",\"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":1749743756},{"Type":2,"NewValue":"{\"Id\":11837,\"Group\":{\"Id\":7007,\"Name\":\"System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":6,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"System Voice Prompt Volume\",\"Json\":\"{\\\"name\\\":\\\"System Voice Prompt Volume\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"System Voice Prompt 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 voice prompt from 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\":{\"Id\":5446,\"Protocol\":{\"Id\":253,\"Code\":\"Access PS Sentry\",\"Version\":\"1.2\",\"FirmwareVersion\":\"V04b.8601.2411.1.0.16.4411.2409.25\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"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}\",\"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":1749743760},{"Type":1,"NewValue":"{\"Id\":11837,\"Group\":{\"Id\":7007,\"Name\":\"System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":6,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"System Voice Prompt Volume\",\"Json\":\"{\\\"name\\\":\\\"System Voice Prompt Volume\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"System Voice Prompt 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 voice prompt from 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\\\"],\\\"order\\\":5}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1749744654},{"Type":1,"NewValue":"{\"Id\":11837,\"Group\":{\"Id\":7007,\"Name\":\"System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":6,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"System Voice Prompt Volume\",\"Json\":\"{\\\"name\\\":\\\"System Voice Prompt Volume\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"System Voice Prompt 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 voice prompt from 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\\\"],\\\"order\\\":4}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1749744677},{"Type":1,"NewValue":"{\"Id\":11837,\"Group\":{\"Id\":7007,\"Name\":\"System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":6,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Notifications and Alerts\",\"Json\":\"{\\\"name\\\":\\\"Notifications and Alerts\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Notifications and Alerts\\\",\\\"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 Notifications and Alerts from 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\":[]}","Timestamp":1750176335}],"LanguageId":null,"Tags":[]},{"Id":11842,"Group":{"Id":7007,"Name":"System Settings","Json":{"description":"","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7002,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7000,"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":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7005,"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":7015,"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":[]}]},{"Id":7006,"Name":"Read Additional 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":7016,"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":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7021,"Name":"Read Non Movement 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":7030,"Name":"Read Welfare Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7013,"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":[]}]},{"Id":7001,"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":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7008,"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":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7009,"Name":"Alert 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":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":7029,"Name":"Welfare","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7010,"Name":"Additional 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":7019,"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":7022,"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":7023,"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":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","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":"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":[{"Type":1,"NewValue":"{\"Id\":11842,\"Group\":{\"Id\":7007,\"Name\":\"System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":6,\"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\\\":\\\"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\\\"],\\\"order\\\":0}\",\"Default\":\"true\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1749742974}],"LanguageId":null,"Tags":[]},{"Id":11834,"Group":{"Id":7008,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7002,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7000,"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":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7005,"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":7015,"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":[]}]},{"Id":7006,"Name":"Read Additional 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":7016,"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":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7021,"Name":"Read Non Movement 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":7030,"Name":"Read Welfare Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7013,"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":[]}]},{"Id":7001,"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":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7007,"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":[]},{"Id":7009,"Name":"Alert 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":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":7029,"Name":"Welfare","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7010,"Name":"Additional 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":7019,"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":7022,"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":7023,"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":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","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":[{"Id":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"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\":\"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":[],"LanguageId":null,"Tags":[]},{"Id":11838,"Group":{"Id":7008,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7002,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7000,"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":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7005,"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":7015,"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":[]}]},{"Id":7006,"Name":"Read Additional 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":7016,"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":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7021,"Name":"Read Non Movement 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":7030,"Name":"Read Welfare Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7013,"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":[]}]},{"Id":7001,"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":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7007,"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":[]},{"Id":7009,"Name":"Alert 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":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":7029,"Name":"Welfare","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7010,"Name":"Additional 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":7019,"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":7022,"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":7023,"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":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","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":[{"Id":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"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\":\"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":[],"LanguageId":null,"Tags":[]},{"Id":11839,"Group":{"Id":7008,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7002,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7000,"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":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7005,"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":7015,"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":[]}]},{"Id":7006,"Name":"Read Additional 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":7016,"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":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7021,"Name":"Read Non Movement 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":7030,"Name":"Read Welfare Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7013,"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":[]}]},{"Id":7001,"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":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7007,"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":[]},{"Id":7009,"Name":"Alert 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":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":7029,"Name":"Welfare","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7010,"Name":"Additional 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":7019,"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":7022,"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":7023,"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":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","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":[{"Id":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"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\":\"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\"},{\"label\":\"Esendex Protocol-Dev\",\"value\":\"00447908675874,Esendex Protocol-Dev\"},{\"label\":\"default\",\"value\":\"default\"}],\"toTranslate\":[\"name\",\"description\",\"helpText\",\"label\"]}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":11863,"Group":{"Id":7009,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7002,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7000,"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":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7005,"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":7015,"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":[]}]},{"Id":7006,"Name":"Read Additional 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":7016,"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":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7021,"Name":"Read Non Movement 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":7030,"Name":"Read Welfare Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7013,"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":[]}]},{"Id":7001,"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":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7007,"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":[]},{"Id":7008,"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":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7010,"Name":"Additional 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":7019,"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":7022,"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":7023,"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":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","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":[{"Id":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":7029,"Name":"Welfare","Json":{"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":"Report Mode","Json":"{\"name\":\"Report Mode\",\"default\":\"\",\"description\":\"Report Mode\",\"type\":\"radioGroup\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"\",\"options\":[{\"label\":\"Data & Call\",\"value\":\"1\"},{\"label\":\"Data Only\",\"value\":\"0\"}],\"toTranslate\":[\"name\",\"description\",\"helpText\",\"label\"]}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":11836,"Group":{"Id":7009,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7002,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7000,"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":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7005,"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":7015,"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":[]}]},{"Id":7006,"Name":"Read Additional 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":7016,"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":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7021,"Name":"Read Non Movement 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":7030,"Name":"Read Welfare Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7013,"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":[]}]},{"Id":7001,"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":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7007,"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":[]},{"Id":7008,"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":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7010,"Name":"Additional 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":7019,"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":7022,"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":7023,"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":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","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":[{"Id":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":7029,"Name":"Welfare","Json":{"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":11828,"Group":{"Id":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7000,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7001,"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":7002,"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":7007,"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":[]},{"Id":7008,"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":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7009,"Name":"Alert 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":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":7029,"Name":"Welfare","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7010,"Name":"Additional 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":7019,"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":7022,"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":7023,"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":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","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":[{"Id":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7005,"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":7015,"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":[]}]},{"Id":7006,"Name":"Read Additional 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":7016,"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":7013,"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":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7021,"Name":"Read Non Movement 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":7030,"Name":"Read Welfare Settings","Json":{"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\":\"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\"],\"order\":0}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":11826,"Group":{"Id":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7000,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7001,"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":7002,"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":7007,"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":[]},{"Id":7008,"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":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7009,"Name":"Alert 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":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":7029,"Name":"Welfare","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7010,"Name":"Additional 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":7019,"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":7022,"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":7023,"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":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","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":[{"Id":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7005,"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":7015,"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":[]}]},{"Id":7006,"Name":"Read Additional 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":7016,"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":7013,"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":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7021,"Name":"Read Non Movement 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":7030,"Name":"Read Welfare Settings","Json":{"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 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\"],\"order\":3}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":11827,"Group":{"Id":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7000,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7001,"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":7002,"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":7007,"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":[]},{"Id":7008,"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":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7009,"Name":"Alert 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":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":7029,"Name":"Welfare","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7010,"Name":"Additional 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":7019,"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":7022,"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":7023,"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":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","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":[{"Id":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7005,"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":7015,"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":[]}]},{"Id":7006,"Name":"Read Additional 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":7016,"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":7013,"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":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7021,"Name":"Read Non Movement 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":7030,"Name":"Read Welfare Settings","Json":{"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":"{\"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\"],\"order\":2}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":11865,"Group":{"Id":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7000,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7001,"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":7002,"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":7007,"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":[]},{"Id":7008,"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":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7009,"Name":"Alert 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":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":7029,"Name":"Welfare","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7010,"Name":"Additional 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":7019,"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":7022,"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":7023,"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":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","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":[{"Id":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7005,"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":7015,"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":[]}]},{"Id":7006,"Name":"Read Additional 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":7016,"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":7013,"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":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7021,"Name":"Read Non Movement 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":7030,"Name":"Read Welfare Settings","Json":{"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":"Report Mode","Json":"{\"name\":\"Report Mode\",\"default\":\"\",\"description\":\"Current Report Mode\",\"type\":\"radioGroup\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":true,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":null,\"options\":[{\"label\":\"Data & Call\",\"value\":\"1\"},{\"label\":\"Data Only\",\"value\":\"0\"}],\"toTranslate\":[\"name\",\"description\",\"helpText\",\"label\"]}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":11833,"Group":{"Id":7012,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7002,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7000,"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":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7005,"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":7015,"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":[]}]},{"Id":7006,"Name":"Read Additional 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":7016,"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":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7021,"Name":"Read Non Movement 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":7030,"Name":"Read Welfare Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7013,"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":[]}]},{"Id":7001,"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":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7007,"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":[]},{"Id":7008,"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":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7009,"Name":"Alert 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":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":7029,"Name":"Welfare","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7010,"Name":"Additional 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":7019,"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":7022,"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":7023,"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":[]}]}]},"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":11840,"Group":{"Id":7013,"Name":"Read System Settings","Json":{"description":"","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7000,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7001,"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":7002,"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":7007,"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":[]},{"Id":7008,"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":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7009,"Name":"Alert 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":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":7029,"Name":"Welfare","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7010,"Name":"Additional 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":7019,"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":7022,"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":7023,"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":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","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":[{"Id":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7005,"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":7015,"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":[]}]},{"Id":7006,"Name":"Read Additional 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":7016,"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":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7021,"Name":"Read Non Movement 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":7030,"Name":"Read Welfare Settings","Json":{"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":"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":[{"Type":1,"NewValue":"{\"Id\":11840,\"Group\":{\"Id\":7013,\"Name\":\"Read System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":6,\"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\\\"],\\\"order\\\":2}\",\"Default\":\"true\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1749744514},{"Type":1,"NewValue":"{\"Id\":11840,\"Group\":{\"Id\":7013,\"Name\":\"Read System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":6,\"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\\\"],\\\"order\\\":3}\",\"Default\":\"true\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1749744861},{"Type":1,"NewValue":"{\"Id\":11840,\"Group\":{\"Id\":7013,\"Name\":\"Read System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":6,\"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\\\"],\\\"order\\\":1}\",\"Default\":\"true\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1749744870}],"LanguageId":null,"Tags":[]},{"Id":11829,"Group":{"Id":7013,"Name":"Read System Settings","Json":{"description":"","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7000,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7001,"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":7002,"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":7007,"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":[]},{"Id":7008,"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":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7009,"Name":"Alert 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":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":7029,"Name":"Welfare","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7010,"Name":"Additional 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":7019,"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":7022,"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":7023,"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":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","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":[{"Id":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7005,"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":7015,"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":[]}]},{"Id":7006,"Name":"Read Additional 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":7016,"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":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7021,"Name":"Read Non Movement 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":7030,"Name":"Read Welfare Settings","Json":{"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":"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":[{"Type":1,"NewValue":"{\"Id\":11829,\"Group\":{\"Id\":7013,\"Name\":\"Read System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":6,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"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\\\":3}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1749744518},{"Type":1,"NewValue":"{\"Id\":11829,\"Group\":{\"Id\":7013,\"Name\":\"Read System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":6,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"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\\\":4}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1749744540},{"Type":1,"NewValue":"{\"Id\":11829,\"Group\":{\"Id\":7013,\"Name\":\"Read System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":6,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"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\\\":5}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1749745264},{"Type":1,"NewValue":"{\"Id\":11829,\"Group\":{\"Id\":7013,\"Name\":\"Read System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":6,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"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\\\":6}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1749745298}],"LanguageId":null,"Tags":[]},{"Id":11830,"Group":{"Id":7013,"Name":"Read System Settings","Json":{"description":"","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7000,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7001,"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":7002,"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":7007,"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":[]},{"Id":7008,"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":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7009,"Name":"Alert 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":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":7029,"Name":"Welfare","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7010,"Name":"Additional 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":7019,"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":7022,"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":7023,"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":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","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":[{"Id":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7005,"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":7015,"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":[]}]},{"Id":7006,"Name":"Read Additional 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":7016,"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":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7021,"Name":"Read Non Movement 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":7030,"Name":"Read Welfare Settings","Json":{"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":"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":[{"Type":1,"NewValue":"{\"Id\":11830,\"Group\":{\"Id\":7013,\"Name\":\"Read System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":6,\"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\\\"],\\\"order\\\":0}\",\"Default\":\"true\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1749744507}],"LanguageId":null,"Tags":[]},{"Id":11843,"Group":{"Id":7013,"Name":"Read System Settings","Json":{"description":"","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7000,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7001,"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":7002,"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":7007,"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":[]},{"Id":7008,"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":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7009,"Name":"Alert 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":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":7029,"Name":"Welfare","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7010,"Name":"Additional 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":7019,"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":7022,"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":7023,"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":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","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":[{"Id":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7005,"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":7015,"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":[]}]},{"Id":7006,"Name":"Read Additional 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":7016,"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":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7021,"Name":"Read Non Movement 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":7030,"Name":"Read Welfare Settings","Json":{"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":"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":[{"Type":1,"NewValue":"{\"Id\":11843,\"Group\":{\"Id\":7013,\"Name\":\"Read System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":6,\"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\\\"],\\\"order\\\":1}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1749744511},{"Type":1,"NewValue":"{\"Id\":11843,\"Group\":{\"Id\":7013,\"Name\":\"Read System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":6,\"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\\\"],\\\"order\\\":2}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1749744858},{"Type":1,"NewValue":"{\"Id\":11843,\"Group\":{\"Id\":7013,\"Name\":\"Read System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":6,\"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\\\"],\\\"order\\\":3}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1749744877},{"Type":1,"NewValue":"{\"Id\":11843,\"Group\":{\"Id\":7013,\"Name\":\"Read System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":6,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"System Voice Prompt Volume\",\"Json\":\"{\\\"name\\\":\\\"System Voice Prompt Volume\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"System Voice Prompt 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\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1749744942},{"Type":1,"NewValue":"{\"Id\":11843,\"Group\":{\"Id\":7013,\"Name\":\"Read System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":6,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"System Voice Prompt Volume\",\"Json\":\"{\\\"name\\\":\\\"System Voice Prompt Volume\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"System Voice Prompt 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\\\"],\\\"order\\\":6}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1749745268},{"Type":1,"NewValue":"{\"Id\":11843,\"Group\":{\"Id\":7013,\"Name\":\"Read System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":6,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"System Voice Prompt Volume\",\"Json\":\"{\\\"name\\\":\\\"System Voice Prompt Volume\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"System Voice Prompt 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\\\"],\\\"order\\\":4}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1749745291},{"Type":1,"NewValue":"{\"Id\":11843,\"Group\":{\"Id\":7013,\"Name\":\"Read System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":6,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"System Voice Prompt Volume\",\"Json\":\"{\\\"name\\\":\\\"System Voice Prompt Volume\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"System Voice Prompt 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\\\"],\\\"order\\\":5}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1750176365},{"Type":1,"NewValue":"{\"Id\":11843,\"Group\":{\"Id\":7013,\"Name\":\"Read System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":6,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Notifications and Alerts\",\"Json\":\"{\\\"name\\\":\\\"Notifications and Alerts\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Notifications and Alerts\\\",\\\"type\\\":\\\"radioGroup\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":true,\\\"isHidden\\\":false,\\\"minLength\\\":1,\\\"maxLength\\\":100,\\\"helpText\\\":\\\"\\\",\\\"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\":[]}","Timestamp":1750176391}],"LanguageId":null,"Tags":[]},{"Id":11850,"Group":{"Id":7014,"Name":"WiFi List","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":{"Id":7008,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7002,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7000,"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":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7005,"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":7015,"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":[]}]},{"Id":7006,"Name":"Read Additional 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":7016,"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":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7021,"Name":"Read Non Movement 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":7030,"Name":"Read Welfare Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7013,"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":[]}]},{"Id":7001,"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":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7007,"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":[]},{"Id":7009,"Name":"Alert 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":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":7029,"Name":"Welfare","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7010,"Name":"Additional 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":7019,"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":7022,"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":7023,"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":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","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":[]},"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"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":[],"LanguageId":null,"Tags":[]},{"Id":11851,"Group":{"Id":7014,"Name":"WiFi List","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":{"Id":7008,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7002,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7000,"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":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7005,"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":7015,"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":[]}]},{"Id":7006,"Name":"Read Additional 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":7016,"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":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7021,"Name":"Read Non Movement 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":7030,"Name":"Read Welfare Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7013,"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":[]}]},{"Id":7001,"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":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7007,"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":[]},{"Id":7009,"Name":"Alert 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":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":7029,"Name":"Welfare","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7010,"Name":"Additional 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":7019,"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":7022,"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":7023,"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":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","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":[]},"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"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":[],"LanguageId":null,"Tags":[]},{"Id":11846,"Group":{"Id":7015,"Name":"Read WiFi List","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7005,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7000,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7001,"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":7002,"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":7007,"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":[]},{"Id":7008,"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":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7009,"Name":"Alert 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":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":7029,"Name":"Welfare","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7010,"Name":"Additional 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":7019,"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":7022,"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":7023,"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":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","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":[{"Id":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7006,"Name":"Read Additional 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":7016,"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":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7021,"Name":"Read Non Movement 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":7030,"Name":"Read Welfare Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7013,"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":[]}]},"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\":\"SSID and password configurated in the device.\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":11844,"Group":{"Id":7016,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7006,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7000,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7001,"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":7002,"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":7007,"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":[]},{"Id":7008,"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":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7009,"Name":"Alert 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":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":7029,"Name":"Welfare","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7010,"Name":"Additional 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":7019,"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":7022,"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":7023,"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":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","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":[{"Id":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7005,"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":7015,"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":[]}]},{"Id":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7021,"Name":"Read Non Movement 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":7030,"Name":"Read Welfare Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7013,"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":[]}]},"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":11845,"Group":{"Id":7016,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7006,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7000,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7001,"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":7002,"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":7007,"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":[]},{"Id":7008,"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":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7009,"Name":"Alert 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":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":7029,"Name":"Welfare","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7010,"Name":"Additional 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":7019,"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":7022,"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":7023,"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":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","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":[{"Id":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7005,"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":7015,"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":[]}]},{"Id":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7021,"Name":"Read Non Movement 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":7030,"Name":"Read Welfare Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7013,"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":[]}]},"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\":\"The number called when the Speed Dial button is pushed on the device\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":11855,"Group":{"Id":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7009,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7002,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7000,"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":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7005,"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":7015,"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":[]}]},{"Id":7006,"Name":"Read Additional 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":7016,"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":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7021,"Name":"Read Non Movement 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":7030,"Name":"Read Welfare Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7013,"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":[]}]},{"Id":7001,"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":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7007,"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":[]},{"Id":7008,"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":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7010,"Name":"Additional 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":7019,"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":7022,"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":7023,"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":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","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":[{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":7029,"Name":"Welfare","Json":{"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 Man Down Settings","Json":"{\"name\":\"Enable Disable Man Down Settings\",\"default\":\"true\",\"description\":\"Toggle Man Down 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 Man Down and breaches the specified sensitivity setting\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"true","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":11944,"Group":{"Id":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7009,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7002,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7000,"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":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7005,"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":7015,"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":[]}]},{"Id":7006,"Name":"Read Additional 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":7016,"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":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7021,"Name":"Read Non Movement 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":7030,"Name":"Read Welfare Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7013,"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":[]}]},{"Id":7001,"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":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7007,"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":[]},{"Id":7008,"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":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7010,"Name":"Additional 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":7019,"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":7022,"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":7023,"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":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","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":[{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":7029,"Name":"Welfare","Json":{"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":"Tilt Timeout","Json":"{\"name\":\"Tilt Timeout\",\"default\":\"\",\"description\":\"Tilt Timeout\",\"type\":\"radioGroup\",\"suffix\":\"degrees\",\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Select Tilt Timeout\",\"options\":[{\"label\":\"10s\",\"value\":\"10\"},{\"label\":\"30s\",\"value\":\"30\"},{\"label\":\"60s\",\"value\":\"60\"}],\"toTranslate\":[\"name\",\"description\",\"helpText\",\"label\"]}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":11864,"Group":{"Id":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7009,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7002,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7000,"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":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7005,"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":7015,"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":[]}]},{"Id":7006,"Name":"Read Additional 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":7016,"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":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7021,"Name":"Read Non Movement 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":7030,"Name":"Read Welfare Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7013,"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":[]}]},{"Id":7001,"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":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7007,"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":[]},{"Id":7008,"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":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7010,"Name":"Additional 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":7019,"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":7022,"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":7023,"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":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","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":[{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":7029,"Name":"Welfare","Json":{"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":"Tilt Angle","Json":"{\"name\":\"Tilt Angle\",\"default\":\"\",\"description\":\"Tilt Angle\",\"type\":\"radioGroup\",\"suffix\":\"degrees\",\"prefix\":null,\"min\":10,\"max\":90,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Select Tilt Angle\",\"options\":[{\"label\":\"Off\",\"value\":\"0\"},{\"label\":\"45º\",\"value\":\"45\"},{\"label\":\"90º\",\"value\":\"90\"}],\"toTranslate\":[\"name\",\"description\",\"helpText\",\"label\"]}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":11854,"Group":{"Id":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7009,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7002,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7000,"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":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7005,"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":7015,"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":[]}]},{"Id":7006,"Name":"Read Additional 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":7016,"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":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7021,"Name":"Read Non Movement 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":7030,"Name":"Read Welfare Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7013,"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":[]}]},{"Id":7001,"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":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7007,"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":[]},{"Id":7008,"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":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7010,"Name":"Additional 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":7019,"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":7022,"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":7023,"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":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","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":[{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":7029,"Name":"Welfare","Json":{"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\":\"Fall 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":11857,"Group":{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7009,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7002,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7000,"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":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7005,"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":7015,"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":[]}]},{"Id":7006,"Name":"Read Additional 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":7016,"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":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7021,"Name":"Read Non Movement 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":7030,"Name":"Read Welfare Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7013,"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":[]}]},{"Id":7001,"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":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7007,"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":[]},{"Id":7008,"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":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7010,"Name":"Additional 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":7019,"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":7022,"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":7023,"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":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","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":[{"Id":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":7029,"Name":"Welfare","Json":{"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":[],"LanguageId":null,"Tags":[{"Id":2155,"Name":"noActivityInterval","BackendAction":"noActivityInterval","Value":""}]},{"Id":11856,"Group":{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7009,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7002,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7000,"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":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7005,"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":7015,"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":[]}]},{"Id":7006,"Name":"Read Additional 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":7016,"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":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7021,"Name":"Read Non Movement 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":7030,"Name":"Read Welfare Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7013,"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":[]}]},{"Id":7001,"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":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7007,"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":[]},{"Id":7008,"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":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7010,"Name":"Additional 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":7019,"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":7022,"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":7023,"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":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","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":[{"Id":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":7029,"Name":"Welfare","Json":{"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":[],"LanguageId":null,"Tags":[{"Id":2154,"Name":"activateNoActivity","BackendAction":"activateNoActivity","Value":""}]},{"Id":11858,"Group":{"Id":7019,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7010,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7002,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7000,"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":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7005,"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":7015,"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":[]}]},{"Id":7006,"Name":"Read Additional 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":7016,"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":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7021,"Name":"Read Non Movement 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":7030,"Name":"Read Welfare Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7013,"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":[]}]},{"Id":7001,"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":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7007,"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":[]},{"Id":7008,"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":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7009,"Name":"Alert 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":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":7029,"Name":"Welfare","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","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":[{"Id":7022,"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":7023,"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":[]}]},"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":[],"LanguageId":null,"Tags":[]},{"Id":11859,"Group":{"Id":7019,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7010,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7002,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7000,"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":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7005,"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":7015,"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":[]}]},{"Id":7006,"Name":"Read Additional 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":7016,"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":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7021,"Name":"Read Non Movement 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":7030,"Name":"Read Welfare Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7013,"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":[]}]},{"Id":7001,"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":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7007,"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":[]},{"Id":7008,"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":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7009,"Name":"Alert 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":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":7029,"Name":"Welfare","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","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":[{"Id":7022,"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":7023,"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":[]}]},"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":11866,"Group":{"Id":7020,"Name":"Read Man Down Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7000,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7001,"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":7002,"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":7007,"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":[]},{"Id":7008,"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":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7009,"Name":"Alert 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":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":7029,"Name":"Welfare","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7010,"Name":"Additional 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":7019,"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":7022,"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":7023,"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":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","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":[{"Id":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7005,"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":7015,"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":[]}]},{"Id":7006,"Name":"Read Additional 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":7016,"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":7013,"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":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7021,"Name":"Read Non Movement 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":7030,"Name":"Read Welfare Settings","Json":{"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":"Tilt Angle","Json":"{\"name\":\"Tilt Angle\",\"default\":\"\",\"description\":\"Current Tilt Angle\",\"type\":\"radioGroup\",\"suffix\":\"degress\",\"prefix\":null,\"min\":10,\"max\":90,\"futureOnly\":false,\"integerOnly\":true,\"isReadOnly\":true,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":null,\"options\":[{\"label\":\"Off\",\"value\":\"0\"},{\"label\":\"45º\",\"value\":\"45\"},{\"label\":\"90º\",\"value\":\"90\"}],\"toTranslate\":[\"name\",\"description\",\"helpText\",\"label\"]}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":11848,"Group":{"Id":7020,"Name":"Read Man Down Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7000,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7001,"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":7002,"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":7007,"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":[]},{"Id":7008,"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":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7009,"Name":"Alert 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":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":7029,"Name":"Welfare","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7010,"Name":"Additional 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":7019,"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":7022,"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":7023,"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":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","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":[{"Id":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7005,"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":7015,"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":[]}]},{"Id":7006,"Name":"Read Additional 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":7016,"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":7013,"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":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7021,"Name":"Read Non Movement 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":7030,"Name":"Read Welfare Settings","Json":{"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\":\"Fall 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\"},{\"value\":\"6\",\"label\":\"Medium\"},{\"value\":\"9\",\"label\":\"High\"}],\"toTranslate\":[\"name\",\"description\",\"helpText\",\"label\"]}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":11847,"Group":{"Id":7020,"Name":"Read Man Down Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7000,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7001,"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":7002,"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":7007,"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":[]},{"Id":7008,"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":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7009,"Name":"Alert 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":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":7029,"Name":"Welfare","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7010,"Name":"Additional 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":7019,"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":7022,"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":7023,"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":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","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":[{"Id":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7005,"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":7015,"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":[]}]},{"Id":7006,"Name":"Read Additional 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":7016,"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":7013,"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":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7021,"Name":"Read Non Movement 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":7030,"Name":"Read Welfare Settings","Json":{"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 Man Down Settings","Json":"{\"name\":\"Enable Disable Man Down Settings\",\"default\":\"true\",\"description\":\"Enable Disable Man Down 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 Man Down Settings\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"true","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":11943,"Group":{"Id":7020,"Name":"Read Man Down Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7000,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7001,"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":7002,"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":7007,"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":[]},{"Id":7008,"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":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7009,"Name":"Alert 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":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":7029,"Name":"Welfare","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7010,"Name":"Additional 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":7019,"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":7022,"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":7023,"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":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","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":[{"Id":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7005,"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":7015,"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":[]}]},{"Id":7006,"Name":"Read Additional 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":7016,"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":7013,"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":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7021,"Name":"Read Non Movement 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":7030,"Name":"Read Welfare Settings","Json":{"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":"Tilt Timeout","Json":"{\"name\":\"Tilt Timeout\",\"default\":\"\",\"description\":\"Current Tilt Timeout\",\"type\":\"radioGroup\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":true,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":null,\"options\":[{\"label\":\"10s\",\"value\":\"10\"},{\"label\":\"30s\",\"value\":\"30\"},{\"label\":\"60s\",\"value\":\"60\"}],\"toTranslate\":[\"name\",\"description\",\"helpText\",\"label\"]}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":11862,"Group":{"Id":7021,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7000,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7001,"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":7002,"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":7007,"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":[]},{"Id":7008,"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":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7009,"Name":"Alert 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":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":7029,"Name":"Welfare","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7010,"Name":"Additional 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":7019,"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":7022,"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":7023,"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":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","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":[{"Id":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7005,"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":7015,"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":[]}]},{"Id":7006,"Name":"Read Additional 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":7016,"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":7013,"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":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7030,"Name":"Read Welfare Settings","Json":{"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":"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":11861,"Group":{"Id":7021,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7000,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7001,"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":7002,"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":7007,"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":[]},{"Id":7008,"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":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7009,"Name":"Alert 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":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":7029,"Name":"Welfare","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7010,"Name":"Additional 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":7019,"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":7022,"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":7023,"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":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","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":[{"Id":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7005,"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":7015,"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":[]}]},{"Id":7006,"Name":"Read Additional 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":7016,"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":7013,"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":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7030,"Name":"Read Welfare Settings","Json":{"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 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":11860,"Group":{"Id":7022,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":{"Id":7010,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7002,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7000,"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":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7005,"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":7015,"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":[]}]},{"Id":7006,"Name":"Read Additional 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":7016,"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":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7021,"Name":"Read Non Movement 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":7030,"Name":"Read Welfare Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7013,"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":[]}]},{"Id":7001,"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":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7007,"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":[]},{"Id":7008,"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":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7009,"Name":"Alert 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":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":7029,"Name":"Welfare","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","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":[{"Id":7019,"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":7023,"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":[]}]},"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":[],"LanguageId":null,"Tags":[]},{"Id":11849,"Group":{"Id":7023,"Name":"Approved Contacts","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":{"Id":7010,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7002,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7000,"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":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7005,"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":7015,"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":[]}]},{"Id":7006,"Name":"Read Additional 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":7016,"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":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7021,"Name":"Read Non Movement 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":7030,"Name":"Read Welfare Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7013,"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":[]}]},{"Id":7001,"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":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7007,"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":[]},{"Id":7008,"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":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7009,"Name":"Alert 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":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":7029,"Name":"Welfare","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","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":[{"Id":7019,"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":7022,"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":[]}]},"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":[],"LanguageId":null,"Tags":[]},{"Id":11853,"Group":{"Id":7024,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7009,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7002,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7000,"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":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7005,"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":7015,"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":[]}]},{"Id":7006,"Name":"Read Additional 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":7016,"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":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7021,"Name":"Read Non Movement 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":7030,"Name":"Read Welfare Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7013,"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":[]}]},{"Id":7001,"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":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7007,"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":[]},{"Id":7008,"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":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7010,"Name":"Additional 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":7019,"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":7022,"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":7023,"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":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","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":[{"Id":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7029,"Name":"Welfare","Json":{"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 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":11852,"Group":{"Id":7024,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7009,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7002,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7000,"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":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7005,"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":7015,"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":[]}]},{"Id":7006,"Name":"Read Additional 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":7016,"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":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7021,"Name":"Read Non Movement 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":7030,"Name":"Read Welfare Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7013,"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":[]}]},{"Id":7001,"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":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7007,"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":[]},{"Id":7008,"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":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7010,"Name":"Additional 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":7019,"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":7022,"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":7023,"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":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","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":[{"Id":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7029,"Name":"Welfare","Json":{"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":"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":11873,"Group":{"Id":7029,"Name":"Welfare","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7009,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7002,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7000,"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":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7005,"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":7015,"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":[]}]},{"Id":7006,"Name":"Read Additional 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":7016,"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":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7021,"Name":"Read Non Movement 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":7030,"Name":"Read Welfare Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7013,"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":[]}]},{"Id":7001,"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":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7007,"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":[]},{"Id":7008,"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":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7010,"Name":"Additional 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":7019,"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":7022,"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":7023,"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":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","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":[{"Id":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Prealarm","Json":"{\"name\":\"Prealarm\",\"default\":\"\",\"description\":\"Prealarm\",\"type\":\"number\",\"suffix\":\"minutes\",\"prefix\":null,\"min\":2,\"max\":10,\"futureOnly\":false,\"integerOnly\":true,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"min=2; max=10 [Time Out] - [Prealarm] must be >= 120 s.\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":11874,"Group":{"Id":7029,"Name":"Welfare","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7009,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7002,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7000,"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":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7005,"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":7015,"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":[]}]},{"Id":7006,"Name":"Read Additional 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":7016,"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":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7021,"Name":"Read Non Movement 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":7030,"Name":"Read Welfare Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7013,"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":[]}]},{"Id":7001,"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":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7007,"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":[]},{"Id":7008,"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":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7010,"Name":"Additional 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":7019,"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":7022,"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":7023,"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":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","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":[{"Id":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Timeout","Json":"{\"name\":\"Timeout\",\"default\":\"\",\"description\":\"Timeout\",\"type\":\"number\",\"suffix\":\"minutes\",\"prefix\":null,\"min\":10,\"max\":6000,\"futureOnly\":false,\"integerOnly\":true,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"min=10; max=6000 [Time Out] - [Prealarm] must be >= 120 s.\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":11976,"Group":{"Id":7029,"Name":"Welfare","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7009,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7002,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7000,"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":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7005,"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":7015,"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":[]}]},{"Id":7006,"Name":"Read Additional 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":7016,"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":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7021,"Name":"Read Non Movement 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":7030,"Name":"Read Welfare Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7013,"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":[]}]},{"Id":7001,"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":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7007,"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":[]},{"Id":7008,"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":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7010,"Name":"Additional 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":7019,"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":7022,"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":7023,"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":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","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":[{"Id":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Check","Json":"{\"name\":\"Check\",\"default\":\"\",\"description\":\"Check In/Out\",\"type\":\"radioGroup\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":true,\"minLength\":null,\"maxLength\":null,\"helpText\":null,\"options\":[{\"value\":\"01\",\"label\":\"Check In\"},{\"value\":\"00\",\"label\":\"Check Out\"}],\"toTranslate\":[\"name\",\"description\",\"helpText\",\"label\"]}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":11872,"Group":{"Id":7029,"Name":"Welfare","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7009,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7002,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7000,"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":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7005,"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":7015,"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":[]}]},{"Id":7006,"Name":"Read Additional 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":7016,"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":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7021,"Name":"Read Non Movement 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":7030,"Name":"Read Welfare Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7013,"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":[]}]},{"Id":7001,"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":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7007,"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":[]},{"Id":7008,"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":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7010,"Name":"Additional 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":7019,"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":7022,"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":7023,"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":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","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":[{"Id":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":[]}]},"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\":null,\"options\":[{\"value\":\"0\",\"label\":\"Amber Timer\"},{\"label\":\"Recurrent\",\"value\":\"1\"}],\"toTranslate\":[\"name\",\"description\",\"helpText\",\"label\"]}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":11871,"Group":{"Id":7029,"Name":"Welfare","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7009,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7002,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7000,"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":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7005,"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":7015,"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":[]}]},{"Id":7006,"Name":"Read Additional 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":7016,"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":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7021,"Name":"Read Non Movement 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":7030,"Name":"Read Welfare Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7013,"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":[]}]},{"Id":7001,"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":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7007,"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":[]},{"Id":7008,"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":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7010,"Name":"Additional 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":7019,"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":7022,"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":7023,"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":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","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":[{"Id":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Enable Disable Welfare","Json":"{\"name\":\"Enable Disable Welfare\",\"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":11870,"Group":{"Id":7030,"Name":"Read Welfare Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7000,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7001,"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":7002,"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":7007,"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":[]},{"Id":7008,"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":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7009,"Name":"Alert 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":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":7029,"Name":"Welfare","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7010,"Name":"Additional 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":7019,"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":7022,"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":7023,"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":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","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":[{"Id":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7005,"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":7015,"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":[]}]},{"Id":7006,"Name":"Read Additional 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":7016,"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":7013,"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":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7021,"Name":"Read Non Movement 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":"Timeout","Json":"{\"name\":\"Timeout\",\"default\":\"\",\"description\":\"Current Timeout\",\"type\":\"number\",\"suffix\":\"minutes\",\"prefix\":null,\"min\":10,\"max\":6000,\"futureOnly\":false,\"integerOnly\":true,\"isReadOnly\":true,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"min=10; max=6000 [Time Out] - [Prealarm] must be >= 120 s.\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":11869,"Group":{"Id":7030,"Name":"Read Welfare Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7000,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7001,"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":7002,"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":7007,"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":[]},{"Id":7008,"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":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7009,"Name":"Alert 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":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":7029,"Name":"Welfare","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7010,"Name":"Additional 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":7019,"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":7022,"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":7023,"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":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","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":[{"Id":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7005,"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":7015,"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":[]}]},{"Id":7006,"Name":"Read Additional 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":7016,"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":7013,"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":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7021,"Name":"Read Non Movement 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":"Prealarm","Json":"{\"name\":\"Prealarm\",\"default\":\"\",\"description\":\"Current Prealarm\",\"type\":\"number\",\"suffix\":\"minutes\",\"prefix\":null,\"min\":2,\"max\":10,\"futureOnly\":false,\"integerOnly\":true,\"isReadOnly\":true,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"min=2; max=10 [Time Out] - [Prealarm] must be >= 120 s.\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":11868,"Group":{"Id":7030,"Name":"Read Welfare Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7000,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7001,"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":7002,"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":7007,"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":[]},{"Id":7008,"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":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7009,"Name":"Alert 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":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":7029,"Name":"Welfare","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7010,"Name":"Additional 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":7019,"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":7022,"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":7023,"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":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","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":[{"Id":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7005,"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":7015,"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":[]}]},{"Id":7006,"Name":"Read Additional 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":7016,"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":7013,"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":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7021,"Name":"Read Non Movement 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":"Enable Disable Read Welfare","Json":"{\"name\":\"Enable Disable Read Welfare\",\"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":11867,"Group":{"Id":7030,"Name":"Read Welfare Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7011,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7000,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6999,"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":7001,"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":7002,"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":7007,"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":[]},{"Id":7008,"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":7014,"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":[{"Id":7076,"Name":"home","Json":{"description":"","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7009,"Name":"Alert 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":7017,"Name":"Man Down Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7018,"Name":"No Activity","Json":{"description":"","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7024,"Name":"Non Movement 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":7029,"Name":"Welfare","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7010,"Name":"Additional 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":7019,"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":7022,"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":7023,"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":[]}]},{"Id":7012,"Name":"Performance Settings","Json":{"description":"","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":[{"Id":7003,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7004,"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":7005,"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":7015,"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":[]}]},{"Id":7006,"Name":"Read Additional 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":7016,"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":7013,"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":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7020,"Name":"Read Man Down 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":7021,"Name":"Read Non Movement 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":"Mode","Json":"{\"name\":\"Mode\",\"default\":\"\",\"description\":\"Current Mode\",\"type\":\"radioGroup\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":true,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":null,\"options\":[{\"label\":\"Ambert Timer\",\"value\":\"0\"},{\"label\":\"Recurrent\",\"value\":\"1\"}],\"toTranslate\":[\"name\",\"description\",\"helpText\",\"label\"]}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":12279,"Group":{"Id":7343,"Name":"Profiles","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":[]},"Name":"Silent Call Mode","Json":"{\"name\":\"Silent Call Mode\",\"default\":\"\",\"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\":\"Enables a discreet emergency call mode intended for users in high-risk situations such as domestic violence. The call is made silently without activating speaker audio or visual indicators, while providing subtle user feedback via vibration.\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"false","Command":null,"ProtocolActionObjects":[{"Type":0,"NewValue":"{\"Id\":12279,\"Group\":{\"Id\":7343,\"Name\":\"Profiles\",\"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\":[]},\"Name\":\"Silent Call Mode\",\"Json\":\"{\\\"name\\\":\\\"Silent Call Mode\\\",\\\"default\\\":\\\"\\\",\\\"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\\\":\\\"Enables a discreet emergency call mode intended for users in high-risk situations such as domestic violence. The call is made silently without activating speaker audio or visual indicators, while providing subtle user feedback via vibration.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"false\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1746725107},{"Type":1,"NewValue":"{\"Id\":12279,\"Group\":{\"Id\":7343,\"Name\":\"Profiles\",\"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\":[]},\"Name\":\"Silent Call Mode\",\"Json\":\"{\\\"name\\\":\\\"Silent Call Mode\\\",\\\"default\\\":\\\"false\\\",\\\"description\\\":\\\"Silent Call Mode\\\",\\\"type\\\":\\\"checkbox\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Enables a discreet emergency call mode intended for users in high-risk situations such as domestic violence. The call is made silently without activating speaker audio or visual indicators, while providing subtle user feedback via vibration.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"true\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1746725238},{"Type":1,"NewValue":"{\"Id\":12279,\"Group\":{\"Id\":7343,\"Name\":\"Profiles\",\"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\":[]},\"Name\":\"Silent Call Mode\",\"Json\":\"{\\\"name\\\":\\\"Silent Call Mode\\\",\\\"default\\\":\\\"true\\\",\\\"description\\\":\\\"Silent Call Mode\\\",\\\"type\\\":\\\"checkbox\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Enables a discreet emergency call mode intended for users in high-risk situations such as domestic violence. The call is made silently without activating speaker audio or visual indicators, while providing subtle user feedback via vibration.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"true\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1746729412},{"Type":0,"NewValue":"{\"Id\":12279,\"Group\":{\"Id\":7343,\"Name\":\"Profiles\",\"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\":[]},\"Name\":\"Silent Call Mode\",\"Json\":\"{\\\"name\\\":\\\"Silent Call Mode\\\",\\\"default\\\":\\\"true\\\",\\\"description\\\":\\\"Silent Call Mode\\\",\\\"type\\\":\\\"checkbox\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Enables a discreet emergency call mode intended for users in high-risk situations such as domestic violence. The call is made silently without activating speaker audio or visual indicators, while providing subtle user feedback via vibration.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"true\",\"Command\":{\"Id\":5416,\"Protocol\":{\"Id\":253,\"Code\":\"Access PS Sentry\",\"Version\":\"0.9\",\"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 = '';\\n// LED , off for silent mode\\nif (params.Profiles.SilentCallMode == 'true') {\\n    value += '0'; // LED//Beep Off\\n} else {\\n    value += '1'; // LED//Beep On\\n}\\n// Voice Warning, off for silent mode\\nif (params.Profiles.SilentCallMode == 'true') {\\n    value += '0'; // Voice Warning Off\\n} else {\\n    value += '1'; // Voice Warning On\\n}\\n// Vibration, always on\\nvalue += '1';\\n// CellTower always on\\nvalue += '1';\\n// Wifi Positioning always on\\nvalue += '1';\\n// Speaker SOS talking, off for silent mode\\nif (params.Profiles.SilentCallMode == 'true') {\\n    value += '0'; //off\\n} else {\\n    value += '1'; //on\\n}\\n// Call1 Side Call, off for silent mode\\nif (params.Profiles.SilentCallMode == 'true') {\\n    value += '0'; // off\\n} else {\\n    value += '1'; // on\\n}\\n// BLE always connected to charging base, always off\\nvalue += '1';\\n// BLE Locating, always on\\nvalue += '1';\\n// SOS call voice, always on ¿?¿?¿\\nvalue += '1';\\n// BLE always on, always on \\nvalue += '1';\\n// GPS loc, always on ?¿?¿?\\nvalue += '1';\\n// TCP fast, always on\\nvalue += '1';\\n//watch only  Raise wrist to awake (EV05only), off for EV04\\nvalue += '0';\\n// Home beacon location, always on\\nvalue += '1';\\n// activity fuction, \\nvalue += '0';\\n//step counting, off\\nvalue += '0';\\n//home-wifi location, data-saver, NLprovider, power control,\\n// sos cancel switch, Long SMS,  plus 7 more without functions\\nvalue += '0000';\\n// Stop call sequence, always on\\nvalue += '1';\\nvalue += '00000000';\\n// Autoupdate firmware, always on\\nvalue += '1';\\n// AGPS, always on\\nvalue += '1';\\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":1746729416},{"Type":0,"NewValue":"{\"Id\":12279,\"Group\":{\"Id\":7343,\"Name\":\"Profiles\",\"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\":[]},\"Name\":\"Silent Call Mode\",\"Json\":\"{\\\"name\\\":\\\"Silent Call Mode\\\",\\\"default\\\":\\\"true\\\",\\\"description\\\":\\\"Silent Call Mode\\\",\\\"type\\\":\\\"checkbox\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Enables a discreet emergency call mode intended for users in high-risk situations such as domestic violence. The call is made silently without activating speaker audio or visual indicators, while providing subtle user feedback via vibration.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"true\",\"Command\":{\"Id\":5429,\"Protocol\":{\"Id\":253,\"Code\":\"Access PS Sentry\",\"Version\":\"0.9\",\"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\\nif (params.Profiles.SilentCallMode == 'true') { // Enable LT Silent Call Mode\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '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":1746729419}],"LanguageId":null,"Tags":[]},{"Id":12279,"Group":{"Id":7343,"Name":"Profiles","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":[]},"Name":"Silent Call Mode","Json":"{\"name\":\"Silent Call Mode\",\"default\":\"true\",\"description\":\"Silent Call Mode\",\"type\":\"checkbox\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Enables a discreet emergency call mode intended for users in high-risk situations such as domestic violence. The call is made silently without activating speaker audio or visual indicators, while providing subtle user feedback via vibration.\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"true","Command":{"Id":5416,"Protocol":{"Id":253,"Code":"Access PS Sentry","Version":"0.9","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 = '';\n// LED , off for silent mode\nif (params.Profiles.SilentCallMode == 'true') {\n    value += '0'; // LED//Beep Off\n} else {\n    value += '1'; // LED//Beep On\n}\n// Voice Warning, off for silent mode\nif (params.Profiles.SilentCallMode == 'true') {\n    value += '0'; // Voice Warning Off\n} else {\n    value += '1'; // Voice Warning On\n}\n// Vibration, always on\nvalue += '1';\n// CellTower always on\nvalue += '1';\n// Wifi Positioning always on\nvalue += '1';\n// Speaker SOS talking, off for silent mode\nif (params.Profiles.SilentCallMode == 'true') {\n    value += '0'; //off\n} else {\n    value += '1'; //on\n}\n// Call1 Side Call, off for silent mode\nif (params.Profiles.SilentCallMode == 'true') {\n    value += '0'; // off\n} else {\n    value += '1'; // on\n}\n// BLE always connected to charging base, always off\nvalue += '1';\n// BLE Locating, always on\nvalue += '1';\n// SOS call voice, always on ¿?¿?¿\nvalue += '1';\n// BLE always on, always on \nvalue += '1';\n// GPS loc, always on ?¿?¿?\nvalue += '1';\n// TCP fast, always on\nvalue += '1';\n//watch only  Raise wrist to awake (EV05only), off for EV04\nvalue += '0';\n// Home beacon location, always on\nvalue += '1';\n// activity fuction, \nvalue += '0';\n//step counting, off\nvalue += '0';\n//home-wifi location, data-saver, NLprovider, power control,\n// sos cancel switch, Long SMS,  plus 7 more without functions\nvalue += '0000';\n// Stop call sequence, always on\nvalue += '1';\nvalue += '00000000';\n// Autoupdate firmware, always on\nvalue += '1';\n// AGPS, always on\nvalue += '1';\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":12279,"Group":{"Id":7343,"Name":"Profiles","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":[]},"Name":"Silent Call Mode","Json":"{\"name\":\"Silent Call Mode\",\"default\":\"true\",\"description\":\"Silent Call Mode\",\"type\":\"checkbox\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Enables a discreet emergency call mode intended for users in high-risk situations such as domestic violence. The call is made silently without activating speaker audio or visual indicators, while providing subtle user feedback via vibration.\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"true","Command":{"Id":5429,"Protocol":{"Id":253,"Code":"Access PS Sentry","Version":"0.9","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\nif (params.Profiles.SilentCallMode == 'true') { // Enable LT Silent Call Mode\r\n    value += '1';\r\n} else {\r\n    value += '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":12280,"Group":{"Id":7344,"Name":"Read Profiles","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":[]},"Name":"Read Silent Call Mode","Json":"{\"name\":\"Read Silent Call Mode\",\"default\":\"\",\"description\":null,\"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":0,"NewValue":"{\"Id\":12280,\"Group\":{\"Id\":7344,\"Name\":\"Read Profiles\",\"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\":[]},\"Name\":\"Read Silent Call Mode\",\"Json\":\"{\\\"name\\\":\\\"Read Silent Call Mode\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":null,\\\"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\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1746729590},{"Type":1,"NewValue":"{\"Id\":12280,\"Group\":{\"Id\":7344,\"Name\":\"Read Profiles\",\"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\":[]},\"Name\":\"Silent Call Mode\",\"Json\":\"{\\\"name\\\":\\\"Silent Call Mode\\\",\\\"default\\\":\\\"false\\\",\\\"description\\\":\\\"Current Silent Call Mode\\\",\\\"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\":\"true\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1746729660},{"Type":1,"NewValue":"{\"Id\":12280,\"Group\":{\"Id\":7344,\"Name\":\"Read Profiles\",\"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\":[]},\"Name\":\"Silent Call Mode\",\"Json\":\"{\\\"name\\\":\\\"Silent Call Mode\\\",\\\"default\\\":\\\"true\\\",\\\"description\\\":\\\"Current Silent Call Mode\\\",\\\"type\\\":\\\"checkbox\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":true,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Current state of silent call mode intended for users in high-risk situations such as domestic violence. \\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"true\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1746729781}],"LanguageId":null,"Tags":[]},{"Id":12286,"Group":{"Id":7359,"Name":"Interface Options","Json":{"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":"SOS Activation Button","Json":"{\"name\":\"SOS Activation Button\",\"default\":\"\",\"description\":\"SOS Activation Button\",\"type\":\"radioGroup\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Choose how the SOS feature is activated on the device. You can set it to trigger with either a long press or a double press of the assigned button\",\"options\":[{\"label\":\"Long Press\",\"value\":\"0\"},{\"label\":\"1\",\"value\":\"Double Press\"}],\"toTranslate\":[\"name\",\"description\",\"helpText\",\"label\"]}","Default":"","Command":null,"ProtocolActionObjects":[{"Type":0,"NewValue":"{\"Id\":12286,\"Group\":{\"Id\":7359,\"Name\":\"Interface Options\",\"Json\":{\"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\":\"SOS Activation Button\",\"Json\":\"{\\\"name\\\":\\\"SOS Activation Button\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"SOS Activation Button\\\",\\\"type\\\":\\\"radioGroup\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Choose how the SOS feature is activated on the device. You can set it to trigger with either a long press or a double press of the assigned button\\\",\\\"options\\\":[{\\\"label\\\":\\\"Long Press\\\",\\\"value\\\":\\\"0\\\"},{\\\"label\\\":\\\"1\\\",\\\"value\\\":\\\"Double Press\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1747325232},{"Type":0,"NewValue":"{\"Id\":12286,\"Group\":{\"Id\":7359,\"Name\":\"Interface Options\",\"Json\":{\"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\":\"SOS Activation Button\",\"Json\":\"{\\\"name\\\":\\\"SOS Activation Button\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"SOS Activation Button\\\",\\\"type\\\":\\\"radioGroup\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Choose how the SOS feature is activated on the device. You can set it to trigger with either a long press or a double press of the assigned button\\\",\\\"options\\\":[{\\\"label\\\":\\\"Long Press\\\",\\\"value\\\":\\\"0\\\"},{\\\"label\\\":\\\"1\\\",\\\"value\\\":\\\"Double Press\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"]}\",\"Default\":\"\",\"Command\":{\"Id\":5415,\"Protocol\":{\"Id\":253,\"Code\":\"Access PS Sentry\",\"Version\":\"1.0\",\"FirmwareVersion\":\"V04b.8601.2411.1.0.16.4411.2409.25\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"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}\",\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":true,\"SendAttempts\":6,\"Order\":null},\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1747325236},{"Type":1,"NewValue":"{\"Id\":12286,\"Group\":{\"Id\":7359,\"Name\":\"Interface Options\",\"Json\":{\"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\":\"SOS Activation Button\",\"Json\":\"{\\\"name\\\":\\\"SOS Activation Button\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"SOS Activation Button\\\",\\\"type\\\":\\\"radioGroup\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Choose how the SOS feature is activated on the device. You can set it to trigger with either a long press or a double press of the assigned button\\\",\\\"options\\\":[{\\\"value\\\":\\\"0\\\",\\\"label\\\":\\\"Long Press\\\"},{\\\"label\\\":\\\"Double Press\\\",\\\"value\\\":\\\"1\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1747326494}],"LanguageId":null,"Tags":[]},{"Id":12286,"Group":{"Id":7359,"Name":"Interface Options","Json":{"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":"SOS Activation Button","Json":"{\"name\":\"SOS Activation Button\",\"default\":\"\",\"description\":\"SOS Activation Button\",\"type\":\"radioGroup\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Choose how the SOS feature is activated on the device. You can set it to trigger with either a long press or a double press of the assigned button\",\"options\":[{\"label\":\"Long Press\",\"value\":\"0\"},{\"label\":\"1\",\"value\":\"Double Press\"}],\"toTranslate\":[\"name\",\"description\",\"helpText\",\"label\"]}","Default":"","Command":{"Id":5415,"Protocol":{"Id":253,"Code":"Access PS Sentry","Version":"1.0","FirmwareVersion":"V04b.8601.2411.1.0.16.4411.2409.25","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":true},"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}","AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"CommandToUpdateId":null,"ParentId":null,"Parent":null,"HasAck":true,"HexString":true,"SendAttempts":6,"Order":null},"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":12287,"Group":{"Id":7359,"Name":"Interface Options","Json":{"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 Activation Dial Button","Json":"{\"name\":\"Speed Activation Dial Button\",\"default\":\"\",\"description\":\"Speed Activation Dial Button\",\"type\":\"radioGroup\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Select the action required to trigger a Speed Dial call. You can choose between a long or double press of the configured button. This allows quick contact with a carer or support person.\",\"options\":[{\"label\":\"Long Press\",\"value\":\"0\"},{\"label\":\"Double Press\",\"value\":\"1\"}],\"toTranslate\":[\"name\",\"description\",\"helpText\",\"label\"]}","Default":"","Command":null,"ProtocolActionObjects":[{"Type":0,"NewValue":"{\"Id\":12287,\"Group\":{\"Id\":7359,\"Name\":\"Interface Options\",\"Json\":{\"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 Activation Dial Button\",\"Json\":\"{\\\"name\\\":\\\"Speed Activation Dial Button\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Speed Activation Dial Button\\\",\\\"type\\\":\\\"radioGroup\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Select the action required to trigger a Speed Dial call. You can choose between a long or double press of the configured button. This allows quick contact with a carer or support person.\\\",\\\"options\\\":[{\\\"label\\\":\\\"Long Press\\\",\\\"value\\\":\\\"0\\\"},{\\\"label\\\":\\\"Double Press\\\",\\\"value\\\":\\\"1\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1747325330},{"Type":0,"NewValue":"{\"Id\":12287,\"Group\":{\"Id\":7359,\"Name\":\"Interface Options\",\"Json\":{\"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 Activation Dial Button\",\"Json\":\"{\\\"name\\\":\\\"Speed Activation Dial Button\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Speed Activation Dial Button\\\",\\\"type\\\":\\\"radioGroup\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Select the action required to trigger a Speed Dial call. You can choose between a long or double press of the configured button. This allows quick contact with a carer or support person.\\\",\\\"options\\\":[{\\\"label\\\":\\\"Long Press\\\",\\\"value\\\":\\\"0\\\"},{\\\"label\\\":\\\"Double Press\\\",\\\"value\\\":\\\"1\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"]}\",\"Default\":\"\",\"Command\":{\"Id\":5409,\"Protocol\":{\"Id\":253,\"Code\":\"Access PS Sentry\",\"Version\":\"1.0\",\"FirmwareVersion\":\"V04b.8601.2411.1.0.16.4411.2409.25\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"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}\",\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":true,\"SendAttempts\":6,\"Order\":null},\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1747325333}],"LanguageId":null,"Tags":[]},{"Id":12287,"Group":{"Id":7359,"Name":"Interface Options","Json":{"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 Activation Dial Button","Json":"{\"name\":\"Speed Activation Dial Button\",\"default\":\"\",\"description\":\"Speed Activation Dial Button\",\"type\":\"radioGroup\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Select the action required to trigger a Speed Dial call. You can choose between a long or double press of the configured button. This allows quick contact with a carer or support person.\",\"options\":[{\"label\":\"Long Press\",\"value\":\"0\"},{\"label\":\"Double Press\",\"value\":\"1\"}],\"toTranslate\":[\"name\",\"description\",\"helpText\",\"label\"]}","Default":"","Command":{"Id":5409,"Protocol":{"Id":253,"Code":"Access PS Sentry","Version":"1.0","FirmwareVersion":"V04b.8601.2411.1.0.16.4411.2409.25","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":true},"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}","AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"CommandToUpdateId":null,"ParentId":null,"Parent":null,"HasAck":true,"HexString":true,"SendAttempts":6,"Order":null},"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":12288,"Group":{"Id":7360,"Name":"Read Interface Options","Json":{"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":"SOS Activation Button","Json":"{\"name\":\"SOS Activation Button\",\"default\":\"\",\"description\":\"SOS Activation Button\",\"type\":\"radioGroup\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":true,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Current trigger mode for the SOS feature on the device\",\"options\":[{\"label\":\"Long Press\",\"value\":\"0\"},{\"label\":\"Double Press\",\"value\":\"1\"}],\"toTranslate\":[\"name\",\"description\",\"helpText\",\"label\"]}","Default":"","Command":null,"ProtocolActionObjects":[{"Type":0,"NewValue":"{\"Id\":12288,\"Group\":{\"Id\":7360,\"Name\":\"Read Interface Options\",\"Json\":{\"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\":\"SOS Activation Button\",\"Json\":\"{\\\"name\\\":\\\"SOS Activation Button\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"SOS Activation Button\\\",\\\"type\\\":\\\"radioGroup\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":true,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Current trigger mode for the SOS feature on the device\\\",\\\"options\\\":[{\\\"label\\\":\\\"Long Press\\\",\\\"value\\\":\\\"0\\\"},{\\\"label\\\":\\\"Double Press\\\",\\\"value\\\":\\\"1\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1747328053}],"LanguageId":null,"Tags":[]},{"Id":12289,"Group":{"Id":7360,"Name":"Read Interface Options","Json":{"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 Activation Dial Button","Json":"{\"name\":\"Speed Activation Dial Button\",\"default\":\"\",\"description\":\"Speed Activation Dial Button\",\"type\":\"radioGroup\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":true,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Current trigger mode for the Speed Dial feature on the device\",\"options\":[{\"label\":\"Long Press\",\"value\":\"0\"},{\"label\":\"Double Press\",\"value\":\"1\"}],\"toTranslate\":[\"name\",\"description\",\"helpText\",\"label\"]}","Default":"","Command":null,"ProtocolActionObjects":[{"Type":0,"NewValue":"{\"Id\":12289,\"Group\":{\"Id\":7360,\"Name\":\"Read Interface Options\",\"Json\":{\"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 Activation Dial Button\",\"Json\":\"{\\\"name\\\":\\\"Speed Activation Dial Button\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Speed Activation Dial Button\\\",\\\"type\\\":\\\"radioGroup\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":true,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Current trigger mode for the Speed Dial feature on the device\\\",\\\"options\\\":[{\\\"label\\\":\\\"Long Press\\\",\\\"value\\\":\\\"0\\\"},{\\\"label\\\":\\\"Double Press\\\",\\\"value\\\":\\\"1\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1747328179}],"LanguageId":null,"Tags":[]},{"Id":12368,"Group":{"Id":7007,"Name":"System Settings","Json":{"description":"","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Incoming Call Ringtone Volume","Json":"{\"name\":\"Incoming Call Ringtone Volume\",\"default\":\"\",\"description\":\"Incoming Call Ringtone Volume\",\"type\":\"radioGroup\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Ring volume when receive a call\",\"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\"]}","Default":"","Command":null,"ProtocolActionObjects":[{"Type":0,"NewValue":"{\"Id\":12368,\"Group\":{\"Id\":7007,\"Name\":\"System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":6,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Incoming Call Ringtone Volume\",\"Json\":\"{\\\"name\\\":\\\"Incoming Call Ringtone Volume\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Incoming Call Ringtone Volume\\\",\\\"type\\\":\\\"radioGroup\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Ring volume when receive a call\\\",\\\"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\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1749742702},{"Type":1,"NewValue":"{\"Id\":12368,\"Group\":{\"Id\":7007,\"Name\":\"System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":6,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Incoming Call Ringtone Volume\",\"Json\":\"{\\\"name\\\":\\\"Incoming Call Ringtone Volume\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Incoming Call Ringtone Volume\\\",\\\"type\\\":\\\"radioGroup\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Ring volume when receive a call\\\",\\\"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\\\":2}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1749742981},{"Type":1,"NewValue":"{\"Id\":12368,\"Group\":{\"Id\":7007,\"Name\":\"System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":6,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Incoming Call Ringtone Volume\",\"Json\":\"{\\\"name\\\":\\\"Incoming Call Ringtone Volume\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Incoming Call Ringtone Volume\\\",\\\"type\\\":\\\"radioGroup\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Ring volume when receive a call\\\",\\\"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\":[]}","Timestamp":1749743464},{"Type":0,"NewValue":"{\"Id\":12368,\"Group\":{\"Id\":7007,\"Name\":\"System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":6,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Incoming Call Ringtone Volume\",\"Json\":\"{\\\"name\\\":\\\"Incoming Call Ringtone Volume\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Incoming Call Ringtone Volume\\\",\\\"type\\\":\\\"radioGroup\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Ring volume when receive a call\\\",\\\"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\":{\"Id\":5446,\"Protocol\":{\"Id\":253,\"Code\":\"Access PS Sentry\",\"Version\":\"1.2\",\"FirmwareVersion\":\"V04b.8601.2411.1.0.16.4411.2409.25\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"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}\",\"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":1749743468},{"Type":1,"NewValue":"{\"Id\":12368,\"Group\":{\"Id\":7007,\"Name\":\"System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":6,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Incoming Call Ringtone Volume\",\"Json\":\"{\\\"name\\\":\\\"Incoming Call Ringtone Volume\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Incoming Call Ringtone Volume\\\",\\\"type\\\":\\\"radioGroup\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Ring volume when receive a call\\\",\\\"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\\\"],\\\"order\\\":2}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1749744643},{"Type":1,"NewValue":"{\"Id\":12368,\"Group\":{\"Id\":7007,\"Name\":\"System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":6,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Incoming Call Ringtone Volume\",\"Json\":\"{\\\"name\\\":\\\"Incoming Call Ringtone Volume\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Incoming Call Ringtone Volume\\\",\\\"type\\\":\\\"radioGroup\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Ring volume when receive a call\\\",\\\"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\\\"],\\\"order\\\":3}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1750176287}],"LanguageId":null,"Tags":[]},{"Id":12369,"Group":{"Id":7007,"Name":"System Settings","Json":{"description":"","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"In-Call Speaker Volume","Json":"{\"name\":\"In-Call Speaker Volume\",\"default\":\"\",\"description\":\"In-Call Speaker Volume\",\"type\":\"radioGroup\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Speaker volume during talking\",\"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\"]}","Default":"","Command":null,"ProtocolActionObjects":[{"Type":0,"NewValue":"{\"Id\":12369,\"Group\":{\"Id\":7007,\"Name\":\"System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":6,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"In-Call Speaker Volume\",\"Json\":\"{\\\"name\\\":\\\"In-Call Speaker Volume\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"In-Call Speaker Volume\\\",\\\"type\\\":\\\"radioGroup\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Speaker volume during talking\\\",\\\"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\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1749742852},{"Type":1,"NewValue":"{\"Id\":12369,\"Group\":{\"Id\":7007,\"Name\":\"System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":6,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"In-Call Speaker Volume\",\"Json\":\"{\\\"name\\\":\\\"In-Call Speaker Volume\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"In-Call Speaker Volume\\\",\\\"type\\\":\\\"radioGroup\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Speaker volume during talking\\\",\\\"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\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1749742984},{"Type":1,"NewValue":"{\"Id\":12369,\"Group\":{\"Id\":7007,\"Name\":\"System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":6,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"In-Call Speaker Volume\",\"Json\":\"{\\\"name\\\":\\\"In-Call Speaker Volume\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"In-Call Speaker Volume\\\",\\\"type\\\":\\\"radioGroup\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Speaker volume during talking\\\",\\\"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\":[]}","Timestamp":1749743532},{"Type":0,"NewValue":"{\"Id\":12369,\"Group\":{\"Id\":7007,\"Name\":\"System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":6,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"In-Call Speaker Volume\",\"Json\":\"{\\\"name\\\":\\\"In-Call Speaker Volume\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"In-Call Speaker Volume\\\",\\\"type\\\":\\\"radioGroup\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Speaker volume during talking\\\",\\\"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\":{\"Id\":5439,\"Protocol\":{\"Id\":253,\"Code\":\"Access PS Sentry\",\"Version\":\"1.2\",\"FirmwareVersion\":\"V04b.8601.2411.1.0.16.4411.2409.25\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"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}\",\"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":1749743537},{"Type":1,"NewValue":"{\"Id\":12369,\"Group\":{\"Id\":7007,\"Name\":\"System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":6,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"In-Call Speaker Volume\",\"Json\":\"{\\\"name\\\":\\\"In-Call Speaker Volume\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"In-Call Speaker Volume\\\",\\\"type\\\":\\\"radioGroup\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Speaker volume during talking\\\",\\\"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\\\"],\\\"order\\\":4}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1749744650},{"Type":1,"NewValue":"{\"Id\":12369,\"Group\":{\"Id\":7007,\"Name\":\"System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":6,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"In-Call Speaker Volume\",\"Json\":\"{\\\"name\\\":\\\"In-Call Speaker Volume\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"In-Call Speaker Volume\\\",\\\"type\\\":\\\"radioGroup\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Speaker volume during talking\\\",\\\"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\\\"],\\\"order\\\":3}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1749744664},{"Type":1,"NewValue":"{\"Id\":12369,\"Group\":{\"Id\":7007,\"Name\":\"System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":6,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"In-Call Speaker Volume\",\"Json\":\"{\\\"name\\\":\\\"In-Call Speaker Volume\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"In-Call Speaker Volume\\\",\\\"type\\\":\\\"radioGroup\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Speaker volume during talking\\\",\\\"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\\\"],\\\"order\\\":2}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1750176284},{"Type":1,"NewValue":"{\"Id\":12369,\"Group\":{\"Id\":7007,\"Name\":\"System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":6,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"InCall Speaker Volume\",\"Json\":\"{\\\"name\\\":\\\"InCall Speaker Volume\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"In-Call Speaker Volume\\\",\\\"type\\\":\\\"radioGroup\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Speaker volume during talking\\\",\\\"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\":[]}","Timestamp":1750181586}],"LanguageId":null,"Tags":[]},{"Id":12370,"Group":{"Id":7007,"Name":"System Settings","Json":{"description":"","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"In-Call Microphone Sensitivity","Json":"{\"name\":\"In-Call Microphone Sensitivity\",\"default\":\"\",\"description\":\"In-Call Microphone Sensitivity\",\"type\":\"radioGroup\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Microphone volume during talking\",\"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\"]}","Default":"","Command":null,"ProtocolActionObjects":[{"Type":0,"NewValue":"{\"Id\":12370,\"Group\":{\"Id\":7007,\"Name\":\"System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":6,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"In-Call Microphone Sensitivity\",\"Json\":\"{\\\"name\\\":\\\"In-Call Microphone Sensitivity\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"In-Call Microphone Sensitivity\\\",\\\"type\\\":\\\"radioGroup\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Microphone volume during talking\\\",\\\"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\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1749742951},{"Type":1,"NewValue":"{\"Id\":12370,\"Group\":{\"Id\":7007,\"Name\":\"System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":6,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"In-Call Microphone Sensitivity\",\"Json\":\"{\\\"name\\\":\\\"In-Call Microphone Sensitivity\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"In-Call Microphone Sensitivity\\\",\\\"type\\\":\\\"radioGroup\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Microphone volume during talking\\\",\\\"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\\\":6}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1749742993},{"Type":1,"NewValue":"{\"Id\":12370,\"Group\":{\"Id\":7007,\"Name\":\"System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":6,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"In-Call Microphone Sensitivity\",\"Json\":\"{\\\"name\\\":\\\"In-Call Microphone Sensitivity\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"In-Call Microphone Sensitivity\\\",\\\"type\\\":\\\"radioGroup\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Microphone volume during talking\\\",\\\"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\\\":4}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1749743066},{"Type":1,"NewValue":"{\"Id\":12370,\"Group\":{\"Id\":7007,\"Name\":\"System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":6,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"In-Call Microphone Sensitivity\",\"Json\":\"{\\\"name\\\":\\\"In-Call Microphone Sensitivity\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"In-Call Microphone Sensitivity\\\",\\\"type\\\":\\\"radioGroup\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Microphone volume during talking\\\",\\\"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\":[]}","Timestamp":1749743625},{"Type":0,"NewValue":"{\"Id\":12370,\"Group\":{\"Id\":7007,\"Name\":\"System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":6,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"In-Call Microphone Sensitivity\",\"Json\":\"{\\\"name\\\":\\\"In-Call Microphone Sensitivity\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"In-Call Microphone Sensitivity\\\",\\\"type\\\":\\\"radioGroup\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Microphone volume during talking\\\",\\\"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\":{\"Id\":5470,\"Protocol\":{\"Id\":253,\"Code\":\"Access PS Sentry\",\"Version\":\"1.2\",\"FirmwareVersion\":\"V04b.8601.2411.1.0.16.4411.2409.25\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"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}\",\"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":1749743629},{"Type":1,"NewValue":"{\"Id\":12370,\"Group\":{\"Id\":7007,\"Name\":\"System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":6,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"In-Call Microphone Sensitivity\",\"Json\":\"{\\\"name\\\":\\\"In-Call Microphone Sensitivity\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"In-Call Microphone Sensitivity\\\",\\\"type\\\":\\\"radioGroup\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Microphone volume during talking\\\",\\\"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\\\"],\\\"order\\\":3}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1749744646},{"Type":1,"NewValue":"{\"Id\":12370,\"Group\":{\"Id\":7007,\"Name\":\"System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":6,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"In-Call Microphone Sensitivity\",\"Json\":\"{\\\"name\\\":\\\"In-Call Microphone Sensitivity\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"In-Call Microphone Sensitivity\\\",\\\"type\\\":\\\"radioGroup\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Microphone volume during talking\\\",\\\"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\\\"],\\\"order\\\":4}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1749744668},{"Type":1,"NewValue":"{\"Id\":12370,\"Group\":{\"Id\":7007,\"Name\":\"System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":6,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"In-Call Microphone Sensitivity\",\"Json\":\"{\\\"name\\\":\\\"In-Call Microphone Sensitivity\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"In-Call Microphone Sensitivity\\\",\\\"type\\\":\\\"radioGroup\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Microphone volume during talking\\\",\\\"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\\\"],\\\"order\\\":5}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1749744680},{"Type":1,"NewValue":"{\"Id\":12370,\"Group\":{\"Id\":7007,\"Name\":\"System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":6,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"In-Call Microphone Sensitivity\",\"Json\":\"{\\\"name\\\":\\\"In-Call Microphone Sensitivity\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"In-Call Microphone Sensitivity\\\",\\\"type\\\":\\\"radioGroup\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Microphone volume during talking\\\",\\\"options\\\":[{\\\"value\\\":\\\"0\\\",\\\"label\\\":\\\"Off\\\"},{\\\"label\\\":\\\"Low\\\",\\\"value\\\":\\\"5\\\"},{\\\"label\\\":\\\"High\\\",\\\"value\\\":\\\"10\\\"},{\\\"label\\\":\\\"Max\\\",\\\"value\\\":\\\"15\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1749744802},{"Type":1,"NewValue":"{\"Id\":12370,\"Group\":{\"Id\":7007,\"Name\":\"System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":6,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"In-Call Microphone Sensitivity\",\"Json\":\"{\\\"name\\\":\\\"In-Call Microphone Sensitivity\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"In-Call Microphone Sensitivity\\\",\\\"type\\\":\\\"radioGroup\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Microphone volume during talking\\\",\\\"options\\\":[{\\\"value\\\":\\\"0\\\",\\\"label\\\":\\\"Off\\\"},{\\\"label\\\":\\\"Low\\\",\\\"value\\\":\\\"5\\\"},{\\\"label\\\":\\\"High\\\",\\\"value\\\":\\\"10\\\"},{\\\"label\\\":\\\"Max\\\",\\\"value\\\":\\\"15\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"],\\\"order\\\":5}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1749746319},{"Type":1,"NewValue":"{\"Id\":12370,\"Group\":{\"Id\":7007,\"Name\":\"System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":6,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"In-Call Microphone Sensitivity\",\"Json\":\"{\\\"name\\\":\\\"In-Call Microphone Sensitivity\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"In-Call Microphone Sensitivity\\\",\\\"type\\\":\\\"radioGroup\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":true,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Microphone volume during talking\\\",\\\"options\\\":[{\\\"value\\\":\\\"0\\\",\\\"label\\\":\\\"Off\\\"},{\\\"value\\\":\\\"5\\\",\\\"label\\\":\\\"Low\\\"},{\\\"value\\\":\\\"10\\\",\\\"label\\\":\\\"High\\\"},{\\\"value\\\":\\\"15\\\",\\\"label\\\":\\\"Max\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1750176243},{"Type":1,"NewValue":"{\"Id\":12370,\"Group\":{\"Id\":7007,\"Name\":\"System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":6,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"In-Call Microphone Sensitivity\",\"Json\":\"{\\\"name\\\":\\\"In-Call Microphone Sensitivity\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"In-Call Microphone Sensitivity\\\",\\\"type\\\":\\\"radioGroup\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":true,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Microphone volume during talking\\\",\\\"options\\\":[{\\\"value\\\":\\\"0\\\",\\\"label\\\":\\\"Off\\\"},{\\\"value\\\":\\\"5\\\",\\\"label\\\":\\\"Low\\\"},{\\\"value\\\":\\\"10\\\",\\\"label\\\":\\\"High\\\"},{\\\"value\\\":\\\"15\\\",\\\"label\\\":\\\"Max\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"],\\\"order\\\":5}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1750176290},{"Type":1,"NewValue":"{\"Id\":12370,\"Group\":{\"Id\":7007,\"Name\":\"System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":6,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"InCall Microphone Sensitivity\",\"Json\":\"{\\\"name\\\":\\\"InCall Microphone Sensitivity\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"In-Call Microphone Sensitivity\\\",\\\"type\\\":\\\"radioGroup\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":true,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Microphone volume during talking\\\",\\\"options\\\":[{\\\"value\\\":\\\"0\\\",\\\"label\\\":\\\"Off\\\"},{\\\"value\\\":\\\"5\\\",\\\"label\\\":\\\"Low\\\"},{\\\"value\\\":\\\"10\\\",\\\"label\\\":\\\"High\\\"},{\\\"value\\\":\\\"15\\\",\\\"label\\\":\\\"Max\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1750181661}],"LanguageId":null,"Tags":[]},{"Id":12368,"Group":{"Id":7007,"Name":"System Settings","Json":{"description":"","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Incoming Call Ringtone Volume","Json":"{\"name\":\"Incoming Call Ringtone Volume\",\"default\":\"\",\"description\":\"Incoming Call Ringtone Volume\",\"type\":\"radioGroup\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Ring volume when receive a call\",\"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":{"Id":5446,"Protocol":{"Id":253,"Code":"Access PS Sentry","Version":"1.2","FirmwareVersion":"V04b.8601.2411.1.0.16.4411.2409.25","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":true},"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}","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":12369,"Group":{"Id":7007,"Name":"System Settings","Json":{"description":"","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"In-Call Speaker Volume","Json":"{\"name\":\"In-Call Speaker Volume\",\"default\":\"\",\"description\":\"In-Call Speaker Volume\",\"type\":\"radioGroup\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Speaker volume during talking\",\"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":{"Id":5439,"Protocol":{"Id":253,"Code":"Access PS Sentry","Version":"1.2","FirmwareVersion":"V04b.8601.2411.1.0.16.4411.2409.25","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":true},"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}","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":12370,"Group":{"Id":7007,"Name":"System Settings","Json":{"description":"","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"In-Call Microphone Sensitivity","Json":"{\"name\":\"In-Call Microphone Sensitivity\",\"default\":\"\",\"description\":\"In-Call Microphone Sensitivity\",\"type\":\"radioGroup\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Microphone volume during talking\",\"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":{"Id":5470,"Protocol":{"Id":253,"Code":"Access PS Sentry","Version":"1.2","FirmwareVersion":"V04b.8601.2411.1.0.16.4411.2409.25","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":true},"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}","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":12371,"Group":{"Id":7013,"Name":"Read System Settings","Json":{"description":"","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Incoming Call Ringtone Volume","Json":"{\"name\":\"Incoming Call Ringtone Volume\",\"default\":\"\",\"description\":\"Incoming Call Ringtone Volume\",\"type\":\"radioGroup\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":true,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"\",\"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\"]}","Default":"","Command":null,"ProtocolActionObjects":[{"Type":0,"NewValue":"{\"Id\":12371,\"Group\":{\"Id\":7013,\"Name\":\"Read System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":6,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Incoming Call Ringtone Volume\",\"Json\":\"{\\\"name\\\":\\\"Incoming Call Ringtone Volume\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Incoming Call Ringtone Volume\\\",\\\"type\\\":\\\"radioGroup\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":true,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"\\\",\\\"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\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1749744486},{"Type":1,"NewValue":"{\"Id\":12371,\"Group\":{\"Id\":7013,\"Name\":\"Read System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":6,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Incoming Call Ringtone Volume\",\"Json\":\"{\\\"name\\\":\\\"Incoming Call Ringtone Volume\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Incoming Call Ringtone Volume\\\",\\\"type\\\":\\\"radioGroup\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":true,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"\\\",\\\"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\\\":4}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1749744522},{"Type":1,"NewValue":"{\"Id\":12371,\"Group\":{\"Id\":7013,\"Name\":\"Read System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":6,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Incoming Call Ringtone Volume\",\"Json\":\"{\\\"name\\\":\\\"Incoming Call Ringtone Volume\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Incoming Call Ringtone Volume\\\",\\\"type\\\":\\\"radioGroup\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":true,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"\\\",\\\"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\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1749744537},{"Type":1,"NewValue":"{\"Id\":12371,\"Group\":{\"Id\":7013,\"Name\":\"Read System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":6,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Incoming Call Ringtone Volume\",\"Json\":\"{\\\"name\\\":\\\"Incoming Call Ringtone Volume\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Incoming Call Ringtone Volume\\\",\\\"type\\\":\\\"radioGroup\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":true,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"\\\",\\\"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\\\":1}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1749744853},{"Type":1,"NewValue":"{\"Id\":12371,\"Group\":{\"Id\":7013,\"Name\":\"Read System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":6,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Incoming Call Ringtone Volume\",\"Json\":\"{\\\"name\\\":\\\"Incoming Call Ringtone Volume\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Incoming Call Ringtone Volume\\\",\\\"type\\\":\\\"radioGroup\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":true,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"\\\",\\\"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\\\":2}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1749744873},{"Type":1,"NewValue":"{\"Id\":12371,\"Group\":{\"Id\":7013,\"Name\":\"Read System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":6,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Incoming Call Ringtone Volume\",\"Json\":\"{\\\"name\\\":\\\"Incoming Call Ringtone Volume\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Incoming Call Ringtone Volume\\\",\\\"type\\\":\\\"radioGroup\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":true,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"\\\",\\\"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\\\":4}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1750176362}],"LanguageId":null,"Tags":[]},{"Id":12372,"Group":{"Id":7013,"Name":"Read System Settings","Json":{"description":"","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"In-Call Speaker Volume","Json":"{\"name\":\"In-Call Speaker Volume\",\"default\":\"\",\"description\":\"In-Call Speaker Volume\",\"type\":\"radioGroup\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":true,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":null,\"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\"]}","Default":"","Command":null,"ProtocolActionObjects":[{"Type":0,"NewValue":"{\"Id\":12372,\"Group\":{\"Id\":7013,\"Name\":\"Read System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":6,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"In-Call Speaker Volume\",\"Json\":\"{\\\"name\\\":\\\"In-Call Speaker Volume\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"In-Call Speaker Volume\\\",\\\"type\\\":\\\"radioGroup\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":true,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":null,\\\"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\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1749745135},{"Type":1,"NewValue":"{\"Id\":12372,\"Group\":{\"Id\":7013,\"Name\":\"Read System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":6,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"In-Call Speaker Volume\",\"Json\":\"{\\\"name\\\":\\\"In-Call Speaker Volume\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"In-Call Speaker Volume\\\",\\\"type\\\":\\\"radioGroup\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":true,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":null,\\\"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\\\":4}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1749745260},{"Type":1,"NewValue":"{\"Id\":12372,\"Group\":{\"Id\":7013,\"Name\":\"Read System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":6,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"In-Call Speaker Volume\",\"Json\":\"{\\\"name\\\":\\\"In-Call Speaker Volume\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"In-Call Speaker Volume\\\",\\\"type\\\":\\\"radioGroup\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":true,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":null,\\\"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\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1749745278},{"Type":1,"NewValue":"{\"Id\":12372,\"Group\":{\"Id\":7013,\"Name\":\"Read System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":6,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"InCall Speaker Volume\",\"Json\":\"{\\\"name\\\":\\\"InCall Speaker Volume\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"In-Call Speaker Volume\\\",\\\"type\\\":\\\"radioGroup\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":true,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":null,\\\"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\":[]}","Timestamp":1750181624}],"LanguageId":null,"Tags":[]},{"Id":12373,"Group":{"Id":7013,"Name":"Read System Settings","Json":{"description":"","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"In-Call Microphone Sensitivity","Json":"{\"name\":\"In-Call Microphone Sensitivity\",\"default\":\"\",\"description\":\"In-Call Microphone Sensitivity\",\"type\":\"radioGroup\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":true,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":null,\"options\":[{\"label\":\"Off\",\"value\":\"0\"},{\"label\":\"Low\",\"value\":\"5\"},{\"label\":\"High\",\"value\":\"10\"},{\"label\":\"Max\",\"value\":\"15\"}],\"toTranslate\":[\"name\",\"description\",\"helpText\",\"label\"]}","Default":"","Command":null,"ProtocolActionObjects":[{"Type":0,"NewValue":"{\"Id\":12373,\"Group\":{\"Id\":7013,\"Name\":\"Read System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":6,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"In-Call Microphone Sensitivity\",\"Json\":\"{\\\"name\\\":\\\"In-Call Microphone Sensitivity\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"In-Call Microphone Sensitivity\\\",\\\"type\\\":\\\"radioGroup\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":true,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":null,\\\"options\\\":[{\\\"label\\\":\\\"Off\\\",\\\"value\\\":\\\"0\\\"},{\\\"label\\\":\\\"Low\\\",\\\"value\\\":\\\"5\\\"},{\\\"label\\\":\\\"High\\\",\\\"value\\\":\\\"10\\\"},{\\\"label\\\":\\\"Max\\\",\\\"value\\\":\\\"15\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1749745218},{"Type":1,"NewValue":"{\"Id\":12373,\"Group\":{\"Id\":7013,\"Name\":\"Read System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":6,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"In-Call Microphone Sensitivity\",\"Json\":\"{\\\"name\\\":\\\"In-Call Microphone Sensitivity\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"In-Call Microphone Sensitivity\\\",\\\"type\\\":\\\"radioGroup\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":true,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":null,\\\"options\\\":[{\\\"label\\\":\\\"Off\\\",\\\"value\\\":\\\"0\\\"},{\\\"label\\\":\\\"Low\\\",\\\"value\\\":\\\"5\\\"},{\\\"label\\\":\\\"High\\\",\\\"value\\\":\\\"10\\\"},{\\\"label\\\":\\\"Max\\\",\\\"value\\\":\\\"15\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"],\\\"order\\\":3}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1749745256},{"Type":1,"NewValue":"{\"Id\":12373,\"Group\":{\"Id\":7013,\"Name\":\"Read System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":6,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"In-Call Microphone Sensitivity\",\"Json\":\"{\\\"name\\\":\\\"In-Call Microphone Sensitivity\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"In-Call Microphone Sensitivity\\\",\\\"type\\\":\\\"radioGroup\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":true,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":null,\\\"options\\\":[{\\\"label\\\":\\\"Off\\\",\\\"value\\\":\\\"0\\\"},{\\\"label\\\":\\\"Low\\\",\\\"value\\\":\\\"5\\\"},{\\\"label\\\":\\\"High\\\",\\\"value\\\":\\\"10\\\"},{\\\"label\\\":\\\"Max\\\",\\\"value\\\":\\\"15\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"],\\\"order\\\":4}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1749745281},{"Type":1,"NewValue":"{\"Id\":12373,\"Group\":{\"Id\":7013,\"Name\":\"Read System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":6,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"In-Call Microphone Sensitivity\",\"Json\":\"{\\\"name\\\":\\\"In-Call Microphone Sensitivity\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"In-Call Microphone Sensitivity\\\",\\\"type\\\":\\\"radioGroup\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":true,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":null,\\\"options\\\":[{\\\"label\\\":\\\"Off\\\",\\\"value\\\":\\\"0\\\"},{\\\"label\\\":\\\"Low\\\",\\\"value\\\":\\\"5\\\"},{\\\"label\\\":\\\"High\\\",\\\"value\\\":\\\"10\\\"},{\\\"label\\\":\\\"Max\\\",\\\"value\\\":\\\"15\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"],\\\"order\\\":5}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1749745295},{"Type":1,"NewValue":"{\"Id\":12373,\"Group\":{\"Id\":7013,\"Name\":\"Read System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":6,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"In-Call Microphone Sensitivity\",\"Json\":\"{\\\"name\\\":\\\"In-Call Microphone Sensitivity\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"In-Call Microphone Sensitivity\\\",\\\"type\\\":\\\"radioGroup\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":true,\\\"isHidden\\\":true,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":null,\\\"options\\\":[{\\\"value\\\":\\\"0\\\",\\\"label\\\":\\\"Off\\\"},{\\\"value\\\":\\\"5\\\",\\\"label\\\":\\\"Low\\\"},{\\\"value\\\":\\\"10\\\",\\\"label\\\":\\\"High\\\"},{\\\"value\\\":\\\"15\\\",\\\"label\\\":\\\"Max\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1750176201},{"Type":1,"NewValue":"{\"Id\":12373,\"Group\":{\"Id\":7013,\"Name\":\"Read System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":6,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"In-Call Microphone Sensitivity\",\"Json\":\"{\\\"name\\\":\\\"In-Call Microphone Sensitivity\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"In-Call Microphone Sensitivity\\\",\\\"type\\\":\\\"radioGroup\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":true,\\\"isHidden\\\":true,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":null,\\\"options\\\":[{\\\"value\\\":\\\"0\\\",\\\"label\\\":\\\"Off\\\"},{\\\"value\\\":\\\"5\\\",\\\"label\\\":\\\"Low\\\"},{\\\"value\\\":\\\"10\\\",\\\"label\\\":\\\"High\\\"},{\\\"value\\\":\\\"15\\\",\\\"label\\\":\\\"Max\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"],\\\"order\\\":2}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1750176359},{"Type":1,"NewValue":"{\"Id\":12373,\"Group\":{\"Id\":7013,\"Name\":\"Read System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":6,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"InCall Microphone Sensitivity\",\"Json\":\"{\\\"name\\\":\\\"InCall Microphone Sensitivity\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"In-Call Microphone Sensitivity\\\",\\\"type\\\":\\\"radioGroup\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":true,\\\"isHidden\\\":true,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":null,\\\"options\\\":[{\\\"value\\\":\\\"0\\\",\\\"label\\\":\\\"Off\\\"},{\\\"value\\\":\\\"5\\\",\\\"label\\\":\\\"Low\\\"},{\\\"value\\\":\\\"10\\\",\\\"label\\\":\\\"High\\\"},{\\\"value\\\":\\\"15\\\",\\\"label\\\":\\\"Max\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1750181638}],"LanguageId":null,"Tags":[]},{"Id":12386,"Group":{"Id":7001,"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 Sentry","Json":"{\"name\":\"Convert Rio to Sentry\",\"default\":\"\",\"description\":\"Convert Rio to Sentry\",\"type\":\"checkbox\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Enable to load default settings of Sentry\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"false","Command":null,"ProtocolActionObjects":[{"Type":0,"NewValue":"{\"Id\":12386,\"Group\":{\"Id\":7001,\"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 Sentry\",\"Json\":\"{\\\"name\\\":\\\"Convert Rio to Sentry\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Convert Rio to Sentry\\\",\\\"type\\\":\\\"checkbox\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Enable to load default settings of Sentry\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"false\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1761073278},{"Type":0,"NewValue":"{\"Id\":12386,\"Group\":{\"Id\":7001,\"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 Sentry\",\"Json\":\"{\\\"name\\\":\\\"Convert Rio to Sentry\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Convert Rio to Sentry\\\",\\\"type\\\":\\\"checkbox\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Enable to load default settings of Sentry\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"false\",\"Command\":{\"Id\":5425,\"Protocol\":{\"Id\":253,\"Code\":\"Access PS Sentry\",\"Version\":\"1.8\",\"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];\\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}\",\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":true,\"SendAttempts\":4,\"Order\":4},\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1761073282},{"Type":0,"NewValue":"{\"Id\":12386,\"Group\":{\"Id\":7001,\"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 Sentry\",\"Json\":\"{\\\"name\\\":\\\"Convert Rio to Sentry\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Convert Rio to Sentry\\\",\\\"type\\\":\\\"checkbox\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Enable to load default settings of Sentry\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"false\",\"Command\":{\"Id\":5421,\"Protocol\":{\"Id\":253,\"Code\":\"Access PS Sentry\",\"Version\":\"1.8\",\"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\":3},\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1761073285},{"Type":0,"NewValue":"{\"Id\":12386,\"Group\":{\"Id\":7001,\"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 Sentry\",\"Json\":\"{\\\"name\\\":\\\"Convert Rio to Sentry\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Convert Rio to Sentry\\\",\\\"type\\\":\\\"checkbox\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Enable to load default settings of Sentry\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"false\",\"Command\":{\"Id\":5455,\"Protocol\":{\"Id\":253,\"Code\":\"Access PS Sentry\",\"Version\":\"1.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 = '10'; // Enable, no SMS,\\r\\nif (params.AlertSettings.ReportMode) { //  Toggle Call\\r\\n    confSOS += params.AlertSettings.ReportMode;\\r\\n}\\r\\nconfSOS += '00000'; //   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,';\\r\\n    dataSMS += params.AlertSettings.ReportMode; //  Toggle Call\\r\\n    dataSMS += `,${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\":5},\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1761073287},{"Type":0,"NewValue":"{\"Id\":12386,\"Group\":{\"Id\":7001,\"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 Sentry\",\"Json\":\"{\\\"name\\\":\\\"Convert Rio to Sentry\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Convert Rio to Sentry\\\",\\\"type\\\":\\\"checkbox\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Enable to load default settings of Sentry\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"false\",\"Command\":{\"Id\":5416,\"Protocol\":{\"Id\":253,\"Code\":\"Access PS Sentry\",\"Version\":\"1.8\",\"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// Default values for Sentry\\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}\",\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":true,\"SendAttempts\":4,\"Order\":6},\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1761073290},{"Type":0,"NewValue":"{\"Id\":12386,\"Group\":{\"Id\":7001,\"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 Sentry\",\"Json\":\"{\\\"name\\\":\\\"Convert Rio to Sentry\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Convert Rio to Sentry\\\",\\\"type\\\":\\\"checkbox\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Enable to load default settings of Sentry\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"false\",\"Command\":{\"Id\":5454,\"Protocol\":{\"Id\":253,\"Code\":\"Access PS Sentry\",\"Version\":\"1.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\":2,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":true,\"SendAttempts\":4,\"Order\":2},\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1761073292},{"Type":0,"NewValue":"{\"Id\":12386,\"Group\":{\"Id\":7001,\"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 Sentry\",\"Json\":\"{\\\"name\\\":\\\"Convert Rio to Sentry\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Convert Rio to Sentry\\\",\\\"type\\\":\\\"checkbox\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Enable to load default settings of Sentry\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"false\",\"Command\":{\"Id\":5437,\"Protocol\":{\"Id\":253,\"Code\":\"Access PS Sentry\",\"Version\":\"1.8\",\"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\":7},\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1761073295},{"Type":0,"NewValue":"{\"Id\":12386,\"Group\":{\"Id\":7001,\"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 Sentry\",\"Json\":\"{\\\"name\\\":\\\"Convert Rio to Sentry\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Convert Rio to Sentry\\\",\\\"type\\\":\\\"checkbox\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Enable to load default settings of Sentry\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"false\",\"Command\":{\"Id\":5453,\"Protocol\":{\"Id\":253,\"Code\":\"Access PS Sentry\",\"Version\":\"1.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\":1},\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1761073297},{"Type":0,"NewValue":"{\"Id\":12386,\"Group\":{\"Id\":7001,\"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 Sentry\",\"Json\":\"{\\\"name\\\":\\\"Convert Rio to Sentry\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Convert Rio to Sentry\\\",\\\"type\\\":\\\"checkbox\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Enable to load default settings of Sentry\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"false\",\"Command\":{\"Id\":5408,\"Protocol\":{\"Id\":253,\"Code\":\"Access PS Sentry\",\"Version\":\"1.8\",\"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)\\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}\",\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":true,\"SendAttempts\":4,\"Order\":8},\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1761073300},{"Type":0,"NewValue":"{\"Id\":12386,\"Group\":{\"Id\":7001,\"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 Sentry\",\"Json\":\"{\\\"name\\\":\\\"Convert Rio to Sentry\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Convert Rio to Sentry\\\",\\\"type\\\":\\\"checkbox\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Enable to load default settings of Sentry\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"false\",\"Command\":{\"Id\":5429,\"Protocol\":{\"Id\":253,\"Code\":\"Access PS Sentry\",\"Version\":\"1.8\",\"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// default value for Sentry\\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}\",\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":true,\"SendAttempts\":3,\"Order\":9},\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1761073302},{"Type":0,"NewValue":"{\"Id\":12386,\"Group\":{\"Id\":7001,\"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 Sentry\",\"Json\":\"{\\\"name\\\":\\\"Convert Rio to Sentry\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Convert Rio to Sentry\\\",\\\"type\\\":\\\"checkbox\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Enable to load default settings of Sentry\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":2}\",\"Default\":\"false\",\"Command\":{\"Id\":5815,\"Protocol\":{\"Id\":253,\"Code\":\"Access PS Sentry\",\"Version\":\"1.8\",\"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":1761073305},{"Type":1,"NewValue":"{\"Id\":12386,\"Group\":{\"Id\":7001,\"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 Sentry\",\"Json\":\"{\\\"name\\\":\\\"Convert Rio to Sentry\\\",\\\"default\\\":\\\"false\\\",\\\"description\\\":\\\"Convert Rio to Sentry\\\",\\\"type\\\":\\\"checkbox\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Enable to load default settings of Sentry\\\\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":1761662485},{"Type":1,"NewValue":"{\"Id\":12386,\"Group\":{\"Id\":7001,\"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 Sentry\",\"Json\":\"{\\\"name\\\":\\\"Convert Rio to Sentry\\\",\\\"default\\\":\\\"false\\\",\\\"description\\\":\\\"Convert Rio to Sentry\\\",\\\"type\\\":\\\"checkbox\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Enable loading the default settings of Sentry\\\\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":1761662553},{"Type":1,"NewValue":"{\"Id\":12386,\"Group\":{\"Id\":7001,\"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 Sentry\",\"Json\":\"{\\\"name\\\":\\\"Convert Rio to Sentry\\\",\\\"default\\\":\\\"true\\\",\\\"description\\\":\\\"Convert Rio to Sentry\\\",\\\"type\\\":\\\"checkbox\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Enable loading the default settings of Sentry\\\\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":1761678962},{"Type":0,"NewValue":"{\"Id\":12386,\"Group\":{\"Id\":7001,\"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 Sentry\",\"Json\":\"{\\\"name\\\":\\\"Convert Rio to Sentry\\\",\\\"default\\\":\\\"true\\\",\\\"description\\\":\\\"Convert Rio to Sentry\\\",\\\"type\\\":\\\"checkbox\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Enable loading the default settings of Sentry\\\\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\":5471,\"Protocol\":{\"Id\":253,\"Code\":\"Access PS Sentry\",\"Version\":\"1.8\",\"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":1761678966},{"Type":1,"NewValue":"{\"Id\":12386,\"Group\":{\"Id\":7001,\"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 Sentry\",\"Json\":\"{\\\"name\\\":\\\"Convert Rio to Sentry\\\",\\\"default\\\":\\\"true\\\",\\\"description\\\":\\\"Convert Rio to Sentry\\\",\\\"type\\\":\\\"checkbox\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Enable loading the default settings of Sentry\\\\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":1761816193},{"Type":1,"NewValue":"{\"Id\":12386,\"Group\":{\"Id\":7001,\"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":1761816247},{"Type":1,"NewValue":"{\"Id\":12386,\"Group\":{\"Id\":7001,\"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\\\":true,\\\"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":1770223026},{"Type":2,"NewValue":"{\"Id\":12386,\"Group\":{\"Id\":7001,\"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\\\":true,\\\"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":1771525906}],"LanguageId":null,"Tags":[]},{"Id":12386,"Group":{"Id":7001,"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 Sentry","Json":"{\"name\":\"Convert Rio to Sentry\",\"default\":\"\",\"description\":\"Convert Rio to Sentry\",\"type\":\"checkbox\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Enable to load default settings of Sentry\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"false","Command":{"Id":5425,"Protocol":{"Id":253,"Code":"Access PS Sentry","Version":"1.8","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];\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}","AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"CommandToUpdateId":null,"ParentId":null,"Parent":null,"HasAck":true,"HexString":true,"SendAttempts":4,"Order":4},"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":12386,"Group":{"Id":7001,"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 Sentry","Json":"{\"name\":\"Convert Rio to Sentry\",\"default\":\"\",\"description\":\"Convert Rio to Sentry\",\"type\":\"checkbox\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Enable to load default settings of Sentry\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"false","Command":{"Id":5421,"Protocol":{"Id":253,"Code":"Access PS Sentry","Version":"1.8","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":3},"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":12386,"Group":{"Id":7001,"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 Sentry","Json":"{\"name\":\"Convert Rio to Sentry\",\"default\":\"\",\"description\":\"Convert Rio to Sentry\",\"type\":\"checkbox\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Enable to load default settings of Sentry\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"false","Command":{"Id":5455,"Protocol":{"Id":253,"Code":"Access PS Sentry","Version":"1.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 = '10'; // Enable, no SMS,\r\nif (params.AlertSettings.ReportMode) { //  Toggle Call\r\n    confSOS += params.AlertSettings.ReportMode;\r\n}\r\nconfSOS += '00000'; //   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,';\r\n    dataSMS += params.AlertSettings.ReportMode; //  Toggle Call\r\n    dataSMS += `,${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":5},"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":12386,"Group":{"Id":7001,"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 Sentry","Json":"{\"name\":\"Convert Rio to Sentry\",\"default\":\"\",\"description\":\"Convert Rio to Sentry\",\"type\":\"checkbox\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Enable to load default settings of Sentry\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"false","Command":{"Id":5416,"Protocol":{"Id":253,"Code":"Access PS Sentry","Version":"1.8","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// Default values for Sentry\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}","AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"CommandToUpdateId":null,"ParentId":null,"Parent":null,"HasAck":true,"HexString":true,"SendAttempts":4,"Order":6},"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":12386,"Group":{"Id":7001,"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 Sentry","Json":"{\"name\":\"Convert Rio to Sentry\",\"default\":\"\",\"description\":\"Convert Rio to Sentry\",\"type\":\"checkbox\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Enable to load default settings of Sentry\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"false","Command":{"Id":5454,"Protocol":{"Id":253,"Code":"Access PS Sentry","Version":"1.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":2,"CommandToUpdateId":null,"ParentId":null,"Parent":null,"HasAck":true,"HexString":true,"SendAttempts":4,"Order":2},"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":12386,"Group":{"Id":7001,"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 Sentry","Json":"{\"name\":\"Convert Rio to Sentry\",\"default\":\"\",\"description\":\"Convert Rio to Sentry\",\"type\":\"checkbox\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Enable to load default settings of Sentry\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"false","Command":{"Id":5437,"Protocol":{"Id":253,"Code":"Access PS Sentry","Version":"1.8","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":7},"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":12386,"Group":{"Id":7001,"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 Sentry","Json":"{\"name\":\"Convert Rio to Sentry\",\"default\":\"\",\"description\":\"Convert Rio to Sentry\",\"type\":\"checkbox\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Enable to load default settings of Sentry\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"false","Command":{"Id":5453,"Protocol":{"Id":253,"Code":"Access PS Sentry","Version":"1.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":1},"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":12386,"Group":{"Id":7001,"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 Sentry","Json":"{\"name\":\"Convert Rio to Sentry\",\"default\":\"\",\"description\":\"Convert Rio to Sentry\",\"type\":\"checkbox\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Enable to load default settings of Sentry\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"false","Command":{"Id":5408,"Protocol":{"Id":253,"Code":"Access PS Sentry","Version":"1.8","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)\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}","AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"CommandToUpdateId":null,"ParentId":null,"Parent":null,"HasAck":true,"HexString":true,"SendAttempts":4,"Order":8},"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":12386,"Group":{"Id":7001,"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 Sentry","Json":"{\"name\":\"Convert Rio to Sentry\",\"default\":\"\",\"description\":\"Convert Rio to Sentry\",\"type\":\"checkbox\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Enable to load default settings of Sentry\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"false","Command":{"Id":5429,"Protocol":{"Id":253,"Code":"Access PS Sentry","Version":"1.8","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// default value for Sentry\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}","AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"CommandToUpdateId":null,"ParentId":null,"Parent":null,"HasAck":true,"HexString":true,"SendAttempts":3,"Order":9},"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":12386,"Group":{"Id":7001,"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 Sentry","Json":"{\"name\":\"Convert Rio to Sentry\",\"default\":\"\",\"description\":\"Convert Rio to Sentry\",\"type\":\"checkbox\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Enable to load default settings of Sentry\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"],\"order\":2}","Default":"false","Command":{"Id":5815,"Protocol":{"Id":253,"Code":"Access PS Sentry","Version":"1.8","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":12386,"Group":{"Id":7001,"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 Sentry","Json":"{\"name\":\"Convert Rio to Sentry\",\"default\":\"true\",\"description\":\"Convert Rio to Sentry\",\"type\":\"checkbox\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Enable loading the default settings of Sentry\\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":5471,"Protocol":{"Id":253,"Code":"Access PS Sentry","Version":"1.8","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":11818,"Group":{"Id":7001,"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":5817,"Protocol":{"Id":253,"Code":"Access PS Sentry","Version":"1.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},"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]}],"ProtocolChanges":[{"Version":"0.2","UserName":"juanmi","Resource":"Operation","Name":"Access PS Sentry","Message":"(Update) (Access PS Sentry) fix Get wifi list bug","Timestamp":1740071496},{"Version":"0.2","UserName":"juanmi","Resource":"Operation","Name":"Access PS Sentry","Message":"(Update) (Access PS Sentry) fix get wifi list bug 2","Timestamp":1740072152},{"Version":"0.2","UserName":"juanmi","Resource":"Protocol","Name":null,"Message":"Fix Get WiFi list bug. now the list is done with all networks that are both ON or connected","Timestamp":1740072865},{"Version":"0.3","UserName":"juanmi","Resource":"GroupParam","Name":"Approved Contacts","Message":"(Update) (Approved Contacts) remove command.. this is only for read","Timestamp":1740078087},{"Version":"0.3","UserName":"juanmi","Resource":"GroupParam","Name":"Approved Contacts","Message":"Dissociate groupParam Approved Contacts from command getAuthorisedNumbers","Timestamp":1740078091},{"Version":"0.3","UserName":"juanmi","Resource":"GroupParam","Name":"Home Beacon","Message":"(Update) (Home Beacon) remove command. this is only for read","Timestamp":1740078115},{"Version":"0.3","UserName":"juanmi","Resource":"GroupParam","Name":"Home Beacon","Message":"Dissociate groupParam Home Beacon from command getHomeBeacon","Timestamp":1740078119},{"Version":"0.3","UserName":"juanmi","Resource":"Operation","Name":"Access PS Sentry","Message":"(Update) (Access PS Sentry) Fix bug getting Contact List","Timestamp":1740505836},{"Version":"0.3","UserName":"juanmi","Resource":"Operation","Name":"Access PS Sentry","Message":"(Update) (Access PS Sentry) Fix bug in Get Contact List when every contact is deleted","Timestamp":1740508267},{"Version":"0.3","UserName":"juanmi","Resource":"Operation","Name":"Access PS Sentry","Message":"(Update) (Access PS Sentry) Fix bug Get approved contact when all are deleted 2","Timestamp":1740508776},{"Version":"0.3","UserName":"juanmi","Resource":"Operation","Name":"Access PS Sentry","Message":"(Update) (Access PS Sentry) Fix bug Get Beacon list when all beacons are removed 1","Timestamp":1740509697},{"Version":"0.3","UserName":"juanmi","Resource":"Operation","Name":"Access PS Sentry","Message":"(Update) (Access PS Sentry) Fix bug Get WiFi list when all WiFi are deleted","Timestamp":1740509941},{"Version":"0.3","UserName":"juanmi","Resource":"Command","Name":"getCurrentSettings","Message":"(Update) (getCurrentSettings) change resend to 2","Timestamp":1740738964},{"Version":"0.3","UserName":"juanmi","Resource":"Command","Name":"getCurrentSettings2","Message":"(Update) (getCurrentSettings2) change resend to 1","Timestamp":1740738983},{"Version":"0.3","UserName":"juanmi","Resource":"Command","Name":"getCurrentSettings3","Message":"(Update) (getCurrentSettings3) change resend to 2","Timestamp":1740738998},{"Version":"0.3","UserName":"juanmi","Resource":"Command","Name":"getCurrentSettings4","Message":"(Update) (getCurrentSettings4) change resend to 1","Timestamp":1740739088},{"Version":"0.3","UserName":"juanmi","Resource":"Command","Name":"getCurrentSettings5","Message":"(Update) (getCurrentSettings5) change resend to 1","Timestamp":1740739139},{"Version":"0.3","UserName":"juanmi","Resource":"MessageType","Name":"ACK-APN","Message":"(Update) (ACK-APN) add Spanish SMS ACK","Timestamp":1741113861},{"Version":"0.3","UserName":"juanmi","Resource":"MessageType","Name":"ACK-EPHONE-SMS","Message":"(Update) (ACK-EPHONE-SMS) add Spanish SMS ACK","Timestamp":1741114263},{"Version":"0.3","UserName":"juanmi","Resource":"MessageType","Name":"ACK-FALLSENS","Message":"(Update) (ACK-FALLSENS) add Spanish SMS ACK","Timestamp":1741114415},{"Version":"0.3","UserName":"juanmi","Resource":"MessageType","Name":"ACK-FLU","Message":"(Update) (ACK-FLU) add Spanish SMS ACK","Timestamp":1741114901},{"Version":"0.3","UserName":"juanmi","Resource":"MessageType","Name":"ACK-GTW","Message":"(Update) (ACK-GTW) add Spanish SMS ACK","Timestamp":1741114956},{"Version":"0.3","UserName":"juanmi","Resource":"MessageType","Name":"ACK-HB-SMS","Message":"(Update) (ACK-HB-SMS) add Spanish SMS ACK","Timestamp":1741115094},{"Version":"0.3","UserName":"juanmi","Resource":"MessageType","Name":"ACK-OFF","Message":"(Update) (ACK-OFF) add Spanish SMS ACK","Timestamp":1741115215},{"Version":"0.3","UserName":"juanmi","Resource":"MessageType","Name":"ACK-RBT","Message":"(Update) (ACK-RBT) add Spanish SMS ACK","Timestamp":1741115252},{"Version":"0.3","UserName":"juanmi","Resource":"MessageType","Name":"ACK-RST","Message":"(Update) (ACK-RST) add Spanish SMS ACK","Timestamp":1741115310},{"Version":"0.3","UserName":"juanmi","Resource":"MessageType","Name":"ACK-RTL","Message":"(Update) (ACK-RTL) add Spanish SMS ACK","Timestamp":1741115546},{"Version":"0.3","UserName":"juanmi","Resource":"MessageType","Name":"ACK-SRV","Message":"(Update) (ACK-SRV) add Spanish SMS ACK","Timestamp":1741115582},{"Version":"0.3","UserName":"juanmi","Resource":"MessageType","Name":"ACK-WELFARE-SMS","Message":"(Update) (ACK-WELFARE-SMS) modify msg","Timestamp":1741115731},{"Version":"0.3","UserName":"juanmi","Resource":"Protocol","Name":null,"Message":"Fix Get Wifi, Contact, Beacon command, and add some SMS ACK in Spanish","Timestamp":1741116025},{"Version":"0.4","UserName":"juanmi","Resource":"Operation","Name":"Access PS Sentry","Message":"(Update) (Access PS Sentry) Add Tilt Alert code -> \"TLT\"","Timestamp":1741952620},{"Version":"0.4","UserName":"juanmi","Resource":"MessageType","Name":"TLT","Message":"(Create) (TLT) Create MType for Tilt Alert","Timestamp":1741952941},{"Version":"0.4","UserName":"juanmi","Resource":"Protocol","Name":null,"Message":"Adding TILT alarm msg type","Timestamp":1742045217},{"Version":"0.5","UserName":"eulalia_root","Resource":"MessageType","Name":"ACK-APN","Message":"(Update) (ACK-APN) SetAPN , change configuraci?n to configuración","Timestamp":1743511494},{"Version":"0.5","UserName":"juanmi","Resource":"Operation","Name":"Access PS Sentry","Message":"(Update) (Access PS Sentry) Move process code regarding New Welfare on Battery Charging On/off to OystaTemplate decoding","Timestamp":1744052035},{"Version":"0.5","UserName":"juanmi","Resource":"Operation","Name":"Access PS Sentry","Message":"(Update) (Access PS Sentry) roll back to previous version","Timestamp":1744057168},{"Version":"0.5","UserName":"juanmi","Resource":"MessageType","Name":"ACK-APN","Message":"(Update) (ACK-APN) Roll back Configuraci?n APN OK","Timestamp":1744058671},{"Version":"0.5","UserName":"juanmi","Resource":"Operation","Name":"Access PS Sentry","Message":"(Update) (Access PS Sentry) Move process code regarding New Welfare on Battery Charging On/off to OystaTemplate decoding","Timestamp":1744059102},{"Version":"0.5","UserName":"juanmi","Resource":"Operation","Name":"Access PS Sentry","Message":"(Update) (Access PS Sentry) roll back","Timestamp":1744059564},{"Version":"0.5","UserName":"juanmi","Resource":"Operation","Name":"Access PS Sentry","Message":"(Update) (Access PS Sentry) comment //Battery charging and not charging.... avoid sending Welfare...","Timestamp":1744059964},{"Version":"0.5","UserName":"juanmi","Resource":"Operation","Name":"Access PS Sentry","Message":"(Update) (Access PS Sentry) Add case 'BATCN': in Oysta Template","Timestamp":1744060383},{"Version":"0.5","UserName":"juanmi","Resource":"Operation","Name":"Access PS Sentry","Message":"(Update) (Access PS Sentry) case 'BATCF': // Battery Charging - Off in Oysta template for Welfare mode","Timestamp":1744060697},{"Version":"0.5","UserName":"juanmi","Resource":"Operation","Name":"Access PS Sentry","Message":"(Update) (Access PS Sentry) comment to avoid raw msg in json output","Timestamp":1744102555},{"Version":"0.5","UserName":"Sean-Admin","Resource":"Operation","Name":"Access PS Sentry","Message":"(Update) (Access PS Sentry) checking for undefined Welfare config","Timestamp":1744107297},{"Version":"0.5","UserName":"Sean-Admin","Resource":"Operation","Name":"Access PS Sentry","Message":"(Update) (Access PS Sentry) remove raw code value debug output","Timestamp":1744107729},{"Version":"0.5","UserName":"Sean-Admin","Resource":"Operation","Name":"Access PS Sentry","Message":"(Update) (Access PS Sentry) add empty line after console.log","Timestamp":1744109040},{"Version":"0.5","UserName":"Sean-Admin","Resource":"Operation","Name":"Access PS Sentry","Message":"(Update) (Access PS Sentry) fix local Testing","Timestamp":1744113196},{"Version":"0.5","UserName":"Sean-Admin","Resource":"Operation","Name":"Access PS Sentry","Message":"(Update) (Access PS Sentry) fixing localTesting nicer","Timestamp":1744113712},{"Version":"0.5","UserName":"Sean-Admin","Resource":"Operation","Name":"Access PS Sentry","Message":"(Update) (Access PS Sentry) fix undefined Welfare Mode","Timestamp":1744125470},{"Version":"0.5","UserName":"juanmi","Resource":"Operation","Name":"Access PS Sentry","Message":"(Update) (Access PS Sentry) change definition of localTesting from let to var","Timestamp":1744132192},{"Version":"0.5","UserName":"juanmi","Resource":"Protocol","Name":null,"Message":"DEV BUG 1634606 - fix undefined Welfare Mode config, remove raw code value debug output, add empty line after console.log, fix local Testing","Timestamp":1744134489},{"Version":"0.6","UserName":"juanmi","Resource":"Operation","Name":"Access PS Sentry","Message":"(Update) (Access PS Sentry) FIX DEV BUG 1637207 - Message not parsed correctly when Msg with multiple msg inside (2 or more AB)","Timestamp":1744226719},{"Version":"0.6","UserName":"juanmi","Resource":"Operation","Name":"Access PS Sentry","Message":"(Update) (Access PS Sentry) Return from function when no Imei in server param to create the long connection. sendMessageToLocalhostNoWait(\"Eview-ASSOCIATE;\" + imei + \";\" + serverParams.Guid + \";\");","Timestamp":1744278684},{"Version":"0.6","UserName":"juanmi","Resource":"Operation","Name":"Access PS Sentry","Message":"(Update) (Access PS Sentry) enalbleDisable = '1'  in welfare read","Timestamp":1744282084},{"Version":"0.6","UserName":"juanmi","Resource":"Operation","Name":"Access PS Sentry","Message":"(Update) (Access PS Sentry) roll back","Timestamp":1744282700},{"Version":"0.6","UserName":"juanmi","Resource":"Protocol","Name":null,"Message":"Fix tickets regarding bugs with long connection and multimsgs","Timestamp":1744282897},{"Version":"0.7","UserName":"juanmi","Resource":"Operation","Name":"Access PS Sentry","Message":"(Update) (Access PS Sentry) Comment \"return\" in msg ASSOCIATE in msg types !=03  ","Timestamp":1744367069},{"Version":"0.7","UserName":"juanmi","Resource":"Protocol","Name":null,"Message":"Fix issue with long connection stablishment","Timestamp":1744367541},{"Version":"0.8","UserName":"juanmi","Resource":"Operation","Name":"Access PS Sentry","Message":"(Update) (Access PS Sentry) Fix double msgs and undefined ConfigId","Timestamp":1744387710},{"Version":"0.8","UserName":"juanmi","Resource":"MessageType","Name":"CHK","Message":"(Update) (CHK) Change Eview to Sentry","Timestamp":1744387798},{"Version":"0.8","UserName":"juanmi","Resource":"GroupParam","Name":"Current Firmware Version","Message":"(Update) (Current Firmware Version) Reorder Group Params","Timestamp":1744388162},{"Version":"0.8","UserName":"juanmi","Resource":"GroupParam","Name":"Custom Id","Message":"(Update) (Custom Id) Reorder Group Params","Timestamp":1744388165},{"Version":"0.8","UserName":"juanmi","Resource":"GroupParam","Name":"Charging","Message":"(Update) (Charging) Reorder Group Params","Timestamp":1744388168},{"Version":"0.8","UserName":"juanmi","Resource":"GroupParam","Name":"Welfare","Message":"(Update) (Welfare) Reorder Group Params","Timestamp":1744388170},{"Version":"0.8","UserName":"juanmi","Resource":"GroupParam","Name":"Charging","Message":"(Update) (Charging) unhide","Timestamp":1744388189},{"Version":"0.8","UserName":"juanmi","Resource":"GroupParam","Name":"Welfare","Message":"(Update) (Welfare) Unhide","Timestamp":1744388202},{"Version":"0.8","UserName":"juanmi","Resource":"Operation","Name":"Access PS Sentry","Message":"(Update) (Access PS Sentry) Fix ticket 1644555 - Alarm ended info value","Timestamp":1744734130},{"Version":"0.8","UserName":"juanmi","Resource":"Protocol","Name":null,"Message":"Two small fixes - Double msg and Info on alert ended","Timestamp":1744734225},{"Version":"0.9","UserName":"juanmi","Resource":"Group","Name":"Profiles","Message":"(Create) (Profiles) Create Profiles Group for Silent Mode","Timestamp":1746724775},{"Version":"0.9","UserName":"juanmi","Resource":"Group","Name":"Profiles","Message":"(Update) (Profiles) Reorder Groups","Timestamp":1746724814},{"Version":"0.9","UserName":"juanmi","Resource":"Group","Name":"Alert Settings","Message":"(Update) (Alert Settings) Reorder Groups","Timestamp":1746724816},{"Version":"0.9","UserName":"juanmi","Resource":"Group","Name":"Performance Settings","Message":"(Update) (Performance Settings) Reorder Groups","Timestamp":1746724819},{"Version":"0.9","UserName":"juanmi","Resource":"Group","Name":"Additional Settings","Message":"(Update) (Additional Settings) Reorder Groups","Timestamp":1746724822},{"Version":"0.9","UserName":"juanmi","Resource":"Group","Name":"System Settings","Message":"(Update) (System Settings) Reorder Groups","Timestamp":1746724824},{"Version":"0.9","UserName":"juanmi","Resource":"GroupParam","Name":"Silent Call Mode","Message":"(Create) (Silent Call Mode) Config Parameter to Enable // disable Silent Call Mode","Timestamp":1746725107},{"Version":"0.9","UserName":"juanmi","Resource":"GroupParam","Name":"Silent Call Mode","Message":"(Update) (Silent Call Mode) Define description","Timestamp":1746725238},{"Version":"0.9","UserName":"juanmi","Resource":"Command","Name":"setSystemSettings","Message":"(Update) (setSystemSettings) Add Enable//Disable LT Silent Call Mode","Timestamp":1746726047},{"Version":"0.9","UserName":"juanmi","Resource":"Command","Name":"setEnableControl","Message":"(Update) (setEnableControl) Modify for LT Silent Call Mode","Timestamp":1746729326},{"Version":"0.9","UserName":"juanmi","Resource":"GroupParam","Name":"Silent Call Mode","Message":"(Update) (Silent Call Mode) Add commands to Silent Call Mode","Timestamp":1746729412},{"Version":"0.9","UserName":"juanmi","Resource":"GroupParam","Name":"Silent Call Mode","Message":"Associate groupParam Silent Call Mode to command setEnableControl","Timestamp":1746729416},{"Version":"0.9","UserName":"juanmi","Resource":"GroupParam","Name":"Silent Call Mode","Message":"Associate groupParam Silent Call Mode to command setSystemSettings","Timestamp":1746729419},{"Version":"0.9","UserName":"juanmi","Resource":"Group","Name":"Read Profiles","Message":"(Create) (Read Profiles) Add Read Profiles group for Silent Call Mode","Timestamp":1746729497},{"Version":"0.9","UserName":"juanmi","Resource":"Group","Name":"Read Profiles","Message":"(Update) (Read Profiles) Reorder Groups","Timestamp":1746729507},{"Version":"0.9","UserName":"juanmi","Resource":"Group","Name":"Read Alert Settings","Message":"(Update) (Read Alert Settings) Reorder Groups","Timestamp":1746729510},{"Version":"0.9","UserName":"juanmi","Resource":"Group","Name":"Read Performance Settings","Message":"(Update) (Read Performance Settings) Reorder Groups","Timestamp":1746729512},{"Version":"0.9","UserName":"juanmi","Resource":"Group","Name":"Read Additional Settings","Message":"(Update) (Read Additional Settings) Reorder Groups","Timestamp":1746729515},{"Version":"0.9","UserName":"juanmi","Resource":"Group","Name":"Read System Settings","Message":"(Update) (Read System Settings) Reorder Groups","Timestamp":1746729517},{"Version":"0.9","UserName":"juanmi","Resource":"Group","Name":"Read State","Message":"(Update) (Read State) Reorder Groups","Timestamp":1746729520},{"Version":"0.9","UserName":"juanmi","Resource":"GroupParam","Name":"Read Silent Call Mode","Message":"(Create) (Read Silent Call Mode) add Read Silent Call Mode param","Timestamp":1746729590},{"Version":"0.9","UserName":"juanmi","Resource":"GroupParam","Name":"Silent Call Mode","Message":"(Update) (Silent Call Mode) change name","Timestamp":1746729660},{"Version":"0.9","UserName":"juanmi","Resource":"GroupParam","Name":"Silent Call Mode","Message":"(Update) (Silent Call Mode) add help text","Timestamp":1746729781},{"Version":"0.9","UserName":"juanmi","Resource":"Operation","Name":"Access PS Sentry","Message":"(Update) (Access PS Sentry) Add Read Silent Call Mode param","Timestamp":1746732242},{"Version":"0.9","UserName":"juanmi","Resource":"Protocol","Name":null,"Message":"Add Silent Call Mode","Timestamp":1747156728},{"Version":"1.0","UserName":"juanmi","Resource":"Group","Name":"Interface Options","Message":"(Create) (Interface Options) New Group for Buttons options","Timestamp":1747325120},{"Version":"1.0","UserName":"juanmi","Resource":"GroupParam","Name":"SOS Activation Button","Message":"(Create) (SOS Activation Button) Add new param to control SOS Activation Button","Timestamp":1747325232},{"Version":"1.0","UserName":"juanmi","Resource":"GroupParam","Name":"SOS Activation Button","Message":"Associate groupParam SOS Activation Button to command setSOSButtonSettings","Timestamp":1747325236},{"Version":"1.0","UserName":"juanmi","Resource":"GroupParam","Name":"Speed Activation Dial Button","Message":"(Create) (Speed Activation Dial Button) Add param to control Speed Activation Dial Button","Timestamp":1747325330},{"Version":"1.0","UserName":"juanmi","Resource":"GroupParam","Name":"Speed Activation Dial Button","Message":"Associate groupParam Speed Activation Dial Button to command setSpeedDialSettings","Timestamp":1747325333},{"Version":"1.0","UserName":"juanmi","Resource":"Command","Name":"setSOSButtonSettings","Message":"(Update) (setSOSButtonSettings) Modify command to support ticket 1674667 requeriments (Buttons trigger options)","Timestamp":1747326439},{"Version":"1.0","UserName":"juanmi","Resource":"GroupParam","Name":"SOS Activation Button","Message":"(Update) (SOS Activation Button) change value","Timestamp":1747326494},{"Version":"1.0","UserName":"juanmi","Resource":"Command","Name":"setSpeedDialSettings","Message":"(Update) (setSpeedDialSettings) Modify command to support ticket 1674667 requeriments (Speed Dial Buttons trigger options)","Timestamp":1747327130},{"Version":"1.0","UserName":"juanmi","Resource":"Group","Name":"Read Interface Options","Message":"(Create) (Read Interface Options) Create group Read Interface Options","Timestamp":1747327896},{"Version":"1.0","UserName":"juanmi","Resource":"GroupParam","Name":"SOS Activation Button","Message":"(Create) (SOS Activation Button) Add param to Read SOS Activation Button","Timestamp":1747328053},{"Version":"1.0","UserName":"juanmi","Resource":"GroupParam","Name":"Speed Activation Dial Button","Message":"(Create) (Speed Activation Dial Button) Add param to Read Speed Activation Dial Button","Timestamp":1747328179},{"Version":"1.0","UserName":"juanmi","Resource":"Command","Name":"getCurrentSettings","Message":"(Update) (getCurrentSettings) Add get x20 SOS Button Settings","Timestamp":1747656839},{"Version":"1.0","UserName":"juanmi","Resource":"Operation","Name":"Access PS Sentry","Message":"(Update) (Access PS Sentry) Add getSpeedDial TriggerMode","Timestamp":1747657660},{"Version":"1.0","UserName":"juanmi","Resource":"Command","Name":"getCurrentSettings","Message":"(Update) (getCurrentSettings) change hexLEnght","Timestamp":1747658759},{"Version":"1.0","UserName":"juanmi","Resource":"Operation","Name":"Access PS Sentry","Message":"(Update) (Access PS Sentry) Small typo fix","Timestamp":1747658925},{"Version":"1.0","UserName":"juanmi","Resource":"Operation","Name":"Access PS Sentry","Message":"(Update) (Access PS Sentry) getSOSButton trigger mode (ticket 1674667)","Timestamp":1747660364},{"Version":"1.0","UserName":"juanmi","Resource":"Protocol","Name":null,"Message":"Add \"SOS Activation Button\" and \"Speed Activation Dial Button\" Options to Access PS Sentry (ticket 1674667)","Timestamp":1747660689},{"Version":"1.1","UserName":"juanmi","Resource":"Operation","Name":"Access PS Sentry","Message":"(Update) (Access PS Sentry) add create long connection if it is needed in command 01 and 03","Timestamp":1749055850},{"Version":"1.1","UserName":"juanmi","Resource":"MessageType","Name":"CON-ASSO","Message":"(Update) (CON-ASSO) change msg code to CON","Timestamp":1749056548},{"Version":"1.1","UserName":"juanmi","Resource":"Operation","Name":"Access PS Sentry","Message":"(Update) (Access PS Sentry) comment //return to create long connection","Timestamp":1749108714},{"Version":"1.1","UserName":"juanmi","Resource":"Protocol","Name":null,"Message":"Fix Message gets parsed by Watch/Sentry","Timestamp":1749580841},{"Version":"1.2","UserName":"juanmi","Resource":"GroupParam","Name":"Incoming Call Ringtone Volume","Message":"(Create) (Incoming Call Ringtone Volume) New Param","Timestamp":1749742702},{"Version":"1.2","UserName":"juanmi","Resource":"GroupParam","Name":"In-Call Speaker Volume","Message":"(Create) (In-Call Speaker Volume) new param","Timestamp":1749742852},{"Version":"1.2","UserName":"juanmi","Resource":"GroupParam","Name":"In-Call Microphone Sensitivity","Message":"(Create) (In-Call Microphone Sensitivity) New param","Timestamp":1749742951},{"Version":"1.2","UserName":"juanmi","Resource":"GroupParam","Name":"Allow List","Message":"(Update) (Allow List) Reorder Group Params","Timestamp":1749742974},{"Version":"1.2","UserName":"juanmi","Resource":"GroupParam","Name":"AutoAnswer","Message":"(Update) (AutoAnswer) Reorder Group Params","Timestamp":1749742978},{"Version":"1.2","UserName":"juanmi","Resource":"GroupParam","Name":"Incoming Call Ringtone Volume","Message":"(Update) (Incoming Call Ringtone Volume) Reorder Group Params","Timestamp":1749742981},{"Version":"1.2","UserName":"juanmi","Resource":"GroupParam","Name":"In-Call Speaker Volume","Message":"(Update) (In-Call Speaker Volume) Reorder Group Params","Timestamp":1749742984},{"Version":"1.2","UserName":"juanmi","Resource":"GroupParam","Name":"SystemLanguage","Message":"(Update) (SystemLanguage) Reorder Group Params","Timestamp":1749742987},{"Version":"1.2","UserName":"juanmi","Resource":"GroupParam","Name":"Volume","Message":"(Update) (Volume) Reorder Group Params","Timestamp":1749742990},{"Version":"1.2","UserName":"juanmi","Resource":"GroupParam","Name":"In-Call Microphone Sensitivity","Message":"(Update) (In-Call Microphone Sensitivity) Reorder Group Params","Timestamp":1749742993},{"Version":"1.2","UserName":"juanmi","Resource":"GroupParam","Name":"In-Call Microphone Sensitivity","Message":"(Update) (In-Call Microphone Sensitivity) Reorder Group Params","Timestamp":1749743066},{"Version":"1.2","UserName":"juanmi","Resource":"GroupParam","Name":"SystemLanguage","Message":"(Update) (SystemLanguage) Reorder Group Params","Timestamp":1749743069},{"Version":"1.2","UserName":"juanmi","Resource":"GroupParam","Name":"Volume","Message":"(Update) (Volume) Reorder Group Params","Timestamp":1749743073},{"Version":"1.2","UserName":"juanmi","Resource":"GroupParam","Name":"Volume","Message":"(Update) (Volume) Reorder Group Params","Timestamp":1749743080},{"Version":"1.2","UserName":"juanmi","Resource":"GroupParam","Name":"SystemLanguage","Message":"(Update) (SystemLanguage) Reorder Group Params","Timestamp":1749743083},{"Version":"1.2","UserName":"juanmi","Resource":"GroupParam","Name":"Incoming Call Ringtone Volume","Message":"(Update) (Incoming Call Ringtone Volume) assign command","Timestamp":1749743464},{"Version":"1.2","UserName":"juanmi","Resource":"GroupParam","Name":"Incoming Call Ringtone Volume","Message":"Associate groupParam Incoming Call Ringtone Volume to command setRingToneVolume","Timestamp":1749743468},{"Version":"1.2","UserName":"juanmi","Resource":"GroupParam","Name":"In-Call Speaker Volume","Message":"(Update) (In-Call Speaker Volume) assign command","Timestamp":1749743532},{"Version":"1.2","UserName":"juanmi","Resource":"GroupParam","Name":"In-Call Speaker Volume","Message":"Associate groupParam In-Call Speaker Volume to command setSpeakerVolume","Timestamp":1749743537},{"Version":"1.2","UserName":"juanmi","Resource":"GroupParam","Name":"In-Call Microphone Sensitivity","Message":"(Update) (In-Call Microphone Sensitivity) assign command","Timestamp":1749743625},{"Version":"1.2","UserName":"juanmi","Resource":"GroupParam","Name":"In-Call Microphone Sensitivity","Message":"Associate groupParam In-Call Microphone Sensitivity to command setMicVolume","Timestamp":1749743629},{"Version":"1.2","UserName":"juanmi","Resource":"GroupParam","Name":"System Voice Prompt Volume","Message":"(Update) (System Voice Prompt Volume) assign command","Timestamp":1749743751},{"Version":"1.2","UserName":"juanmi","Resource":"GroupParam","Name":"System Voice Prompt Volume","Message":"Dissociate groupParam System Voice Prompt Volume from command setSpeakerVolume","Timestamp":1749743756},{"Version":"1.2","UserName":"juanmi","Resource":"GroupParam","Name":"System Voice Prompt Volume","Message":"Dissociate groupParam System Voice Prompt Volume from command setRingToneVolume","Timestamp":1749743760},{"Version":"1.2","UserName":"juanmi","Resource":"GroupParam","Name":"Incoming Call Ringtone Volume","Message":"(Create) (Incoming Call Ringtone Volume) new read param","Timestamp":1749744486},{"Version":"1.2","UserName":"juanmi","Resource":"GroupParam","Name":"Allow List","Message":"(Update) (Allow List) Reorder Group Params","Timestamp":1749744507},{"Version":"1.2","UserName":"juanmi","Resource":"GroupParam","Name":"Volume","Message":"(Update) (Volume) Reorder Group Params","Timestamp":1749744511},{"Version":"1.2","UserName":"juanmi","Resource":"GroupParam","Name":"Auto Answer","Message":"(Update) (Auto Answer) Reorder Group Params","Timestamp":1749744514},{"Version":"1.2","UserName":"juanmi","Resource":"GroupParam","Name":"System Language","Message":"(Update) (System Language) Reorder Group Params","Timestamp":1749744518},{"Version":"1.2","UserName":"juanmi","Resource":"GroupParam","Name":"Incoming Call Ringtone Volume","Message":"(Update) (Incoming Call Ringtone Volume) Reorder Group Params","Timestamp":1749744522},{"Version":"1.2","UserName":"juanmi","Resource":"GroupParam","Name":"Incoming Call Ringtone Volume","Message":"(Update) (Incoming Call Ringtone Volume) Reorder Group Params","Timestamp":1749744537},{"Version":"1.2","UserName":"juanmi","Resource":"GroupParam","Name":"System Language","Message":"(Update) (System Language) Reorder Group Params","Timestamp":1749744540},{"Version":"1.2","UserName":"juanmi","Resource":"GroupParam","Name":"Incoming Call Ringtone Volume","Message":"(Update) (Incoming Call Ringtone Volume) Reorder Group Params","Timestamp":1749744643},{"Version":"1.2","UserName":"juanmi","Resource":"GroupParam","Name":"In-Call Microphone Sensitivity","Message":"(Update) (In-Call Microphone Sensitivity) Reorder Group Params","Timestamp":1749744646},{"Version":"1.2","UserName":"juanmi","Resource":"GroupParam","Name":"In-Call Speaker Volume","Message":"(Update) (In-Call Speaker Volume) Reorder Group Params","Timestamp":1749744650},{"Version":"1.2","UserName":"juanmi","Resource":"GroupParam","Name":"System Voice Prompt Volume","Message":"(Update) (System Voice Prompt Volume) Reorder Group Params","Timestamp":1749744654},{"Version":"1.2","UserName":"juanmi","Resource":"GroupParam","Name":"In-Call Speaker Volume","Message":"(Update) (In-Call Speaker Volume) Reorder Group Params","Timestamp":1749744664},{"Version":"1.2","UserName":"juanmi","Resource":"GroupParam","Name":"In-Call Microphone Sensitivity","Message":"(Update) (In-Call Microphone Sensitivity) Reorder Group Params","Timestamp":1749744668},{"Version":"1.2","UserName":"juanmi","Resource":"GroupParam","Name":"System Voice Prompt Volume","Message":"(Update) (System Voice Prompt Volume) Reorder Group Params","Timestamp":1749744677},{"Version":"1.2","UserName":"juanmi","Resource":"GroupParam","Name":"In-Call Microphone Sensitivity","Message":"(Update) (In-Call Microphone Sensitivity) Reorder Group Params","Timestamp":1749744680},{"Version":"1.2","UserName":"juanmi","Resource":"GroupParam","Name":"In-Call Microphone Sensitivity","Message":"(Update) (In-Call Microphone Sensitivity) new values","Timestamp":1749744802},{"Version":"1.2","UserName":"juanmi","Resource":"GroupParam","Name":"Incoming Call Ringtone Volume","Message":"(Update) (Incoming Call Ringtone Volume) Reorder Group Params","Timestamp":1749744853},{"Version":"1.2","UserName":"juanmi","Resource":"GroupParam","Name":"Volume","Message":"(Update) (Volume) Reorder Group Params","Timestamp":1749744858},{"Version":"1.2","UserName":"juanmi","Resource":"GroupParam","Name":"Auto Answer","Message":"(Update) (Auto Answer) Reorder Group Params","Timestamp":1749744861},{"Version":"1.2","UserName":"juanmi","Resource":"GroupParam","Name":"Auto Answer","Message":"(Update) (Auto Answer) Reorder Group Params","Timestamp":1749744870},{"Version":"1.2","UserName":"juanmi","Resource":"GroupParam","Name":"Incoming Call Ringtone Volume","Message":"(Update) (Incoming Call Ringtone Volume) Reorder Group Params","Timestamp":1749744873},{"Version":"1.2","UserName":"juanmi","Resource":"GroupParam","Name":"Volume","Message":"(Update) (Volume) Reorder Group Params","Timestamp":1749744877},{"Version":"1.2","UserName":"juanmi","Resource":"GroupParam","Name":"System Voice Prompt Volume","Message":"(Update) (System Voice Prompt Volume) change name","Timestamp":1749744942},{"Version":"1.2","UserName":"juanmi","Resource":"GroupParam","Name":"In-Call Speaker Volume","Message":"(Create) (In-Call Speaker Volume) new read param","Timestamp":1749745135},{"Version":"1.2","UserName":"juanmi","Resource":"GroupParam","Name":"In-Call Microphone Sensitivity","Message":"(Create) (In-Call Microphone Sensitivity) new read param","Timestamp":1749745218},{"Version":"1.2","UserName":"juanmi","Resource":"GroupParam","Name":"In-Call Microphone Sensitivity","Message":"(Update) (In-Call Microphone Sensitivity) Reorder Group Params","Timestamp":1749745256},{"Version":"1.2","UserName":"juanmi","Resource":"GroupParam","Name":"In-Call Speaker Volume","Message":"(Update) (In-Call Speaker Volume) Reorder Group Params","Timestamp":1749745260},{"Version":"1.2","UserName":"juanmi","Resource":"GroupParam","Name":"System Language","Message":"(Update) (System Language) Reorder Group Params","Timestamp":1749745264},{"Version":"1.2","UserName":"juanmi","Resource":"GroupParam","Name":"System Voice Prompt Volume","Message":"(Update) (System Voice Prompt Volume) Reorder Group Params","Timestamp":1749745268},{"Version":"1.2","UserName":"juanmi","Resource":"GroupParam","Name":"In-Call Speaker Volume","Message":"(Update) (In-Call Speaker Volume) Reorder Group Params","Timestamp":1749745278},{"Version":"1.2","UserName":"juanmi","Resource":"GroupParam","Name":"In-Call Microphone Sensitivity","Message":"(Update) (In-Call Microphone Sensitivity) Reorder Group Params","Timestamp":1749745281},{"Version":"1.2","UserName":"juanmi","Resource":"GroupParam","Name":"System Voice Prompt Volume","Message":"(Update) (System Voice Prompt Volume) Reorder Group Params","Timestamp":1749745291},{"Version":"1.2","UserName":"juanmi","Resource":"GroupParam","Name":"In-Call Microphone Sensitivity","Message":"(Update) (In-Call Microphone Sensitivity) Reorder Group Params","Timestamp":1749745295},{"Version":"1.2","UserName":"juanmi","Resource":"GroupParam","Name":"System Language","Message":"(Update) (System Language) Reorder Group Params","Timestamp":1749745298},{"Version":"1.2","UserName":"juanmi","Resource":"GroupParam","Name":"In-Call Microphone Sensitivity","Message":"(Update) (In-Call Microphone Sensitivity) Reorder Group Params","Timestamp":1749746319},{"Version":"1.2","UserName":"juanmi","Resource":"GroupParam","Name":"In-Call Microphone Sensitivity","Message":"(Update) (In-Call Microphone Sensitivity) Hide read control for mic","Timestamp":1750176201},{"Version":"1.2","UserName":"juanmi","Resource":"GroupParam","Name":"In-Call Microphone Sensitivity","Message":"(Update) (In-Call Microphone Sensitivity) Hide Control for mic","Timestamp":1750176243},{"Version":"1.2","UserName":"juanmi","Resource":"GroupParam","Name":"In-Call Speaker Volume","Message":"(Update) (In-Call Speaker Volume) Reorder Group Params","Timestamp":1750176284},{"Version":"1.2","UserName":"juanmi","Resource":"GroupParam","Name":"Incoming Call Ringtone Volume","Message":"(Update) (Incoming Call Ringtone Volume) Reorder Group Params","Timestamp":1750176287},{"Version":"1.2","UserName":"juanmi","Resource":"GroupParam","Name":"In-Call Microphone Sensitivity","Message":"(Update) (In-Call Microphone Sensitivity) Reorder Group Params","Timestamp":1750176290},{"Version":"1.2","UserName":"juanmi","Resource":"GroupParam","Name":"Notifications and Alerts","Message":"(Update) (Notifications and Alerts) change name to Notifications and Alerts","Timestamp":1750176335},{"Version":"1.2","UserName":"juanmi","Resource":"GroupParam","Name":"In-Call Microphone Sensitivity","Message":"(Update) (In-Call Microphone Sensitivity) Reorder Group Params","Timestamp":1750176359},{"Version":"1.2","UserName":"juanmi","Resource":"GroupParam","Name":"Incoming Call Ringtone Volume","Message":"(Update) (Incoming Call Ringtone Volume) Reorder Group Params","Timestamp":1750176362},{"Version":"1.2","UserName":"juanmi","Resource":"GroupParam","Name":"System Voice Prompt Volume","Message":"(Update) (System Voice Prompt Volume) Reorder Group Params","Timestamp":1750176365},{"Version":"1.2","UserName":"juanmi","Resource":"GroupParam","Name":"Notifications and Alerts","Message":"(Update) (Notifications and Alerts) modify name to Notifications and Alerts","Timestamp":1750176391},{"Version":"1.2","UserName":"juanmi","Resource":"Command","Name":"setSpeakerVolume","Message":"(Update) (setSpeakerVolume) modify command for new params definitions","Timestamp":1750181499},{"Version":"1.2","UserName":"juanmi","Resource":"GroupParam","Name":"InCall Speaker Volume","Message":"(Update) (InCall Speaker Volume) change name. delete \"-\"","Timestamp":1750181586},{"Version":"1.2","UserName":"juanmi","Resource":"GroupParam","Name":"InCall Speaker Volume","Message":"(Update) (InCall Speaker Volume) change name. delete \"-\"","Timestamp":1750181624},{"Version":"1.2","UserName":"juanmi","Resource":"GroupParam","Name":"InCall Microphone Sensitivity","Message":"(Update) (InCall Microphone Sensitivity) change name. delete \"-\"","Timestamp":1750181638},{"Version":"1.2","UserName":"juanmi","Resource":"GroupParam","Name":"InCall Microphone Sensitivity","Message":"(Update) (InCall Microphone Sensitivity) change name. delete \"-\"","Timestamp":1750181661},{"Version":"1.2","UserName":"juanmi","Resource":"Command","Name":"setSpeakerVolume","Message":"(Update) (setSpeakerVolume) change param's name. delete \"-\"","Timestamp":1750181703},{"Version":"1.2","UserName":"juanmi","Resource":"Command","Name":"setRingToneVolume","Message":"(Update) (setRingToneVolume) modify params","Timestamp":1750181939},{"Version":"1.2","UserName":"juanmi","Resource":"Command","Name":"setVoicePromptVolume","Message":"(Update) (setVoicePromptVolume) modify params","Timestamp":1750182076},{"Version":"1.2","UserName":"juanmi","Resource":"Command","Name":"getCurrentSettings","Message":"(Update) (getCurrentSettings) Add key to get speaker volume and notifications volume","Timestamp":1750182701},{"Version":"1.2","UserName":"juanmi","Resource":"Operation","Name":"Access PS Sentry","Message":"(Update) (Access PS Sentry) Parse information from volume commands (speaker, ring, prompt) ticket 1712715","Timestamp":1750183236},{"Version":"1.2","UserName":"juanmi","Resource":"Protocol","Name":null,"Message":"ticket 1712715 Sentry: Voice Prompt Control Option","Timestamp":1750183491},{"Version":"1.3","UserName":"Sean-Admin","Resource":"Operation","Name":"Access PS Sentry","Message":"(Update) (Access PS Sentry) Add ack and imei when new connection made","Timestamp":1750680145},{"Version":"1.3","UserName":"Sean-Admin","Resource":"Operation","Name":"Access PS Sentry","Message":"(Update) (Access PS Sentry) ack in wrong place","Timestamp":1750680291},{"Version":"1.3","UserName":"Sean-Admin","Resource":"Operation","Name":"Access PS Sentry","Message":"(Update) (Access PS Sentry) remove acks to force resend","Timestamp":1750686495},{"Version":"1.3","UserName":"juanmi","Resource":"Operation","Name":"Access PS Sentry","Message":"(Update) (Access PS Sentry) fix associate long connection // no return","Timestamp":1750700224},{"Version":"1.3","UserName":"juanmi","Resource":"Protocol","Name":null,"Message":"fix associate long connection // no return","Timestamp":1750700296},{"Version":"1.4","UserName":"juanmi","Resource":"Command","Name":"setSpeedDialSettings","Message":"(Update) (setSpeedDialSettings) ticket 1750842: Feedback: vibrate and voice prompt (default) for Speed Dial Button","Timestamp":1752164021},{"Version":"1.4","UserName":"juanmi","Resource":"Protocol","Name":null,"Message":"ticket 1750842: Feedback: vibrate and voice prompt (default) for Speed Dial Button","Timestamp":1752171848},{"Version":"1.5","UserName":"juanmi","Resource":"Operation","Name":"Access PS Sentry","Message":"(Update) (Access PS Sentry) ticket 1773714: Modify Ambert Alert events to match Rio","Timestamp":1753207016},{"Version":"1.5","UserName":"juanmi","Resource":"Operation","Name":"Access PS Sentry","Message":"(Update) (Access PS Sentry) ticket 1773714: small change to match msg type","Timestamp":1753207338},{"Version":"1.5","UserName":"juanmi","Resource":"Protocol","Name":null,"Message":"ticket 1773714: Modify Ambert Alert events to match Rio","Timestamp":1753208493},{"Version":"1.6","UserName":"juanmi","Resource":"MessageType","Name":"ALA-O","Message":"(Update) (ALA-O) change to standard instead of alarm","Timestamp":1753258722},{"Version":"1.6","UserName":"juanmi","Resource":"MessageType","Name":"ALA-C","Message":"(Update) (ALA-C) change to standard instead of alarm","Timestamp":1753258739},{"Version":"1.6","UserName":"Michael_Admin","Resource":"Protocol","Name":null,"Message":"ready to deploy packed by michael ","Timestamp":1753268767},{"Version":"1.7","UserName":"juanmi","Resource":"Operation","Name":"Access PS Sentry","Message":"(Update) (Access PS Sentry) Add multimsg parser handle","Timestamp":1756917365},{"Version":"1.7","UserName":"juanmi","Resource":"Operation","Name":"Access PS Sentry","Message":"(Update) (Access PS Sentry) Ticket 1822799: AGPS timestamp bug and ticket 1796516: GPS location data in alarm msg","Timestamp":1757443369},{"Version":"1.7","UserName":"juanmi","Resource":"Operation","Name":"Access PS Sentry","Message":"(Update) (Access PS Sentry) Fix for Nullsih (??) operator","Timestamp":1757592825},{"Version":"1.7","UserName":"juanmi","Resource":"Protocol","Name":null,"Message":"Ticket 1822799: AGPS timestamp bug and ticket 1796516: GPS location data in alarm msg. Fixed nullish operator","Timestamp":1757592897},{"Version":"1.8","UserName":"juanmi","Resource":"Command","Name":"actionDeleteRecords","Message":"(Update) (actionDeleteRecords) delete Order property","Timestamp":1761071883},{"Version":"1.8","UserName":"juanmi","Resource":"Command","Name":"actionDeviceReboot","Message":"(Update) (actionDeviceReboot) delete Order property","Timestamp":1761071899},{"Version":"1.8","UserName":"juanmi","Resource":"Command","Name":"actionFactoryReset","Message":"(Update) (actionFactoryReset) delete Order property","Timestamp":1761071914},{"Version":"1.8","UserName":"juanmi","Resource":"Command","Name":"actionFindDevice","Message":"(Update) (actionFindDevice) delete Order property","Timestamp":1761071997},{"Version":"1.8","UserName":"juanmi","Resource":"Command","Name":"actionPowerOff","Message":"(Update) (actionPowerOff) delete Order property","Timestamp":1761072018},{"Version":"1.8","UserName":"juanmi","Resource":"Command","Name":"actionRealTimeLocation","Message":"(Update) (actionRealTimeLocation) delete Order property","Timestamp":1761072033},{"Version":"1.8","UserName":"juanmi","Resource":"Command","Name":"actionTrace","Message":"(Update) (actionTrace) delete Order property","Timestamp":1761072051},{"Version":"1.8","UserName":"juanmi","Resource":"Command","Name":"getCustomId","Message":"(Update) (getCustomId) delete Order property","Timestamp":1761072086},{"Version":"1.8","UserName":"juanmi","Resource":"Command","Name":"getFallDownAlert","Message":"(Update) (getFallDownAlert) delete Order property","Timestamp":1761072102},{"Version":"1.8","UserName":"juanmi","Resource":"Command","Name":"getFirmwareVersion","Message":"(Update) (getFirmwareVersion) delete Order property","Timestamp":1761072117},{"Version":"1.8","UserName":"juanmi","Resource":"Command","Name":"getNoMotionAlert","Message":"(Update) (getNoMotionAlert) delete Order property","Timestamp":1761072132},{"Version":"1.8","UserName":"juanmi","Resource":"Command","Name":"getPerformanceMode","Message":"(Update) (getPerformanceMode) delete Order property","Timestamp":1761072150},{"Version":"1.8","UserName":"juanmi","Resource":"Command","Name":"getSystemLanguage","Message":"(Update) (getSystemLanguage) delete Order property","Timestamp":1761072176},{"Version":"1.8","UserName":"juanmi","Resource":"Command","Name":"getVolume","Message":"(Update) (getVolume) delete Order property","Timestamp":1761072198},{"Version":"1.8","UserName":"juanmi","Resource":"Command","Name":"setAuthorisedNumbers","Message":"(Update) (setAuthorisedNumbers) delete Order property","Timestamp":1761072222},{"Version":"1.8","UserName":"juanmi","Resource":"Command","Name":"setCustom ID","Message":"(Update) (setCustom ID) set Order property","Timestamp":1761072304},{"Version":"1.8","UserName":"juanmi","Resource":"Command","Name":"setContinuousLocate","Message":"(Update) (setContinuousLocate) set default values and order","Timestamp":1761072399},{"Version":"1.8","UserName":"juanmi","Resource":"Command","Name":"setEmergencySettings","Message":"(Update) (setEmergencySettings) set order","Timestamp":1761072483},{"Version":"1.8","UserName":"juanmi","Resource":"Command","Name":"setEnableControl","Message":"(Update) (setEnableControl) set default values and order","Timestamp":1761072538},{"Version":"1.8","UserName":"juanmi","Resource":"Command","Name":"setFallSettings","Message":"(Update) (setFallSettings) Delete Order property","Timestamp":1761072603},{"Version":"1.8","UserName":"juanmi","Resource":"Command","Name":"setHomeBeacon","Message":"(Update) (setHomeBeacon) Delete Order property","Timestamp":1761072637},{"Version":"1.8","UserName":"juanmi","Resource":"Command","Name":"setPerformanceMode","Message":"(Update) (setPerformanceMode) set Order property","Timestamp":1761072677},{"Version":"1.8","UserName":"juanmi","Resource":"Command","Name":"setSOSOption","Message":"(Update) (setSOSOption) set Order property and default values","Timestamp":1761072761},{"Version":"1.8","UserName":"juanmi","Resource":"Command","Name":"setSystemSettings","Message":"(Update) (setSystemSettings)  set Order property and default values for sentry","Timestamp":1761072834},{"Version":"1.8","UserName":"juanmi","Resource":"Command","Name":"setVoicePromptExtra","Message":"(Create) (setVoicePromptExtra)  Create, set Order and default values","Timestamp":1761072961},{"Version":"1.8","UserName":"juanmi","Resource":"GroupParam","Name":"Convert Rio to Sentry","Message":"(Create) (Convert Rio to Sentry)  Create checkbox: Convert Rio to Sentry","Timestamp":1761073278},{"Version":"1.8","UserName":"juanmi","Resource":"GroupParam","Name":"Convert Rio to Sentry","Message":"Associate groupParam Convert Rio to Sentry to command setContinuousLocate","Timestamp":1761073282},{"Version":"1.8","UserName":"juanmi","Resource":"GroupParam","Name":"Convert Rio to Sentry","Message":"Associate groupParam Convert Rio to Sentry to command setCustom ID","Timestamp":1761073285},{"Version":"1.8","UserName":"juanmi","Resource":"GroupParam","Name":"Convert Rio to Sentry","Message":"Associate groupParam Convert Rio to Sentry to command setEmergencySettings","Timestamp":1761073287},{"Version":"1.8","UserName":"juanmi","Resource":"GroupParam","Name":"Convert Rio to Sentry","Message":"Associate groupParam Convert Rio to Sentry to command setEnableControl","Timestamp":1761073290},{"Version":"1.8","UserName":"juanmi","Resource":"GroupParam","Name":"Convert Rio to Sentry","Message":"Associate groupParam Convert Rio to Sentry to command setGateway","Timestamp":1761073292},{"Version":"1.8","UserName":"juanmi","Resource":"GroupParam","Name":"Convert Rio to Sentry","Message":"Associate groupParam Convert Rio to Sentry to command setPerformanceMode","Timestamp":1761073295},{"Version":"1.8","UserName":"juanmi","Resource":"GroupParam","Name":"Convert Rio to Sentry","Message":"Associate groupParam Convert Rio to Sentry to command setServer","Timestamp":1761073297},{"Version":"1.8","UserName":"juanmi","Resource":"GroupParam","Name":"Convert Rio to Sentry","Message":"Associate groupParam Convert Rio to Sentry to command setSOSOption","Timestamp":1761073300},{"Version":"1.8","UserName":"juanmi","Resource":"GroupParam","Name":"Convert Rio to Sentry","Message":"Associate groupParam Convert Rio to Sentry to command setSystemSettings","Timestamp":1761073302},{"Version":"1.8","UserName":"juanmi","Resource":"GroupParam","Name":"Get Current Config","Message":"(Update) (Get Current Config) Reorder Group Params","Timestamp":1761073304},{"Version":"1.8","UserName":"juanmi","Resource":"GroupParam","Name":"Convert Rio to Sentry","Message":"Associate groupParam Convert Rio to Sentry to command setVoicePromptExtra","Timestamp":1761073305},{"Version":"1.8","UserName":"juanmi","Resource":"GroupParam","Name":"Clear Buffered Messages","Message":"(Update) (Clear Buffered Messages) Reorder Group Params","Timestamp":1761073306},{"Version":"1.8","UserName":"juanmi","Resource":"GroupParam","Name":"Real Time Locate","Message":"(Update) (Real Time Locate) Reorder Group Params","Timestamp":1761073309},{"Version":"1.8","UserName":"juanmi","Resource":"Group","Name":"Controls","Message":"(Update) (Controls) change position of params","Timestamp":1761073335},{"Version":"1.8","UserName":"juanmi","Resource":"Command","Name":"setCustom ID","Message":"(Update) (setCustom ID) customID set to 64","Timestamp":1761241456},{"Version":"1.8","UserName":"juanmi","Resource":"Command","Name":"setGateway","Message":"(Update) (setGateway) change from Force to SMS to default (GPRS)","Timestamp":1761242895},{"Version":"1.8","UserName":"Michael_Admin","Resource":"GroupParam","Name":"Convert Rio to Sentry","Message":"(Update) (Convert Rio to Sentry) Add version comment into help text ","Timestamp":1761662485},{"Version":"1.8","UserName":"Michael_Admin","Resource":"GroupParam","Name":"Convert Rio to Sentry","Message":"(Update) (Convert Rio to Sentry) spelling","Timestamp":1761662553},{"Version":"1.8","UserName":"juanmi","Resource":"Command","Name":"setServer","Message":"(Update) (setServer) set order to 0 (first msg to send)","Timestamp":1761674790},{"Version":"1.8","UserName":"juanmi","Resource":"Command","Name":"setAPN","Message":"(Update) (setAPN) set order to 1 (second msg to send)","Timestamp":1761674821},{"Version":"1.8","UserName":"juanmi","Resource":"Command","Name":"setPowerAlert","Message":"(Update) (setPowerAlert) modify for conversion script (default values) and define order","Timestamp":1761678911},{"Version":"1.8","UserName":"juanmi","Resource":"GroupParam","Name":"Convert Rio to Sentry","Message":"(Update) (Convert Rio to Sentry) add setPowerAlert command to conversion to Roam","Timestamp":1761678962},{"Version":"1.8","UserName":"juanmi","Resource":"GroupParam","Name":"Convert Rio to Sentry","Message":"Associate groupParam Convert Rio to Sentry to command setPowerAlert","Timestamp":1761678966},{"Version":"1.8","UserName":"juanmi","Resource":"Command","Name":"setTriggerOTA","Message":"(Create) (setTriggerOTA) create command setTriggerOTA","Timestamp":1761683174},{"Version":"1.8","UserName":"juanmi","Resource":"Command","Name":"actionTriggerOTA","Message":"(Update) (actionTriggerOTA) change name to actionTriggerOTA","Timestamp":1761683529},{"Version":"1.8","UserName":"juanmi","Resource":"GroupParam","Name":"Firmware Upgrade","Message":"(Update) (Firmware Upgrade) assign command actionTriggerOTA to the Button","Timestamp":1761683580},{"Version":"1.8","UserName":"juanmi","Resource":"GroupParam","Name":"Firmware Upgrade","Message":"Associate groupParam Firmware Upgrade to command actionTriggerOTA","Timestamp":1761683584},{"Version":"1.8","UserName":"juanmi","Resource":"GroupParam","Name":"Convert Rio to Sentry","Message":"(Update) (Convert Rio to Sentry) Reorder Group Params","Timestamp":1761816193},{"Version":"1.8","UserName":"juanmi","Resource":"GroupParam","Name":"Firmware Upgrade","Message":"(Update) (Firmware Upgrade) Reorder Group Params","Timestamp":1761816197},{"Version":"1.8","UserName":"juanmi","Resource":"GroupParam","Name":"Power Off","Message":"(Update) (Power Off) Reorder Group Params","Timestamp":1761816199},{"Version":"1.8","UserName":"juanmi","Resource":"GroupParam","Name":"Reboot","Message":"(Update) (Reboot) Reorder Group Params","Timestamp":1761816202},{"Version":"1.8","UserName":"juanmi","Resource":"GroupParam","Name":"Factory Defaults","Message":"(Update) (Factory Defaults) change name and help text","Timestamp":1761816247},{"Version":"1.8","UserName":"juanmi","Resource":"Group","Name":"Controls","Message":"(Update) (Controls) reorder params","Timestamp":1761816262},{"Version":"1.8","UserName":"juanmi","Resource":"Protocol","Name":null,"Message":"Added actionTriggerOTA and Conversion Rio to SEntry (Factory defaults)","Timestamp":1761816405},{"Version":"1.9","UserName":"David_Admin","Resource":"GroupParam","Name":"Factory Defaults","Message":"(Update) (Factory Defaults) Hiding to push quicker to acc/prod for customer issue.","Timestamp":1770223026},{"Version":"1.9","UserName":"Michael_Admin","Resource":"Protocol","Name":null,"Message":"to hide factory default on ui ","Timestamp":1770223552},{"Version":"2.0","UserName":"juanmi","Resource":"GroupParam","Name":"Factory Defaults","Message":"(Delete) (Factory Defaults)","Timestamp":1771525906},{"Version":"2.0","UserName":"juanmi","Resource":"Command","Name":"setSystemSettings","Message":"(Update) (setSystemSettings) ticket 2089628: FIX setsettings not working ","Timestamp":1771526365},{"Version":"2.0","UserName":"juanmi","Resource":"Protocol","Name":null,"Message":"ticket 2089628: setsettings not working on Sentry P1 and Roam P2","Timestamp":1771529132},{"Version":"2.1","UserName":"juanmi","Resource":"Command","Name":"setEnableControl","Message":"(Update) (setEnableControl) Recovery SilentMode first test","Timestamp":1773338127},{"Version":"2.1","UserName":"juanmi","Resource":"Command","Name":"setEnableControl","Message":"(Update) (setEnableControl) change param name","Timestamp":1773405370},{"Version":"2.1","UserName":"juanmi","Resource":"Command","Name":"setEnableControl","Message":"(Update) (setEnableControl) small fix","Timestamp":1773405890},{"Version":"2.1","UserName":"juanmi","Resource":"Command","Name":"setEnableControl","Message":"(Update) (setEnableControl) set values using base settings.","Timestamp":1773601436},{"Version":"2.1","UserName":"juanmi","Resource":"Command","Name":"setSystemSettings","Message":"(Update) (setSystemSettings) activate silent call mode","Timestamp":1773602655},{"Version":"2.1","UserName":"Michael_Admin","Resource":"Protocol","Name":null,"Message":"Testing on acceptance ","Timestamp":1773650453},{"Version":"2.2","UserName":"juanmi","Resource":"Command","Name":"setSystemSettings","Message":"(Update) (setSystemSettings) Refatorization of the command to introduce silent mode","Timestamp":1773687421},{"Version":"2.2","UserName":"juanmi","Resource":"Protocol","Name":null,"Message":"refactorized setSystemSetting for silent mode","Timestamp":1773687704},{"Version":"2.3","UserName":"juanmi","Resource":"Operation","Name":"Access PS Sentry","Message":"(Update) (Access PS Sentry) Ticket 2014202: Make internal sender function more resilient","Timestamp":1774209589},{"Version":"2.3","UserName":"juanmi","Resource":"Protocol","Name":null,"Message":"Ticket 2014202: Make internal sender function more resilient","Timestamp":1774384644},{"Version":"2.4","UserName":"juanmi","Resource":"MessageType","Name":"F-ACK-Out Of Service","Message":"(Update) (F-ACK-Out Of Service) add F- in the local code","Timestamp":1774552097},{"Version":"2.4","UserName":"juanmi","Resource":"MessageType","Name":"F-ACK-Battery Power Low","Message":"(Create) (F-ACK-Battery Power Low) add F-ACK-Battery Power Low","Timestamp":1774555058},{"Version":"2.4","UserName":"juanmi","Resource":"MessageType","Name":"F-ACK-Device not registered","Message":"(Create) (F-ACK-Device not registered) F-ACK-Device not registered","Timestamp":1774555251},{"Version":"2.4","UserName":"juanmi","Resource":"Operation","Name":"Access PS Sentry","Message":"(Update) (Access PS Sentry) ticket 2014202: Avoid sending console.log that close long connection","Timestamp":1775039196},{"Version":"2.4","UserName":"juanmi","Resource":"Protocol","Name":null,"Message":"tickets 2014202:internal sender and 2080422: OTA show battery low alarm","Timestamp":1775039414},{"Version":"2.5","UserName":"juanmi","Resource":"MessageType","Name":"F-ACK-Battery Power Low","Message":"(Update) (F-ACK-Battery Power Low) define as a warning","Timestamp":1775040491},{"Version":"2.5","UserName":"juanmi","Resource":"MessageType","Name":"F-ACK-Battery Power Low","Message":"(Update) (F-ACK-Battery Power Low) define as an alarm","Timestamp":1775040664},{"Version":"2.5","UserName":"juanmi","Resource":"MessageType","Name":"F-ACK-Battery Power Low","Message":"(Update) (F-ACK-Battery Power Low) change msg code to BATL","Timestamp":1775041321},{"Version":"2.5","UserName":"juanmi","Resource":"MessageType","Name":"F-ACK-Battery Power Low","Message":"(Update) (F-ACK-Battery Power Low) uncheck fail ack box","Timestamp":1775041496},{"Version":"2.5","UserName":"juanmi","Resource":"Operation","Name":"Access PS Sentry","Message":"(Update) (Access PS Sentry) tickets 2076011, 2076012, 2076010 and add debug function in several lines","Timestamp":1775726105},{"Version":"2.5","UserName":"juanmi","Resource":"GroupParam","Name":"SystemLanguage","Message":"(Update) (SystemLanguage) Define labels and reorder languages options","Timestamp":1776189115},{"Version":"2.5","UserName":"juanmi","Resource":"Operation","Name":"Access PS Sentry","Message":"(Update) (Access PS Sentry) ticket 2209515: read language with labels","Timestamp":1776190645},{"Version":"2.5","UserName":"juanmi","Resource":"Protocol","Name":null,"Message":"ticket 2209515: languages tickets 2076011, 2076012, 2076010: Accesory protocol","Timestamp":1776362938},{"Version":"2.6","UserName":"juanmi","Resource":"Operation","Name":"Access PS Sentry","Message":"(Update) (Access PS Sentry) Ticket 2076011: check when battery > 100","Timestamp":1777307077},{"Version":"2.6","UserName":"juanmi","Resource":"MessageType","Name":"F-ACK-Battery Power Low","Message":"(Create) (F-ACK-Battery Power Low) ticket 2080422: change msg code to raise event Battery LOW to do OTA","Timestamp":1778535835},{"Version":"2.6","UserName":"juanmi","Resource":"MessageType","Name":"F-ACK-Not Registered","Message":"(Create) (F-ACK-Not Registered) define F-ACK-Not Registered","Timestamp":1778535942},{"Version":"2.6","UserName":"juanmi","Resource":"Protocol","Name":null,"Message":"ticket 2080422: change msg code to raise event Battery LOW to do OTA","Timestamp":1778924413},{"Version":"2.7","UserName":"juanmi","Resource":"MessageType","Name":"F-ACK-Battery Power Low","Message":"(Update) (F-ACK-Battery Power Low) Define as ACK of actionTriggerOTA","Timestamp":1780340148},{"Version":"2.7","UserName":"juanmi","Resource":"MessageType","Name":"F-ACK-Battery Power Low","Message":"(Delete) (F-ACK-Battery Power Low)","Timestamp":1780340247},{"Version":"2.7","UserName":"juanmi","Resource":"MessageType","Name":"OBTL","Message":"(Create) (OBTL) Define event for OTA interrupted by low battery","Timestamp":1780340408},{"Version":"2.7","UserName":"juanmi","Resource":"Operation","Name":"Access PS Sentry","Message":"(Update) (Access PS Sentry) add parser for battery low in OTA process to rise Event","Timestamp":1780505441},{"Version":"2.7","UserName":"juanmi","Resource":"Operation","Name":"Access PS Sentry","Message":"(Update) (Access PS Sentry) Add ack confirming to OTA update control after battery error","Timestamp":1780505715},{"Version":"2.7","UserName":"juanmi","Resource":"MessageType","Name":"OBTL","Message":"(Update) (OBTL) change event type as alarm","Timestamp":1780560670},{"Version":"2.7","UserName":"juanmi","Resource":"MessageType","Name":"OBTL","Message":"(Update) (OBTL) set event type as Warning","Timestamp":1780561819},{"Version":"2.7","UserName":"Michael_Admin","Resource":"Protocol","Name":null,"Message":"User Story 2361805: EVIEW OTA Low Battery TEST","Timestamp":1780909750},{"Version":"2.8","UserName":"juanmi","Resource":"MessageType","Name":"ACK-APN","Message":"(Update) (ACK-APN) Only Do not send commads","Timestamp":1781714493}],"ProtocolActionObjects":[],"Tags":[{"Id":2153,"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}]}