diff --git a/access-tec-care-watch b/access-tec-care-watch index dfecef3..ab8e99a 100644 --- a/access-tec-care-watch +++ b/access-tec-care-watch @@ -1 +1 @@ -{"Id":297,"Name":null,"Description":null,"FirmwareVersion":"V06.8601.2501","InProgress":false,"MessageTypes":[{"Id":7943,"Code":"Alert Finalized","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Watch-SOSEnding;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;GENERAL=<>;<>","HasTemplateGlobal":false,"ResponseTemplate":"<>","TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^Watch-SOSEnding;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;GENERAL=[^;;]*;[^;]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7970,"Code":"PWRF","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Watch-PWRF;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;GENERAL=<>;<>","HasTemplateGlobal":false,"ResponseTemplate":"<>","TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^Watch-PWRF;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;GENERAL=[^;;]*;[^;]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7982,"Code":"PWRN","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Watch-PWRN;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;GENERAL=<>;<>","HasTemplateGlobal":false,"ResponseTemplate":"<>","TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^Watch-PWRN;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;GENERAL=[^;;]*;[^;]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":8011,"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":5720,"Protocol":{"Id":297,"Code":"Access TEC Care Watch","Version":"0.1","FirmwareVersion":"","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":false},"Name":"actionDeviceReboot","TemplateSMS":"<>","Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\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":[]},{"Id":8010,"Code":"ACK-FALLSENS-SMS","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":true,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Mode:<>","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":true,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":false,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":{"Id":5764,"Protocol":{"Id":297,"Code":"Access TEC Care Watch","Version":"0.1","FirmwareVersion":"","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":false},"Name":"getCurrentSettings2","TemplateSMS":"<>","Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n 0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\nvar msg = [];\r\nvar configs = [];\r\nvar configsSMS = [];\r\n// Contacts, APN, server details, fall sensitivity and Beacon List\r\nvar dataSMS = 'status'; // Check fall sens (function settings)\r\n/* Mode:4,0 second\r\nLED: on\r\nBeep: on\r\nVibration: on\r\nTime zone: +10:00\r\nGEO Fence:0,0,0,0\r\nMotion alarm: off\r\nNo Motion alarm: off\r\nTilt alert: off\r\nFall alarm: on, level:5\r\nLow power alarm: on,15%\r\nSOS Call:10 minutes, loop:1 */\r\nvar data = ''; // empty\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar notSend = false;\r\nif (isForcedBySMS == 'False' && ((serverParams.CommandType == 'ByGPRS') || (serverParams.CommandType == 'Default' && ((serverParams.ParentCommandType == 'ByGPRS') || (serverParams.ParentCommandType == 'Default' && serverParams.ConfigType == 'GPRS') || (serverParams.ParentCommandType === null && serverParams.ConfigType == 'GPRS'))))) {\r\n notSend = true;\r\n}\r\n// For GPRS command\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\n// For SMS command\r\nAddValueSMS('dataSMS', dataSMS);\r\nvar commandConfigs = {\r\n template: \"main\",\r\n configs: configs,\r\n configsSMS: configsSMS,\r\n notSend: notSend\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n// functions\r\nfunction AddValue(p1, p2) {\r\n var cvpair = {\r\n code: p1,\r\n value: p2\r\n };\r\n configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n var cvpair = {\r\n code: p1,\r\n value: p2\r\n };\r\n configsSMS.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n var arr1 = [];\r\n for (var n = 0, l = str.length; n < l; n++) {\r\n var hex = Number(str.charCodeAt(n)).toString(16);\r\n arr1.push(hex);\r\n }\r\n return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n var crc = 0x0000;\r\n var j, i;\r\n for (i = 0; i < s.length; i++) {\r\n c = s[i];\r\n if (c > 255) {\r\n throw new RangeError();\r\n }\r\n j = (c ^ (crc >> 8)) & 0xFF;\r\n crc = crcTable[j] ^ (crc << 8);\r\n }\r\n return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n var splitStr = []\r\n var j = 0\r\n for (let i = 0; i < str.length; i += 2) {\r\n splitStr[j] = str.substring(i, i + 2)\r\n j++\r\n }\r\n var bytes = []\r\n var bytePos = 0\r\n for (let i = 0; i < splitStr.length; i++) {\r\n var byteStr = splitStr[i]\r\n var b = parseInt(byteStr, 16)\r\n if (b < 256) {\r\n bytes[bytePos] = b\r\n bytePos++\r\n }\r\n }\r\n return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n hexString = str.toString(16);\r\n return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n let bin = 0;\r\n let rem, i = 1,\r\n step = 1;\r\n while (x != 0) {\r\n rem = x % 2;\r\n x = parseInt(x / 2);\r\n bin = bin + rem * i;\r\n i = i * 10;\r\n }\r\n return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n var hexa = parseInt(x, 2).toString(16);\r\n return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n const result = [];\r\n let len = string.length - 2;\r\n while (len >= 0) {\r\n result.push(string.substr(len, 2));\r\n len -= 2;\r\n }\r\n return result.join('');\r\n}","AvoidResending":false,"FollowParentSentType":true,"SendingType":0,"CommandToUpdateId":null,"ParentId":4958,"Parent":null,"HasAck":true,"HexString":true,"SendAttempts":4,"Order":18},"CacheImei":false,"RegEx":"^Mode:[^:]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":8009,"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: }}<>","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":{"Id":5775,"Protocol":{"Id":297,"Code":"Access TEC Care Watch","Version":"0.1","FirmwareVersion":"","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":false},"Name":"actionRequestLocation","TemplateSMS":null,"Template":"<>","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":8008,"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":5774,"Protocol":{"Id":297,"Code":"Access TEC Care Watch","Version":"0.1","FirmwareVersion":"","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":false},"Name":"setSMSPrefix","TemplateSMS":null,"Template":"<>","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":8007,"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":5773,"Protocol":{"Id":297,"Code":"Access TEC Care Watch","Version":"0.1","FirmwareVersion":"","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":false},"Name":"actionFactoryReset","TemplateSMS":"<>","Template":"<>","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 = 'ineedtoresetEV06A!'; // ticket 604747\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":3,"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":[],"Tags":[]},{"Id":8006,"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":5772,"Protocol":{"Id":297,"Code":"Access TEC Care Watch","Version":"0.1","FirmwareVersion":"","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":false},"Name":"actionDeleteRecords","TemplateSMS":"<>","Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\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":[],"Tags":[]},{"Id":8005,"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":5771,"Protocol":{"Id":297,"Code":"Access TEC Care Watch","Version":"0.1","FirmwareVersion":"","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":false},"Name":"actionPowerOff","TemplateSMS":"<>","Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\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":[],"Tags":[]},{"Id":8004,"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":5770,"Protocol":{"Id":297,"Code":"Access TEC Care Watch","Version":"0.1","FirmwareVersion":"","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":false},"Name":"actionTrace","TemplateSMS":"<>","Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\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":8003,"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":5779,"Protocol":{"Id":297,"Code":"Access TEC Care Watch","Version":"0.1","FirmwareVersion":"","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":false},"Name":"actionRealTimeLocation","TemplateSMS":"<>","Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\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":[],"Tags":[]},{"Id":8002,"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":5777,"Protocol":{"Id":297,"Code":"Access TEC Care Watch","Version":"0.1","FirmwareVersion":"","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":false},"Name":"setAPN","TemplateSMS":"<>","Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\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\":8002,\"Code\":\"ACK-APN\",\"Name\":null,\"MessageCode\":\"ACK\",\"NeedAck\":false,\"IsAck\":true,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":0,\"Template\":\"{{Set APN ok.|Configuracin APN OK.}\",\"HasTemplateGlobal\":false,\"ResponseTemplate\":\"ok1\",\"TemplateGlobal\":null,\"LongConnection\":true,\"HexString\":false,\"AckFirst\":false,\"ScaipH\":false,\"DoNotSendCommands\":false,\"ProtocolsLibraryMethod\":null,\"ProtocolsLibraryMethodArgs\":null,\"Command\":{\"Id\":5777,\"Protocol\":{\"Id\":297,\"Code\":\"Access TEC Care Watch\",\"Version\":\"0.2\",\"FirmwareVersion\":\"\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"setAPN\",\"TemplateSMS\":\"<>\",\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\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\":[],\"Tags\":[]}","Timestamp":1748619991}],"Tags":[]},{"Id":8001,"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":5769,"Protocol":{"Id":297,"Code":"Access TEC Care Watch","Version":"0.1","FirmwareVersion":"","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":false},"Name":"setFallSettings","TemplateSMS":"<>","Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n 0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\nvar msg = [];\r\nvar configs = [];\r\nvar configsSMS = [];\r\n// configuration command (0X02) Fall sensitivity\r\nvar messageBody = '02';\r\nvar sensitivity = '';\r\nvar dataSMS = '';\r\nvar value = ''\r\nif (params.FallSettings.EnableDisableFallSettings == 'true') {\r\n value += '1'\r\n value += '100' //Dial\r\n //}\r\n if (params.FallSettings.Sensitivity) {\r\n var sensiString = params.FallSettings.Sensitivity.split(',');\r\n var level = sensiString[1];\r\n sensitivity = parseInt(sensiString[0]);\r\n // For SMS\r\n dataSMS = `FL1,${sensitivity},1`;\r\n //numberHex = ascii_to_hexa(sensitivity).toUpperCase();\r\n sensitivity = ('0000' + decimalToBinary(sensitivity)).slice(-4).toUpperCase()\r\n value += sensitivity\r\n }\r\n} else {\r\n value = '01100001'\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":[],"Tags":[]},{"Id":8000,"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":5767,"Protocol":{"Id":297,"Code":"Access TEC Care Watch","Version":"0.1","FirmwareVersion":"","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":false},"Name":"setGateway","TemplateSMS":"<>","Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\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 = '34';\r\nvar gateway_number = '00000000000';\r\nvar numberHex = '';\r\nvar numberLength = '00';\r\nvar nameLength = '00';\r\nvar nameHex = '';\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 nameHex = ascii_to_hexa(gateway).toUpperCase();\r\n nameLength = ('00' + decimalToHex(gateway.length)).slice(-2).toUpperCase();\r\n sosKeyLength = ('00' + decimalToHex(5 + (numberHex.length / 2) + (nameHex.length / 2))).slice(-2).toUpperCase();\r\n messageBody += sosKeyLength + key + confSOS + numberLength + numberHex + nameLength + nameHex + '00';\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":[],"Tags":[]},{"Id":7999,"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":5766,"Protocol":{"Id":297,"Code":"Access TEC Care Watch","Version":"0.1","FirmwareVersion":"","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":false},"Name":"setServer","TemplateSMS":"<>","Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\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":[],"Tags":[]},{"Id":7998,"Code":"ACK-FIRM-SMS","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":true,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"IMEI:<>","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":true,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":false,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":{"Id":5765,"Protocol":{"Id":297,"Code":"Access TEC Care Watch","Version":"0.1","FirmwareVersion":"","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":false},"Name":"getCurrentSettings","TemplateSMS":"<>","Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\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 = '1A73344041424356101F44534733'; //1A73\r\n// Firmware Long, Contacts, APNusername, APNpass, server details, fall sensitivity and Beacon List, Fall down alert, Ring tome vol,System language, time interval, No motion alert,custom id, allow list\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar command = '02';\r\n//var keyLength = '10'; // previous\r\nvar keyLength = '0F'; //+1 qnt of commands\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' + '1100' + 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":7997,"Code":"ACK-GDATA","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":true,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Watch;ACK-GDATA;<>;","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":true,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":false,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":{"Id":5765,"Protocol":{"Id":297,"Code":"Access TEC Care Watch","Version":"0.1","FirmwareVersion":"","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":false},"Name":"getCurrentSettings","TemplateSMS":"<>","Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\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 = '1A73344041424356101F44534733'; //1A73\r\n// Firmware Long, Contacts, APNusername, APNpass, server details, fall sensitivity and Beacon List, Fall down alert, Ring tome vol,System language, time interval, No motion alert,custom id, allow list\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar command = '02';\r\n//var keyLength = '10'; // previous\r\nvar keyLength = '0F'; //+1 qnt of commands\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' + '1100' + 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":"^Watch;ACK-GDATA;[^;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7996,"Code":"ACK-BEAC-SMS","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":true,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"1,<>","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":true,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":false,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":{"Id":5763,"Protocol":{"Id":297,"Code":"Access TEC Care Watch","Version":"0.1","FirmwareVersion":"","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":false},"Name":"getCurrentSettings3","TemplateSMS":"<>","Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n 0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\nvar msg = [];\r\nvar configs = [];\r\nvar configsSMS = [];\r\n// Contacts, APN, server details, fall sensitivity and Beacon List\r\nvar dataSMS = 'BCQ1'; // Check Beacon List\r\n/* 1,F7:37:B7:10:81:CE,office1\r\n2,C4:9F:A6:15:24:3F,office2\r\n3,D3:E3:AC:86:5E:46,office7 */\r\nvar data = ''; // empty\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar notSend = false;\r\nif (isForcedBySMS == 'False' && ((serverParams.CommandType == 'ByGPRS') || (serverParams.CommandType == 'Default' && ((serverParams.ParentCommandType == 'ByGPRS') || (serverParams.ParentCommandType == 'Default' && serverParams.ConfigType == 'GPRS') || (serverParams.ParentCommandType === null && serverParams.ConfigType == 'GPRS'))))) {\r\n notSend = true;\r\n}\r\n// For GPRS command\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\n// For SMS command\r\nAddValueSMS('dataSMS', dataSMS);\r\nvar commandConfigs = {\r\n template: \"main\",\r\n configs: configs,\r\n configsSMS: configsSMS,\r\n notSend: notSend\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n// functions\r\nfunction AddValue(p1, p2) {\r\n var cvpair = {\r\n code: p1,\r\n value: p2\r\n };\r\n configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n var cvpair = {\r\n code: p1,\r\n value: p2\r\n };\r\n configsSMS.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n var arr1 = [];\r\n for (var n = 0, l = str.length; n < l; n++) {\r\n var hex = Number(str.charCodeAt(n)).toString(16);\r\n arr1.push(hex);\r\n }\r\n return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n var crc = 0x0000;\r\n var j, i;\r\n for (i = 0; i < s.length; i++) {\r\n c = s[i];\r\n if (c > 255) {\r\n throw new RangeError();\r\n }\r\n j = (c ^ (crc >> 8)) & 0xFF;\r\n crc = crcTable[j] ^ (crc << 8);\r\n }\r\n return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n var splitStr = []\r\n var j = 0\r\n for (let i = 0; i < str.length; i += 2) {\r\n splitStr[j] = str.substring(i, i + 2)\r\n j++\r\n }\r\n var bytes = []\r\n var bytePos = 0\r\n for (let i = 0; i < splitStr.length; i++) {\r\n var byteStr = splitStr[i]\r\n var b = parseInt(byteStr, 16)\r\n if (b < 256) {\r\n bytes[bytePos] = b\r\n bytePos++\r\n }\r\n }\r\n return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n hexString = str.toString(16);\r\n return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n let bin = 0;\r\n let rem, i = 1,\r\n step = 1;\r\n while (x != 0) {\r\n rem = x % 2;\r\n x = parseInt(x / 2);\r\n bin = bin + rem * i;\r\n i = i * 10;\r\n }\r\n return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n var hexa = parseInt(x, 2).toString(16);\r\n return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n const result = [];\r\n let len = string.length - 2;\r\n while (len >= 0) {\r\n result.push(string.substr(len, 2));\r\n len -= 2;\r\n }\r\n return result.join('');\r\n}","AvoidResending":false,"FollowParentSentType":true,"SendingType":0,"CommandToUpdateId":null,"ParentId":4958,"Parent":null,"HasAck":true,"HexString":true,"SendAttempts":4,"Order":19},"CacheImei":false,"RegEx":"^1,[^,]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7995,"Code":"ACK-CONTAC-SMS","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":true,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"A1:<>","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":true,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":false,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":{"Id":5762,"Protocol":{"Id":297,"Code":"Access TEC Care Watch","Version":"0.1","FirmwareVersion":"","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":false},"Name":"getCurrentSettings4","TemplateSMS":"<>","Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n 0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\nvar msg = [];\r\nvar configs = [];\r\nvar configsSMS = [];\r\n// Contacts, APN, server details, fall sensitivity and Beacon List\r\nvar dataSMS = 'A?'; // Check Contact List\r\n/* A1: 1,1,15899795842\r\nA2: 1,0,13632770106\r\nA3: 0,1,15986236978 */\r\nvar data = ''; // empty\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar notSend = false;\r\nif (isForcedBySMS == 'False' && ((serverParams.CommandType == 'ByGPRS') || (serverParams.CommandType == 'Default' && ((serverParams.ParentCommandType == 'ByGPRS') || (serverParams.ParentCommandType == 'Default' && serverParams.ConfigType == 'GPRS') || (serverParams.ParentCommandType === null && serverParams.ConfigType == 'GPRS'))))) {\r\n notSend = true;\r\n}\r\n// For GPRS command\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\n// For SMS command\r\nAddValueSMS('dataSMS', dataSMS);\r\nvar commandConfigs = {\r\n template: \"main\",\r\n configs: configs,\r\n configsSMS: configsSMS,\r\n notSend: notSend\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n// functions\r\nfunction AddValue(p1, p2) {\r\n var cvpair = {\r\n code: p1,\r\n value: p2\r\n };\r\n configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n var cvpair = {\r\n code: p1,\r\n value: p2\r\n };\r\n configsSMS.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n var arr1 = [];\r\n for (var n = 0, l = str.length; n < l; n++) {\r\n var hex = Number(str.charCodeAt(n)).toString(16);\r\n arr1.push(hex);\r\n }\r\n return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n var crc = 0x0000;\r\n var j, i;\r\n for (i = 0; i < s.length; i++) {\r\n c = s[i];\r\n if (c > 255) {\r\n throw new RangeError();\r\n }\r\n j = (c ^ (crc >> 8)) & 0xFF;\r\n crc = crcTable[j] ^ (crc << 8);\r\n }\r\n return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n var splitStr = []\r\n var j = 0\r\n for (let i = 0; i < str.length; i += 2) {\r\n splitStr[j] = str.substring(i, i + 2)\r\n j++\r\n }\r\n var bytes = []\r\n var bytePos = 0\r\n for (let i = 0; i < splitStr.length; i++) {\r\n var byteStr = splitStr[i]\r\n var b = parseInt(byteStr, 16)\r\n if (b < 256) {\r\n bytes[bytePos] = b\r\n bytePos++\r\n }\r\n }\r\n return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n hexString = str.toString(16);\r\n return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n let bin = 0;\r\n let rem, i = 1,\r\n step = 1;\r\n while (x != 0) {\r\n rem = x % 2;\r\n x = parseInt(x / 2);\r\n bin = bin + rem * i;\r\n i = i * 10;\r\n }\r\n return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n var hexa = parseInt(x, 2).toString(16);\r\n return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n const result = [];\r\n let len = string.length - 2;\r\n while (len >= 0) {\r\n result.push(string.substr(len, 2));\r\n len -= 2;\r\n }\r\n return result.join('');\r\n}","AvoidResending":false,"FollowParentSentType":true,"SendingType":0,"CommandToUpdateId":null,"ParentId":4958,"Parent":null,"HasAck":true,"HexString":true,"SendAttempts":4,"Order":20},"CacheImei":false,"RegEx":"^A1:[^:]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7994,"Code":"ACK-SERV-SMS","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":true,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"GRPS:<>","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":true,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":false,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":{"Id":5761,"Protocol":{"Id":297,"Code":"Access TEC Care Watch","Version":"0.1","FirmwareVersion":"","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":false},"Name":"getCurrentSettings5","TemplateSMS":"<>","Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n 0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\nvar msg = [];\r\nvar configs = [];\r\nvar configsSMS = [];\r\n// Contacts, APN, server details, fall sensitivity and Beacon List\r\nvar dataSMS = 'GPRS?'; // Check Server Details\r\n/*GRPS: ON\r\nAPN: internet\r\nUsername:\r\nPassword:\r\nIP: 1, www.smart-locator.com\r\nPort: 6060\r\nMove report time: 30 minutes\r\nNo move report time: 60 minutes\r\nHB: on, 20 minutes */\r\nvar data = ''; // empty\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar notSend = false;\r\nif (isForcedBySMS == 'False' && ((serverParams.CommandType == 'ByGPRS') || (serverParams.CommandType == 'Default' && ((serverParams.ParentCommandType == 'ByGPRS') || (serverParams.ParentCommandType == 'Default' && serverParams.ConfigType == 'GPRS') || (serverParams.ParentCommandType === null && serverParams.ConfigType == 'GPRS'))))) {\r\n notSend = true;\r\n}\r\n// For GPRS command\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\n// For SMS command\r\nAddValueSMS('dataSMS', dataSMS);\r\nvar commandConfigs = {\r\n template: \"main\",\r\n configs: configs,\r\n configsSMS: configsSMS,\r\n notSend: notSend\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n// functions\r\nfunction AddValue(p1, p2) {\r\n var cvpair = {\r\n code: p1,\r\n value: p2\r\n };\r\n configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n var cvpair = {\r\n code: p1,\r\n value: p2\r\n };\r\n configsSMS.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n var arr1 = [];\r\n for (var n = 0, l = str.length; n < l; n++) {\r\n var hex = Number(str.charCodeAt(n)).toString(16);\r\n arr1.push(hex);\r\n }\r\n return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n var crc = 0x0000;\r\n var j, i;\r\n for (i = 0; i < s.length; i++) {\r\n c = s[i];\r\n if (c > 255) {\r\n throw new RangeError();\r\n }\r\n j = (c ^ (crc >> 8)) & 0xFF;\r\n crc = crcTable[j] ^ (crc << 8);\r\n }\r\n return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n var splitStr = []\r\n var j = 0\r\n for (let i = 0; i < str.length; i += 2) {\r\n splitStr[j] = str.substring(i, i + 2)\r\n j++\r\n }\r\n var bytes = []\r\n var bytePos = 0\r\n for (let i = 0; i < splitStr.length; i++) {\r\n var byteStr = splitStr[i]\r\n var b = parseInt(byteStr, 16)\r\n if (b < 256) {\r\n bytes[bytePos] = b\r\n bytePos++\r\n }\r\n }\r\n return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n hexString = str.toString(16);\r\n return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n let bin = 0;\r\n let rem, i = 1,\r\n step = 1;\r\n while (x != 0) {\r\n rem = x % 2;\r\n x = parseInt(x / 2);\r\n bin = bin + rem * i;\r\n i = i * 10;\r\n }\r\n return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n var hexa = parseInt(x, 2).toString(16);\r\n return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n const result = [];\r\n let len = string.length - 2;\r\n while (len >= 0) {\r\n result.push(string.substr(len, 2));\r\n len -= 2;\r\n }\r\n return result.join('');\r\n}","AvoidResending":false,"FollowParentSentType":true,"SendingType":0,"CommandToUpdateId":null,"ParentId":4958,"Parent":null,"HasAck":true,"HexString":true,"SendAttempts":4,"Order":21},"CacheImei":false,"RegEx":"^GRPS:[^:]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7993,"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":5768,"Protocol":{"Id":297,"Code":"Access TEC Care Watch","Version":"0.1","FirmwareVersion":"","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":false},"Name":"setEmergencySettings","TemplateSMS":"<>","Template":"<>","AckTemplate":null,"Operation":"//updated for EV06\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 msg = [];\r\nvar configs = [];\r\nvar configsSMS = [];\r\nvar messageBody = '02';\r\nvar key = '34';\r\nvar phone_number = '00000000000';\r\nvar numberHex = '';\r\nvar numberLength = '00';\r\nvar nameLength = '00';\r\nvar nameHex = '';\r\nvar sosKeyLength = '00';\r\n//var confFall = '1100'; // Enable, Dial\r\nvar confSOS = '10100000'; // Enable, no SMS, Toggle Call, No Sim Dialing, Contact Number 1\r\nvar dataSMS = '';\r\nif (params.AlertSettings.EmergencyNumber) {\r\n confSOS = ('00' + binaryToHex(confSOS)).slice(-2).toUpperCase();\r\n phone_number = params.AlertSettings.EmergencyNumber;\r\n numberHex = ascii_to_hexa(phone_number).toUpperCase();\r\n numberLength = ('00' + decimalToHex(phone_number.length)).slice(-2).toUpperCase();\r\n nameHex = ascii_to_hexa('Support').toUpperCase(); // Support 53 75 70 70 6F 72 74\r\n nameLength = '07'; // lenght of 'Support'\r\n sosKeyLength = ('00' + decimalToHex(5 + (numberHex.length / 2) + (nameHex.length / 2))).slice(-2).toUpperCase();\r\n messageBody += sosKeyLength + key + confSOS + numberLength + numberHex + nameLength + nameHex + '00';\r\n dataSMS = `A1,0,1,${phone_number}`;\r\n}\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar totalLength = ('0000' + decimalToHex(messageBody.length / 2)).slice(-4).toUpperCase();\r\ntotalLength = changeEndianness(totalLength);\r\n//totalLength = '1000'; //better to calculate it\r\nvar checksum = byteStringToByteArray(messageBody);\r\nchecksum = crc16byte(checksum);\r\nchecksum = decimalToHex(checksum);\r\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\r\nchecksum = changeEndianness(checksum);\r\nvar prefix = 'AB10' + totalLength + checksum + sequenceID;\r\nvar data = prefix + messageBody;\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\n// For SMS command\r\nAddValueSMS('dataSMS', dataSMS);\r\nvar commandConfigs = {\r\n template: \"main\",\r\n configs: configs,\r\n configsSMS: configsSMS\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n// functions\r\nfunction AddValue(p1, p2) {\r\n var cvpair = {\r\n code: p1,\r\n value: p2\r\n };\r\n configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n var cvpair = {\r\n code: p1,\r\n value: p2\r\n };\r\n configsSMS.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n var arr1 = [];\r\n for (var n = 0, l = str.length; n < l; n++) {\r\n var hex = Number(str.charCodeAt(n)).toString(16);\r\n arr1.push(hex);\r\n }\r\n return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n var crc = 0x0000;\r\n var j, i;\r\n for (i = 0; i < s.length; i++) {\r\n c = s[i];\r\n if (c > 255) {\r\n throw new RangeError();\r\n }\r\n j = (c ^ (crc >> 8)) & 0xFF;\r\n crc = crcTable[j] ^ (crc << 8);\r\n }\r\n return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n var splitStr = []\r\n var j = 0\r\n for (let i = 0; i < str.length; i += 2) {\r\n splitStr[j] = str.substring(i, i + 2)\r\n j++\r\n }\r\n var bytes = []\r\n var bytePos = 0\r\n for (let i = 0; i < splitStr.length; i++) {\r\n var byteStr = splitStr[i]\r\n var b = parseInt(byteStr, 16)\r\n if (b < 256) {\r\n bytes[bytePos] = b\r\n bytePos++\r\n }\r\n }\r\n return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n hexString = str.toString(16);\r\n return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n let bin = 0;\r\n let rem, i = 1,\r\n step = 1;\r\n while (x != 0) {\r\n rem = x % 2;\r\n x = parseInt(x / 2);\r\n bin = bin + rem * i;\r\n i = i * 10;\r\n }\r\n return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n var hexa = parseInt(x, 2).toString(16);\r\n return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n const result = [];\r\n let len = string.length - 2;\r\n while (len >= 0) {\r\n result.push(string.substr(len, 2));\r\n len -= 2;\r\n }\r\n return result.join('');\r\n}","AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"CommandToUpdateId":null,"ParentId":null,"Parent":null,"HasAck":true,"HexString":true,"SendAttempts":4,"Order":3},"CacheImei":false,"RegEx":"^(Set contact number 1 ok.|Configuracin numero contacto 1 ok.)","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7992,"Code":"ACK-GAPN","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":true,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Watch;ACK-GAPN;<>;","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":true,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":false,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":{"Id":5778,"Protocol":{"Id":297,"Code":"Access TEC Care Watch","Version":"0.1","FirmwareVersion":"","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":false},"Name":"getAPN","TemplateSMS":null,"Template":"<>","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":"^Watch;ACK-GAPN;[^;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7991,"Code":"ACK-GSRV","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":true,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Watch;ACK-GSRV;<>;","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":true,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":false,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":{"Id":5782,"Protocol":{"Id":297,"Code":"Access TEC Care Watch","Version":"0.1","FirmwareVersion":"","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":false},"Name":"getServer","TemplateSMS":null,"Template":"<>","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":"^Watch;ACK-GSRV;[^;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7990,"Code":"ACK-HB-SMS","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":true,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Set heart beat<>","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":true,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":false,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":{"Id":5780,"Protocol":{"Id":297,"Code":"Access TEC Care Watch","Version":"0.1","FirmwareVersion":"","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":false},"Name":"actionConfigurationMode","TemplateSMS":null,"Template":"<>","AckTemplate":null,"Operation":"var configs = [];\r\nif (params.Controls.ConfigurationMode == 'true') {\r\n var data = `GPRSHB1M`;\r\n} else {\r\n var data = `GPRSHB240S`; //`GPRSHB0M`;\r\n}\r\nAddValue('data', data);\r\nvar commandConfigs = {\r\n template: \"main\",\r\n configs: configs\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n\r\nfunction AddValue(p1, p2) {\r\n var cvpair = {\r\n code: p1,\r\n value: p2\r\n };\r\n configs.push(cvpair);\r\n}","AvoidResending":false,"FollowParentSentType":false,"SendingType":2,"CommandToUpdateId":null,"ParentId":null,"Parent":null,"HasAck":true,"HexString":false,"SendAttempts":4,"Order":null},"CacheImei":false,"RegEx":"^Set heart beat[^t]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7989,"Code":"ACK-FIRM","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":true,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Watch;ACK-FIRM;<>;","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":true,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":false,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":{"Id":5796,"Protocol":{"Id":297,"Code":"Access TEC Care Watch","Version":"0.1","FirmwareVersion":"","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":false},"Name":"getFirmwareVersion","TemplateSMS":"<>","Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\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":"^Watch;ACK-FIRM;[^;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7988,"Code":"ACK-LANG","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":true,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Watch;ACK-LANG;<>;","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":true,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":false,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":{"Id":5798,"Protocol":{"Id":297,"Code":"Access TEC Care Watch","Version":"0.1","FirmwareVersion":"","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":false},"Name":"getSystemLanguage","TemplateSMS":"<>","Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\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":"^Watch;ACK-LANG;[^;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7987,"Code":"ACK-MODE","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":true,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Watch;ACK-MODE;<>;","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":true,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":false,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":{"Id":5795,"Protocol":{"Id":297,"Code":"Access TEC Care Watch","Version":"0.1","FirmwareVersion":"","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":false},"Name":"getPerformanceMode","TemplateSMS":"","Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\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":"^Watch;ACK-MODE;[^;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7986,"Code":"ACK-CUSTID","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":true,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Watch;ACK-CUSTID;<>;","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":true,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":false,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":{"Id":5794,"Protocol":{"Id":297,"Code":"Access TEC Care Watch","Version":"0.1","FirmwareVersion":"","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":false},"Name":"getCustomId","TemplateSMS":"","Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\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":"^Watch;ACK-CUSTID;[^;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7985,"Code":"ACK-NOMOTION","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":true,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Watch;ACK-NOMOTION;<>;","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":true,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":false,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":{"Id":5793,"Protocol":{"Id":297,"Code":"Access TEC Care Watch","Version":"0.1","FirmwareVersion":"","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":false},"Name":"getNoMotionAlert","TemplateSMS":"","Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\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":"^Watch;ACK-NOMOTION;[^;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7984,"Code":"ACK-FALLALERT","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":true,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Watch;ACK-FALLALERT;<>;","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":true,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":false,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":{"Id":5792,"Protocol":{"Id":297,"Code":"Access TEC Care Watch","Version":"0.1","FirmwareVersion":"","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":false},"Name":"getFallDownAlert","TemplateSMS":"","Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\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":"^Watch;ACK-FALLALERT;[^;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7983,"Code":"ACK-VOL","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":true,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Watch;ACK-VOL;<>;","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":true,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":false,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":{"Id":5791,"Protocol":{"Id":297,"Code":"Access TEC Care Watch","Version":"0.1","FirmwareVersion":"","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":false},"Name":"getVolume","TemplateSMS":null,"Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\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":"^Watch;ACK-VOL;[^;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7981,"Code":"ALF","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":1,"Template":"Watch-ALF;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;GENERAL=<>;<>","HasTemplateGlobal":false,"ResponseTemplate":"<>","TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^Watch-ALF;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;GENERAL=[^;;]*;[^;]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7980,"Code":"ACK-SPEED","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Watch;ACK-SPEED;<>;","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":"^Watch;ACK-SPEED;[^;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7979,"Code":"ACK-WIFI","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Watch;ACK-WIFI;<>;","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":"^Watch;ACK-WIFI;[^;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7978,"Code":"BATCF","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Watch-BATCF;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;GENERAL=<>;<>","HasTemplateGlobal":false,"ResponseTemplate":"<>","TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^Watch-BATCF;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;GENERAL=[^;;]*;[^;]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7977,"Code":"BATCN","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Watch-BATCN;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;GENERAL=<>;<>","HasTemplateGlobal":false,"ResponseTemplate":"<>","TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^Watch-BATCN;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;GENERAL=[^;;]*;[^;]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7976,"Code":"COMM-SMS","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Watch-SMS;<>;<>","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":"esendex<>esendex<>","LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^Watch-SMS;[^;]*;[^;]*","RegExGlobal":"^esendex[^e]*esendex[^x]*","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7975,"Code":"NACT","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"+RESP:NACT,<>,<>$","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":7974,"Code":"ALA-O","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Watch-ALA-O;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;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":"^Watch-ALA-O;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;GENERAL=[^;;]*;[^;]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7973,"Code":"ENC-2","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"","HasTemplateGlobal":true,"ResponseTemplate":"<>","TemplateGlobal":"AB00<>","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":7972,"Code":"RTL-BEACON","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Beacon:Loc Time: <>","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":7971,"Code":"HRT","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Watch-HRT;<>;STATUS=<>;ETIME=<>;GENERAL=<>;<>;HRT=<>;TLEVEL=<>;LABEL=<>","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":"^Watch-HRT;[^;]*;STATUS=[^;;]*;ETIME=[^;;]*;GENERAL=[^;;]*;[^;;]*;HRT=[^;;]*;TLEVEL=[^;;]*;LABEL=[^=]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":7971,\"Code\":\"HRT\",\"Name\":null,\"MessageCode\":\"HRT\",\"NeedAck\":false,\"IsAck\":false,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":0,\"Template\":\"Watch-HRT;<>;STATUS=<>;ETIME=<>;GENERAL=<>;<>;HRT=<>;TLEVEL=<>;LABEL=<>\",\"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\":\"^Watch-HRT;[^;]*;STATUS=[^;;]*;ETIME=[^;;]*;GENERAL=[^;;]*;[^;;]*;HRT=[^;;]*;TLEVEL=[^;;]*;LABEL=[^=]*\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1765479010}],"Tags":[]},{"Id":7969,"Code":"ALA-C","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Watch-ALA-C;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;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":"^Watch-ALA-C;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;GENERAL=[^;;]*;[^;]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7968,"Code":"ENC","Name":null,"MessageCode":null,"NeedAck":true,"IsAck":false,"IsFailAck":false,"IsAckHexString":true,"NoOperation":false,"Type":0,"Template":"","HasTemplateGlobal":true,"ResponseTemplate":"<>","TemplateGlobal":"AB10<>","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":7967,"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: <>","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":7966,"Code":"COMM-GT","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Eview;<>;<>;Get timestamp","HasTemplateGlobal":false,"ResponseTemplate":"<>","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":7965,"Code":"F-ACK-Version Invalid","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":true,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Watch-ACK;<>;AB00030018C5<>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":"^Watch-ACK;[^;]*;AB00030018C5[^ ]*7F0111","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7964,"Code":"F-ACK-Key Invalid","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":true,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Watch-ACK;<>;AB000300FFB5<>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":"^Watch-ACK;[^;]*;AB000300FFB5[^ ]*7F0116","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7963,"Code":"F-ACK-Encryption Invalid","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":true,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Watch-ACK;<>;AB0003007BF5<>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":"^Watch-ACK;[^;]*;AB0003007BF5[^ ]*7F0112","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7962,"Code":"F-ACK-Checksum Error","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":true,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Watch-ACK;<>;AB000300BD95<>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":"^Watch-ACK;[^;]*;AB000300BD95[^ ]*7F0114","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7961,"Code":"F-ACK-BLE Password","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":true,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Watch-ACK;<>;AB000300CC8F<>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":"^Watch-ACK;[^;]*;AB000300CC8F[^7;]*7F0140","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7960,"Code":"F-ACK-Address Resp","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":true,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Watch-ACK;<>;AB0003006262<>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":"^Watch-ACK;[^;]*;AB0003006262[^ ]*7F0128","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7959,"Code":"ACK-global","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":true,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Watch-ACK;<>;AB00030008C7<>7F0100","HasTemplateGlobal":false,"ResponseTemplate":"<>","TemplateGlobal":null,"LongConnection":true,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":false,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^Watch-ACK;[^;]*;AB00030008C7[^ ]*7F0100","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7958,"Code":"F-ACK-Invalid Parameter","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":true,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Watch-ACK;<>;AB000300EEA3<>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":"^Watch-ACK;[^;]*;AB000300EEA3[^ ]*7F0124","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7957,"Code":"F-ACK-Length Error","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":true,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Watch-ACK;<>;AB0003005AE5<>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":"^Watch-ACK;[^;]*;AB0003005AE5[^ ]*7F0113","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7956,"Code":"ALF-C","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Watch-ALF-C;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;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":"^Watch-ALF-C;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;GENERAL=[^;;]*;[^;]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7955,"Code":"ALNM","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":1,"Template":"Watch-ALNM;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;GENERAL=<>;<>","HasTemplateGlobal":false,"ResponseTemplate":"<>","TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^Watch-ALNM;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;GENERAL=[^;;]*;[^;]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7954,"Code":"ALSP","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":1,"Template":"Watch-ALSP;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;GENERAL=<>;<>","HasTemplateGlobal":false,"ResponseTemplate":"<>","TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^Watch-ALSP;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;GENERAL=[^;;]*;[^;]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7953,"Code":"RTL","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Watch-RTL;<>;<>;<>;<>;<>;<>;<>;<>;<>;","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":"^Watch-RTL;[^;]*;[^;;]*;[^;;]*;[^;;]*;[^;;]*;[^;;]*;[^;;]*;[^;;]*;[^;;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7952,"Code":"ALA-S","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Watch-ALA-S;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;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":"^Watch-ALA-S;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;GENERAL=[^;;]*;[^;]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7951,"Code":"STP","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Watch-STP;<>;STATUS=<>;ETIME=<>;GENERAL=<>;<>;STP=<>;LABEL=<>","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":"^Watch-STP;[^;]*;STATUS=[^;;]*;ETIME=[^;;]*;GENERAL=[^;;]*;[^;;]*;STP=[^;;]*;LABEL=[^=]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":7951,\"Code\":\"STP\",\"Name\":null,\"MessageCode\":\"STEPS\",\"NeedAck\":false,\"IsAck\":false,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":0,\"Template\":\"Watch-STP;<>;STATUS=<>;ETIME=<>;GENERAL=<>;<>;STP=<>;LABEL=<>\",\"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\":\"^Watch-STP;[^;]*;STATUS=[^;;]*;ETIME=[^;;]*;GENERAL=[^;;]*;[^;;]*;STP=[^;;]*;LABEL=[^=]*\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1765478967}],"Tags":[]},{"Id":7950,"Code":"BATL","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":1,"Template":"Watch-BATL;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;GENERAL=<>;<>","HasTemplateGlobal":false,"ResponseTemplate":"<>","TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^Watch-BATL;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;GENERAL=[^;;]*;[^;]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7949,"Code":"BATF","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Watch-BATF;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;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":"^Watch-BATF;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;GENERAL=[^;;]*;[^;]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7948,"Code":"ALMOV","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":1,"Template":"Watch-ALMOV;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;GENERAL=<>;<>","HasTemplateGlobal":false,"ResponseTemplate":"<>","TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^Watch-ALMOV;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;GENERAL=[^;;]*;[^;]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7947,"Code":"ALSOS","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":1,"Template":"Watch-ALSOS;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;GENERAL=<>;<>","HasTemplateGlobal":false,"ResponseTemplate":"<>","TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^Watch-ALSOS;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;GENERAL=[^;;]*;[^;]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7946,"Code":"F-ACK-No Memory","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":true,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Watch-ACK;<>;AB000300CFB3<>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":"^Watch-ACK;[^;]*;AB000300CFB3[^ ]*7F0125","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7945,"Code":"CHK","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Watch-HTB;<>;STATUS=<>;TIME=<>;BATP=<>;SIGNAL=<>;WM=<>;GENERAL=<>","HasTemplateGlobal":false,"ResponseTemplate":"<>","TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^Watch-HTB;[^;]*;STATUS=[^;;]*;TIME=[^;;]*;BATP=[^;;]*;SIGNAL=[^;;]*;WM=[^;;]*;GENERAL=[^=]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7944,"Code":"CYC","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Watch-CYC;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;SIGNAL=<>;WM=<>;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":"^Watch-CYC;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;SIGNAL=[^;;]*;WM=[^;;]*;GENERAL=[^=]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7942,"Code":"ALA","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":1,"Template":"Watch-ALA;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;GENERAL=<>;<>","HasTemplateGlobal":false,"ResponseTemplate":"<>","TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^Watch-ALA;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;GENERAL=[^;;]*;[^;]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7941,"Code":"F-ACK-Invalid State","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":true,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Watch-ACK;<>;AB00030009D3<>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":"^Watch-ACK;[^;]*;AB00030009D3[^ ]*7F0123","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7940,"Code":"F-ACK-SubFunction Not Supported","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":true,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Watch-ACK;<>;AB000300AC83<>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":"^Watch-ACK;[^;]*;AB000300AC83[^ ]*7F0126","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7939,"Code":"CHK-ASSO","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Eview-ASSOCIATE;<>;<>;","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\":7939,\"Code\":\"CON-ASSO\",\"Name\":null,\"MessageCode\":\"CON\",\"NeedAck\":false,\"IsAck\":false,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":0,\"Template\":\"Eview-ASSOCIATE;<>;<>;\",\"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":1749036744}],"Tags":[]},{"Id":7938,"Code":"F-ACK-Data Size Error","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":true,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Watch-ACK;<>;AB00030028C3<>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":"^Watch-ACK;[^;]*;AB00030028C3[^ ]*7F0122","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7937,"Code":"ZNI","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":1,"Template":"+RESP:ZIN,<>,<>,<>,<>,<>,<>,<>,<>$","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":7936,"Code":"F-ACK-GPS Is Not Ready","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":true,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Watch-ACK;<>;AB0003008D93<>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":"^Watch-ACK;[^;]*;AB0003008D93[^ ]*7F0127","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7935,"Code":"ZNO","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":1,"Template":"+RESP:ZOUT,<>,<>,<>,<>,<>,<>,<>,<>$","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":7934,"Code":"F-ACK-Key Length Error","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":true,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Watch-ACK;<>;AB000300DEA5<>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":"^Watch-ACK;[^;]*;AB000300DEA5[^ ]*7F0117","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7933,"Code":"F-ACK-Data Format Invalid","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":true,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Watch-ACK;<>;AB0003004BF3<>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":"^Watch-ACK;[^;]*;AB0003004BF3[^ ]*7F0121","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7932,"Code":"ACK-Out Of Service","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":true,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Watch-ACK;<>;AB0003005BF1<>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":"^Watch-ACK;[^;]*;AB0003005BF1[^ ]*7F0130","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7931,"Code":"F-ACK-Command Invalid","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":true,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Watch-ACK;<>;AB0003009C85<>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":"^Watch-ACK;[^;]*;AB0003009C85[^ ]*7F0115","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":8055,"Code":"ALA-F","Name":null,"MessageCode":"ALA-F","NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Watch-ALA-F;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;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":"^Watch-ALA-F;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;GENERAL=[^;;]*;[^;]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[{"Type":0,"NewValue":"{\"Id\":8055,\"Code\":\"ALA-F\",\"Name\":null,\"MessageCode\":\"ALA-F\",\"NeedAck\":false,\"IsAck\":false,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":0,\"Template\":\"Watch-ALA-F;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;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\":\"^Watch-ALA-F;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;GENERAL=[^;;]*;[^;]*\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1758220159},{"Type":1,"NewValue":"{\"Id\":8055,\"Code\":\"ALA-F\",\"Name\":null,\"MessageCode\":\"ALA-F\",\"NeedAck\":false,\"IsAck\":false,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":2,\"Template\":\"Watch-ALA-F;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;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\":\"^Watch-ALA-F;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;GENERAL=[^;;]*;[^;]*\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1758220240}],"Tags":[]},{"Id":8056,"Code":"ALA-TLT","Name":null,"MessageCode":"ALTLT","NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":1,"Template":"Watch-TLT;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;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":"^Watch-TLT;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;GENERAL=[^;;]*;[^;]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[{"Type":0,"NewValue":"{\"Id\":8056,\"Code\":\"ALA-TLT\",\"Name\":null,\"MessageCode\":\"ALTLT\",\"NeedAck\":false,\"IsAck\":false,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":1,\"Template\":\"Watch-TLT;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;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\":\"^Watch-TLT;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;GENERAL=[^;;]*;[^;]*\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1758220352}],"Tags":[]},{"Id":8057,"Code":"HBP","Name":null,"MessageCode":"HBP","NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Watch-HBP;<>;STATUS=<>;ETIME=<>;GENERAL=<>;<>;STP=<>;LABEL=<>","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":"^Watch-HBP;[^;]*;STATUS=[^;;]*;ETIME=[^;;]*;GENERAL=[^;;]*;[^;;]*;STP=[^;;]*;LABEL=[^=]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[{"Type":0,"NewValue":"{\"Id\":8057,\"Code\":\"HBP\",\"Name\":null,\"MessageCode\":\"HBP\",\"NeedAck\":false,\"IsAck\":false,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":0,\"Template\":\"Watch-HBP;<>;STATUS=<>;ETIME=<>;GENERAL=<>;<>;STP=<>;LABEL=<>\",\"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\":\"^Watch-HBP;[^;]*;STATUS=[^;;]*;ETIME=[^;;]*;GENERAL=[^;;]*;[^;;]*;STP=[^;;]*;LABEL=[^=]*\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1763492881},{"Type":1,"NewValue":"{\"Id\":8057,\"Code\":\"HBP\",\"Name\":null,\"MessageCode\":\"HBP\",\"NeedAck\":false,\"IsAck\":false,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":0,\"Template\":\"Watch-HBP;<>;STATUS=<>;ETIME=<>;GENERAL=<>;<>;SPO=<>;LABEL=<>\",\"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\":\"^Watch-HBP;[^;]*;STATUS=[^;;]*;ETIME=[^;;]*;GENERAL=[^;;]*;[^;;]*;SPO=[^;;]*;LABEL=[^=]*\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1763493293},{"Type":1,"NewValue":"{\"Id\":8057,\"Code\":\"SPO2\",\"Name\":null,\"MessageCode\":\"SPO2\",\"NeedAck\":false,\"IsAck\":false,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":0,\"Template\":\"Watch-SPO2;<>;STATUS=<>;ETIME=<>;GENERAL=<>;<>;SPO2=<>;LABEL=<>\",\"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\":\"^Watch-SPO2;[^;]*;STATUS=[^;;]*;ETIME=[^;;]*;GENERAL=[^;;]*;[^;;]*;SPO2=[^;;]*;LABEL=[^=]*\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1763494978},{"Type":1,"NewValue":"{\"Id\":8057,\"Code\":\"SPO2\",\"Name\":null,\"MessageCode\":\"SPO2\",\"NeedAck\":false,\"IsAck\":false,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":0,\"Template\":\"Watch-SPO2;<>;STATUS=<>;ETIME=<>;GENERAL=<>;<>;SPO2=<>;TLEVEL=<>;LABEL=<>\",\"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\":\"^Watch-SPO2;[^;]*;STATUS=[^;;]*;ETIME=[^;;]*;GENERAL=[^;;]*;[^;;]*;SPO2=[^;;]*;TLEVEL=[^;;]*;LABEL=[^=]*\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1763495262},{"Type":1,"NewValue":"{\"Id\":8057,\"Code\":\"SPO2\",\"Name\":null,\"MessageCode\":\"SPO2\",\"NeedAck\":false,\"IsAck\":false,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":0,\"Template\":\"Watch-SPO2;<>;STATUS=<>;ETIME=<>;GENERAL=<>;<>;SPO2=<>;TLEVEL=<>;LABEL=<>\",\"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\":\"^Watch-SPO2;[^;]*;STATUS=[^;;]*;ETIME=[^;;]*;GENERAL=[^;;]*;[^;;]*;SPO2=[^;;]*;TLEVEL=[^;;]*;LABEL=[^=]*\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1765478989}],"Tags":[]}],"Commands":[{"Id":5720,"Name":"actionDeviceReboot","TemplateSMS":"<>","Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n 0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\nvar configs = [];\r\nvar configsSMS = [];\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar command = '04';\r\nvar keyLength = '01';\r\nvar key = '12';\r\nvar messageBody = command + keyLength + key;\r\nvar checksum = byteStringToByteArray(messageBody);\r\nchecksum = crc16byte(checksum);\r\nchecksum = decimalToHex(checksum).toUpperCase();\r\nchecksum = ('0000' + checksum).slice(-4);\r\nchecksum = checksum.toString().substring(2, 4) + checksum.toString().substring(0, 2);\r\nvar prefix = 'AB10' + '0300' + checksum + sequenceID;\r\nvar data = prefix + messageBody;\r\n// For GPRS command\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\n// For SMS command\r\nvar dataSMS = 'reboot';\r\nAddValueSMS('dataSMS', dataSMS);\r\nvar commandConfigs = {\r\n template: \"main\",\r\n configs: configs,\r\n configsSMS: configsSMS\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n\r\nfunction AddValue(p1, p2) {\r\n var cvpair = {\r\n code: p1,\r\n value: p2\r\n };\r\n configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n var cvpair = {\r\n code: p1,\r\n value: p2\r\n };\r\n configsSMS.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n var arr1 = [];\r\n for (var n = 0, l = str.length; n < l; n++) {\r\n var hex = Number(str.charCodeAt(n)).toString(16);\r\n arr1.push(hex);\r\n }\r\n return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n var crc = 0x0000;\r\n var j, i;\r\n for (i = 0; i < s.length; i++) {\r\n c = s[i];\r\n if (c > 255) {\r\n throw new RangeError();\r\n }\r\n j = (c ^ (crc >> 8)) & 0xFF;\r\n crc = crcTable[j] ^ (crc << 8);\r\n }\r\n return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n var splitStr = []\r\n var j = 0\r\n for (let i = 0; i < str.length; i += 2) {\r\n splitStr[j] = str.substring(i, i + 2)\r\n j++\r\n }\r\n var bytes = []\r\n var bytePos = 0\r\n for (let i = 0; i < splitStr.length; i++) {\r\n var byteStr = splitStr[i]\r\n var b = parseInt(byteStr, 16)\r\n if (b < 256) {\r\n bytes[bytePos] = b\r\n bytePos++\r\n }\r\n }\r\n return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n hexString = str.toString(16);\r\n return hexString\r\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":2,"HasAck":true,"HexString":true,"Order":13,"SendAttempts":4,"ProtocolActionObjects":[],"Tags":[]},{"Id":5721,"Name":"setSOSOption","TemplateSMS":null,"Template":"<>","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":[],"Tags":[]},{"Id":5722,"Name":"setSpeedDialSettings","TemplateSMS":null,"Template":"<>","AckTemplate":null,"Operation":"var configs = [];\nvar crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\n 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\n 0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\n 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\n];\n//create the bit table to use with control\nvar value = '';\nif (params.SpeedDial.EnableDisableSpeedDial == 'true') {\n value += '10'; //Enable\n value += '0'; //Long Press\n /*if (params.SpeedDialButtonSettings.TriggerMode == '0') {\n value += '0';\n } else {\n value += '1';\n }*/\n value += '0010'; //Auth2 number\n var time = 20;\n value += ('0000000' + decimalToBinary(parseInt(time))).slice(-7);\n value += '11'; //feedback vibrate and voice\n /*if (params.SpeedDialButtonSettings.Feedback) {\n value += params.SpeedDialButtonSettings.Feedback;\n } else {\n value += '00';\n }*/\n} else {\n value = '0000000000000000';\n}\nvalue = ('0000' + binaryToHex(value)).slice(-4).toUpperCase();\nvalue = value.substring(2, 4) + value.substring(0, 2);\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\nvar command = '02';\nvar keyLength = '03';\nvar key = '21';\nvar messageBody = command + keyLength + key + value;\nvar checksum = byteStringToByteArray(messageBody);\nchecksum = crc16byte(checksum);\nchecksum = decimalToHex(checksum);\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\nchecksum = checksum.toString().substring(2, 4) + checksum.toString().substring(0, 2);\n//Hpw to calculate sequenceID\nvar prefix = 'AB10' + '0500' + checksum + sequenceID;\nvar data = prefix + messageBody;\nAddValue('data', data);\nAddValue('sequenceNumber', sequenceID); //add 20/07\nvar commandConfigs = {\n template: \"main\",\n configs: configs\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValue(p1, p2) {\n var cvpair = {\n code: p1,\n value: p2\n };\n configs.push(cvpair);\n}\n\nfunction ascii_to_hexa(str) {\n var arr1 = [];\n for (var n = 0, l = str.length; n < l; n++) {\n var hex = Number(str.charCodeAt(n)).toString(16);\n arr1.push(hex);\n }\n return arr1.join('');\n}\n\nfunction crc16byte(s) {\n var crc = 0x0000;\n var j, i;\n for (i = 0; i < s.length; i++) {\n c = s[i];\n if (c > 255) {\n throw new RangeError();\n }\n j = (c ^ (crc >> 8)) & 0xFF;\n crc = crcTable[j] ^ (crc << 8);\n }\n return ((crc ^ 0) & 0xFFFF);\n}\n\nfunction byteStringToByteArray(str) {\n var splitStr = []\n var j = 0\n for (let i = 0; i < str.length; i += 2) {\n splitStr[j] = str.substring(i, i + 2)\n j++\n }\n var bytes = []\n var bytePos = 0\n for (let i = 0; i < splitStr.length; i++) {\n var byteStr = splitStr[i]\n var b = parseInt(byteStr, 16)\n if (b < 256) {\n bytes[bytePos] = b\n bytePos++\n }\n }\n return bytes\n}\n\nfunction decimalToHex(str) {\n hexString = str.toString(16);\n return hexString\n}\n\nfunction decimalToBinary(x) {\n let bin = 0;\n let rem, i = 1,\n step = 1;\n while (x != 0) {\n rem = x % 2;\n x = parseInt(x / 2);\n bin = bin + rem * i;\n i = i * 10;\n }\n return bin\n}\n\nfunction binaryToHex(x) {\n var hexa = parseInt(x, 2).toString(16);\n return hexa\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":true,"Order":null,"SendAttempts":6,"ProtocolActionObjects":[],"Tags":[]},{"Id":5723,"Name":"setOystaNumber","TemplateSMS":null,"Template":"<>","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":5724,"Name":"setSMSPassword","TemplateSMS":null,"Template":"<>","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":5725,"Name":"setExtraEnableControl","TemplateSMS":null,"Template":"<>","AckTemplate":null,"Operation":"var configs = [];\r\nvar crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n 0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\n//create the bit table to use with control\r\nvar value = '';\r\n// Wifi loc name EV07, beacon leaves home alert, beacon V2, BLE scan switch,\r\n// XXX, no motion alert data only EV05, power saving EV06, Stop alert call sequence.\r\nvalue += '0000000';\r\nif (params.EnableControl.StopCallSequence == 'true') {\r\n value += '1';\r\n} else {\r\n value += '0';\r\n}\r\nvalue = reverseString(value);\r\n\r\nfunction reverseString(str) {\r\n var newString = \"\";\r\n for (var i = str.length - 1; i >= 0; i--) {\r\n newString += str[i];\r\n }\r\n return newString;\r\n}\r\nvalue = ('00000000' + binaryToHex(value)).slice(-8).toUpperCase();\r\nvalue = changeEndianness(value);\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar command = '02';\r\nvar keyLength = '05';\r\nvar key = '75';\r\nvar messageBody = command + keyLength + key + value;\r\nvar checksum = byteStringToByteArray(messageBody);\r\nchecksum = crc16byte(checksum);\r\nchecksum = decimalToHex(checksum);\r\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\r\nchecksum = changeEndianness(checksum);\r\n//How to calculate sequenceID\r\nvar prefix = 'AB10' + '0700' + checksum + sequenceID;\r\nvar data = prefix + messageBody;\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID); //add 20/07\r\nvar commandConfigs = {\r\n template: \"main\",\r\n configs: configs\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n\r\nfunction AddValue(p1, p2) {\r\n var cvpair = {\r\n code: p1,\r\n value: p2\r\n };\r\n configs.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n var arr1 = [];\r\n for (var n = 0, l = str.length; n < l; n++) {\r\n var hex = Number(str.charCodeAt(n)).toString(16);\r\n arr1.push(hex);\r\n }\r\n return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n var crc = 0x0000;\r\n var j, i;\r\n for (i = 0; i < s.length; i++) {\r\n c = s[i];\r\n if (c > 255) {\r\n throw new RangeError();\r\n }\r\n j = (c ^ (crc >> 8)) & 0xFF;\r\n crc = crcTable[j] ^ (crc << 8);\r\n }\r\n return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n var splitStr = []\r\n var j = 0\r\n for (let i = 0; i < str.length; i += 2) {\r\n splitStr[j] = str.substring(i, i + 2)\r\n j++\r\n }\r\n var bytes = []\r\n var bytePos = 0\r\n for (let i = 0; i < splitStr.length; i++) {\r\n var byteStr = splitStr[i]\r\n var b = parseInt(byteStr, 16)\r\n if (b < 256) {\r\n bytes[bytePos] = b\r\n bytePos++\r\n }\r\n }\r\n return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n hexString = str.toString(16);\r\n return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n let bin = 0;\r\n let rem, i = 1,\r\n step = 1;\r\n while (x != 0) {\r\n rem = x % 2;\r\n x = parseInt(x / 2);\r\n bin = bin + rem * i;\r\n i = i * 10;\r\n }\r\n return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n var hexa = parseInt(x, 2).toString(16);\r\n return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n const result = [];\r\n let len = string.length - 2;\r\n while (len >= 0) {\r\n result.push(string.substr(len, 2));\r\n len -= 2;\r\n }\r\n return result.join('');\r\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":true,"Order":null,"SendAttempts":2,"ProtocolActionObjects":[],"Tags":[]},{"Id":5726,"Name":"setHeartRateDetectingInterval","TemplateSMS":null,"Template":"<>","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":[{"Type":1,"NewValue":"{\"Id\":5726,\"Name\":\"setHeartRateDetectingInterval\",\"TemplateSMS\":null,\"Template\":\"<>\",\"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.HeartrateSettings.ReportingFrequency) {\\n var heartBeat = parseInt(params.HeartrateSettings.ReportingFrequency);\\n heartBeat = decimalToHex(heartBeat);\\n heartBeat = ('000000' + heartBeat).slice(-6).toUpperCase();\\n if (params.HeartrateSettings.EnableDisableHeartrateSettings == '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 = '58020000'\\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\":[]}","Timestamp":1748971251},{"Type":1,"NewValue":"{\"Id\":5726,\"Name\":\"setHeartRateDetectingInterval\",\"TemplateSMS\":null,\"Template\":\"<>\",\"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.HeartrateSettings.ReportingFrequency) {\\n var heartBeat = parseInt(params.HeartrateSettings.ReportingFrequency) * 60; //in seconds\\n heartBeat = decimalToHex(heartBeat);\\n heartBeat = ('000000' + heartBeat).slice(-6).toUpperCase();\\n if (params.HeartrateSettings.EnableDisableHeartrateSettings == '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 = '58020000'\\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\":[]}","Timestamp":1749057629}],"Tags":[]},{"Id":5727,"Name":"setFallDownAlert","TemplateSMS":null,"Template":"<>","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":5728,"Name":"setSOSButtonSettings","TemplateSMS":null,"Template":"<>","AckTemplate":null,"Operation":"var configs = [];\nvar crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\n 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\n 0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\n 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\n];\n//create the bit table to use with control\nvar value = '';\nif (params.SOSButtonSettings.EnableDisableSOSButtonSettings == 'true') {\n value += '10';\n if (params.SOSButtonSettings.TriggerMode == '0') {\n value += '0';\n } else {\n value += '1';\n }\n /*\n if (params.SOSButtonSettings.CallTo == '0'){\n value += '0001'\n }else { \n value += '0000'\n }\n */\n value += '1111'; //SOS task (Default) Standard\n var time = 20;\n value += ('0000000' + decimalToBinary(parseInt(time))).slice(-7);\n if (params.SOSButtonSettings.Feedback) {\n value += params.SOSButtonSettings.Feedback;\n } else {\n value += '00';\n }\n} else {\n value = '0000000000000000';\n}\nvalue = ('0000' + binaryToHex(value)).slice(-4).toUpperCase();\nvalue = value.substring(2, 4) + value.substring(0, 2);\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\nvar command = '02';\nvar keyLength = '03';\nvar key = '20';\nvar messageBody = command + keyLength + key + value;\nvar checksum = byteStringToByteArray(messageBody);\nchecksum = crc16byte(checksum);\nchecksum = decimalToHex(checksum);\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\nchecksum = checksum.toString().substring(2, 4) + checksum.toString().substring(0, 2);\n//Hpw to calculate sequenceID\nvar prefix = 'AB10' + '0500' + checksum + sequenceID;\nvar data = prefix + messageBody;\nAddValue('data', data);\nAddValue('sequenceNumber', sequenceID);\nvar commandConfigs = {\n template: \"main\",\n configs: configs\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValue(p1, p2) {\n var cvpair = {\n code: p1,\n value: p2\n };\n configs.push(cvpair);\n}\n\nfunction ascii_to_hexa(str) {\n var arr1 = [];\n for (var n = 0, l = str.length; n < l; n++) {\n var hex = Number(str.charCodeAt(n)).toString(16);\n arr1.push(hex);\n }\n return arr1.join('');\n}\n\nfunction crc16byte(s) {\n var crc = 0x0000;\n var j, i;\n for (i = 0; i < s.length; i++) {\n c = s[i];\n if (c > 255) {\n throw new RangeError();\n }\n j = (c ^ (crc >> 8)) & 0xFF;\n crc = crcTable[j] ^ (crc << 8);\n }\n return ((crc ^ 0) & 0xFFFF);\n}\n\nfunction byteStringToByteArray(str) {\n var splitStr = [];\n var j = 0;\n for (let i = 0; i < str.length; i += 2) {\n splitStr[j] = str.substring(i, i + 2);\n j++;\n }\n var bytes = [];\n var bytePos = 0;\n for (let i = 0; i < splitStr.length; i++) {\n var byteStr = splitStr[i];\n var b = parseInt(byteStr, 16);\n if (b < 256) {\n bytes[bytePos] = b;\n bytePos++;\n }\n }\n return bytes;\n}\n\nfunction decimalToHex(str) {\n hexString = str.toString(16);\n return hexString;\n}\n\nfunction decimalToBinary(x) {\n let bin = 0;\n let rem, i = 1,\n step = 1;\n while (x !== 0) {\n rem = x % 2;\n x = parseInt(x / 2);\n bin = bin + rem * i;\n i = i * 10;\n }\n return bin;\n}\n\nfunction binaryToHex(x) {\n var hexa = parseInt(x, 2).toString(16);\n return hexa;\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":true,"Order":null,"SendAttempts":6,"ProtocolActionObjects":[],"Tags":[]},{"Id":5729,"Name":"setEnableControl","TemplateSMS":null,"Template":"<>","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":[],"Tags":[]},{"Id":5731,"Name":"setAlarmClock4","TemplateSMS":null,"Template":"<>","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":5732,"Name":"setAlarmClock3","TemplateSMS":null,"Template":"<>","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":5733,"Name":"setAlarmClock2","TemplateSMS":null,"Template":"<>","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":5734,"Name":"setCustom ID","TemplateSMS":null,"Template":"<>","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":[],"Tags":[]},{"Id":5735,"Name":"setHomeBeacon","TemplateSMS":"<>","Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\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":[],"Tags":[]},{"Id":5736,"Name":"setSystemLanguage","TemplateSMS":"<>","Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\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":5737,"Name":"setNoMotionAlert","TemplateSMS":null,"Template":"<>","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":5738,"Name":"setContinuousLocate","TemplateSMS":null,"Template":"<>","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":[],"Tags":[]},{"Id":5739,"Name":"setStepCollectSettings","TemplateSMS":null,"Template":"<>","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":[{"Type":1,"NewValue":"{\"Id\":5739,\"Name\":\"setStepCollectSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"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.StepsSettings.ReportingFrequency) {\\n var heartBeat = parseInt(params.StepsSettings.ReportingFrequency);\\n heartBeat = decimalToHex(heartBeat);\\n heartBeat = ('000000' + heartBeat).slice(-6).toUpperCase();\\n if (params.StepsSettings.EnableDisableStepsSettings == '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 = '58020000';\\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\":[]}","Timestamp":1748972510},{"Type":1,"NewValue":"{\"Id\":5739,\"Name\":\"setStepCollectSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"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.StepsSettings.ReportingFrequency) {\\n var heartBeat = parseInt(params.StepsSettings.ReportingFrequency) * 60; //in seconds\\n heartBeat = decimalToHex(heartBeat);\\n heartBeat = ('000000' + heartBeat).slice(-6).toUpperCase();\\n if (params.StepsSettings.EnableDisableStepsSettings == '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 = '58020000';\\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\":[]}","Timestamp":1749057591}],"Tags":[]},{"Id":5740,"Name":"setSMSGatewayNumber","TemplateSMS":null,"Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\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":5741,"Name":"getHomeBeacon","TemplateSMS":null,"Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\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":5742,"Name":"setSystemSettings","TemplateSMS":null,"Template":"<>","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":[],"Tags":[]},{"Id":5743,"Name":"getAuthorisedNumbers","TemplateSMS":null,"Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\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":5744,"Name":"setServerSMS","TemplateSMS":"<>","Template":"<>","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":5745,"Name":"setEmergencyNumberbySMS","TemplateSMS":"<>","Template":"<>","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":5746,"Name":"setBeacons","TemplateSMS":null,"Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\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":5747,"Name":"setFallSensitivitybySMS","TemplateSMS":"<>","Template":"<>","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":5748,"Name":"setOverSpeedAlert","TemplateSMS":null,"Template":"<>","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":5749,"Name":"setAPNSMS","TemplateSMS":"<>","Template":"<>","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":5750,"Name":"setPerformanceMode","TemplateSMS":"<>","Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n 0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\n//Añadir comando para poner modo6 ??\r\nvar configs = [];\r\nvar configsSMS = [];\r\nvar command = '02';\r\nvar keyLength = '0D';\r\nvar key = '44'; // Time interval command\r\nvar cycleInterval = 60;\r\nvar lazyCycleInterval = 60;\r\nvar heartBeatStatus = '00000000'; //heartbeat OFF and heartBeat = 0; heartbeat ON and heartBeat = 240 F0000080; \r\nvar selectedMode = '2'; // Balanced mode\r\nif (params.PerformanceSettings.Mode) {\r\n selectedMode = params.PerformanceSettings.Mode;\r\n}\r\nvar value = '000000'; // Time interval to zero\r\nswitch (selectedMode) {\r\n case '0': // No reporting\r\n cycleInterval = 86400; // Time interval to 24 hrs \r\n lazyCycleInterval = 86400; // Lazy Time interval to 24 hrs \r\n // HB = 0\r\n break;\r\n case '1': //Power Saving\r\n cycleInterval = 28800; // Time interval to 8 hrs \r\n lazyCycleInterval = 43200; // Lazy Time interval to 12 hrs \r\n // HB = 0\r\n break;\r\n case '2': //Balanced\r\n cycleInterval = 600; // Time interval to 10 min \r\n lazyCycleInterval = 3600; // Lazy Time interval to 1 hrs \r\n //heartBeatStatus = 'F0000080'; //heartbeat ON and heartBeat = 240\r\n break;\r\n case '3': //High Freq\r\n cycleInterval = 240; // Time interval to 4 min \r\n lazyCycleInterval = 3600; // Lazy Time interval to 1 hrs\r\n //heartBeatStatus = 'F0000080'; //heartbeat ON and heartBeat = 240 \r\n break;\r\n default:\r\n var value = '000000'; // Time interval to zero\r\n //var valueSMS = '';\r\n}\r\n//Sms Value\r\nvar valueSMS = ',' + cycleInterval + 'S,' + lazyCycleInterval + 'S';\r\nvar value = parseInt(cycleInterval);\r\nif (params.Controls.ConfigurationMode == 'true') {\r\n heartBeatStatus = '3C000080'; //heartbeat ON and heartBeat = 60;\r\n} else {\r\n heartBeatStatus = 'F0000080'; //heartbeat ON and heartBeat = 240; \r\n}\r\nvalue = decimalToHex(value);\r\nvalue = ('000000' + value).slice(-6).toUpperCase();\r\nvalue = value.substring(4, 6) + value.substring(2, 4) + value.substring(0, 2);\r\nvar valueLazy = parseInt(lazyCycleInterval);\r\nvar valueLazy = decimalToHex(valueLazy);\r\nvalueLazy = ('000000' + valueLazy).slice(-6).toUpperCase();\r\nvalueLazy = valueLazy.substring(4, 6) + valueLazy.substring(2, 4) + valueLazy.substring(0, 2);\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar messageBody = command + keyLength + key + heartBeatStatus + value + '00' + valueLazy + '00';\r\nvar checksum = byteStringToByteArray(messageBody);\r\nchecksum = crc16byte(checksum);\r\nchecksum = decimalToHex(checksum);\r\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\r\nchecksum = checksum.toString().substring(2, 4) + checksum.toString().substring(0, 2);\r\n//How to calculate sequenceID\r\nvar prefix = 'AB10' + '0F00' + checksum + sequenceID;\r\nvar data = prefix + messageBody;\r\n// For GPRS command\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\n// For SMS command\r\nvar dataSMS = 'mode6' + valueSMS;\r\nAddValueSMS('dataSMS', dataSMS);\r\n//debug(data);\r\n//debug(dataSMS);\r\nvar commandConfigs = {\r\n template: \"main\",\r\n configs: configs,\r\n configsSMS: configsSMS\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n\r\nfunction AddValue(p1, p2) {\r\n var cvpair = {\r\n code: p1,\r\n value: p2\r\n };\r\n configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n var cvpair = {\r\n code: p1,\r\n value: p2\r\n };\r\n configsSMS.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n var arr1 = [];\r\n for (var n = 0, l = str.length; n < l; n++) {\r\n var hex = Number(str.charCodeAt(n)).toString(16);\r\n arr1.push(hex);\r\n }\r\n return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n var crc = 0x0000;\r\n var j, i;\r\n for (i = 0; i < s.length; i++) {\r\n c = s[i];\r\n if (c > 255) {\r\n throw new RangeError();\r\n }\r\n j = (c ^ (crc >> 8)) & 0xFF;\r\n crc = crcTable[j] ^ (crc << 8);\r\n }\r\n return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n var splitStr = []\r\n var j = 0\r\n for (let i = 0; i < str.length; i += 2) {\r\n splitStr[j] = str.substring(i, i + 2)\r\n j++\r\n }\r\n var bytes = []\r\n var bytePos = 0\r\n for (let i = 0; i < splitStr.length; i++) {\r\n var byteStr = splitStr[i]\r\n var b = parseInt(byteStr, 16)\r\n if (b < 256) {\r\n bytes[bytePos] = b\r\n bytePos++\r\n }\r\n }\r\n return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n hexString = str.toString(16);\r\n return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n let bin = 0;\r\n let rem, i = 1,\r\n step = 1;\r\n while (x != 0) {\r\n rem = x % 2;\r\n x = parseInt(x / 2);\r\n bin = bin + rem * i;\r\n i = i * 10;\r\n }\r\n return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n var hexa = parseInt(x, 2).toString(16);\r\n return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n const result = [];\r\n let len = string.length - 2;\r\n while (len >= 0) {\r\n result.push(string.substr(len, 2));\r\n len -= 2;\r\n }\r\n return result.join('');\r\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":true,"Order":null,"SendAttempts":2,"ProtocolActionObjects":[],"Tags":[]},{"Id":5751,"Name":"setAlarmClock1","TemplateSMS":null,"Template":"<>","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":5752,"Name":"setSpeakerVolume","TemplateSMS":null,"Template":"<>","AckTemplate":null,"Operation":"var configs = [];\nvar crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\n 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\n 0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\n 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\n];\nif (params.SystemSettings.Volume) {\n var volume = parseInt(params.SystemSettings.Volume)\n volume = decimalToHex(volume)\n volume = ('00' + volume).slice(-2).toUpperCase()\n}\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase()\nvar command = '02'\nvar keyLength = '02'\nvar key = '12'\nvar messageBody = command + keyLength + key + volume\nvar checksum = byteStringToByteArray(messageBody)\nchecksum = crc16byte(checksum)\nchecksum = decimalToHex(checksum).toUpperCase()\nchecksum = ('0000' + checksum).slice(-4)\nchecksum = checksum.toString().substring(2, 4) + checksum.toString().substring(0, 2)\n//Hpw to calculate sequenceID\nvar prefix = 'AB10' + '0400' + checksum + sequenceID\nvar data = prefix + messageBody\nAddValue('data', data);\nAddValue('sequenceNumber', sequenceID); //add 20/07\nvar commandConfigs = {\n template: \"main\",\n configs: configs\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValue(p1, p2) {\n var cvpair = {\n code: p1,\n value: p2\n };\n configs.push(cvpair);\n}\n\nfunction ascii_to_hexa(str) {\n var arr1 = [];\n for (var n = 0, l = str.length; n < l; n++) {\n var hex = Number(str.charCodeAt(n)).toString(16);\n arr1.push(hex);\n }\n return arr1.join('');\n}\n\nfunction crc16byte(s) {\n var crc = 0x0000;\n var j, i;\n for (i = 0; i < s.length; i++) {\n c = s[i];\n if (c > 255) {\n throw new RangeError();\n }\n j = (c ^ (crc >> 8)) & 0xFF;\n crc = crcTable[j] ^ (crc << 8);\n }\n return ((crc ^ 0) & 0xFFFF);\n}\n\nfunction byteStringToByteArray(str) {\n var splitStr = []\n var j = 0\n for (let i = 0; i < str.length; i += 2) {\n splitStr[j] = str.substring(i, i + 2)\n j++\n }\n var bytes = []\n var bytePos = 0\n for (let i = 0; i < splitStr.length; i++) {\n var byteStr = splitStr[i]\n var b = parseInt(byteStr, 16)\n if (b < 256) {\n bytes[bytePos] = b\n bytePos++\n }\n }\n return bytes\n}\n\nfunction decimalToHex(str) {\n hexString = str.toString(16);\n return hexString\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":true,"Order":null,"SendAttempts":2,"ProtocolActionObjects":[],"Tags":[]},{"Id":5753,"Name":"setNoDisturb","TemplateSMS":null,"Template":"<>","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":5754,"Name":"setMotionAlert","TemplateSMS":null,"Template":"<>","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":5755,"Name":"setCycle","TemplateSMS":null,"Template":"<>","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":5756,"Name":"setVoicePrompt","TemplateSMS":null,"Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\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":5757,"Name":"setGatewayNumberbySMS","TemplateSMS":"<>","Template":"<>","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":5758,"Name":"setTiltAlertSettings","TemplateSMS":null,"Template":"<>","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":5759,"Name":"setRingToneVolume","TemplateSMS":null,"Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\n 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\n 0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\n 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\n];\nvar configs = [];\nif (params.SystemSettings.Volume) {\n var volume = parseInt(params.SystemSettings.Volume);\n volume = decimalToHex(parseInt(volume));\n volume = ('00' + volume).slice(-2);\n}\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\nvar command = '02';\nvar keyLength = '02';\nvar key = '10';\nvar messageBody = command + keyLength + key + volume;\nvar checksum = byteStringToByteArray(messageBody);\nchecksum = crc16byte(checksum);\nchecksum = decimalToHex(checksum).toUpperCase();\nchecksum = ('0000' + checksum).slice(-4);\nchecksum = checksum.toString().substring(2, 4) + checksum.toString().substring(0, 2);\n//Hpw to calculate sequenceID // change to AB10 from AB18\nvar prefix = 'AB10' + '0400' + checksum + sequenceID;\nvar data = prefix + messageBody;\nAddValue('data', data);\nAddValue('sequenceNumber', sequenceID); //add 20/07\n//var commandConfigs = {\nvar commandConfigs = {\n template: \"main\",\n configs: configs\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValue(p1, p2) {\n var cvpair = {\n code: p1,\n value: p2\n };\n configs.push(cvpair);\n}\n\nfunction ascii_to_hexa(str) {\n var arr1 = [];\n for (var n = 0, l = str.length; n < l; n++) {\n var hex = Number(str.charCodeAt(n)).toString(16);\n arr1.push(hex);\n }\n return arr1.join('');\n}\n\nfunction crc16byte(s) {\n var crc = 0x0000;\n var j, i;\n for (i = 0; i < s.length; i++) {\n c = s[i];\n if (c > 255) {\n throw new RangeError();\n }\n j = (c ^ (crc >> 8)) & 0xFF;\n crc = crcTable[j] ^ (crc << 8);\n }\n return ((crc ^ 0) & 0xFFFF);\n}\n\nfunction byteStringToByteArray(str) {\n var splitStr = [];\n var j = 0;\n for (let i = 0; i < str.length; i += 2) {\n splitStr[j] = str.substring(i, i + 2)\n j++\n }\n var bytes = []\n var bytePos = 0\n for (let i = 0; i < splitStr.length; i++) {\n var byteStr = splitStr[i]\n var b = parseInt(byteStr, 16)\n if (b < 256) {\n bytes[bytePos] = b\n bytePos++\n }\n }\n return bytes\n}\n\nfunction decimalToHex(str) {\n hexString = str.toString(16);\n return hexString\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":true,"Order":null,"SendAttempts":2,"ProtocolActionObjects":[],"Tags":[]},{"Id":5760,"Name":"setPhoneSettings","TemplateSMS":null,"Template":"<>","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":5761,"Name":"getCurrentSettings5","TemplateSMS":"<>","Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n 0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\nvar msg = [];\r\nvar configs = [];\r\nvar configsSMS = [];\r\n// Contacts, APN, server details, fall sensitivity and Beacon List\r\nvar dataSMS = 'GPRS?'; // Check Server Details\r\n/*GRPS: ON\r\nAPN: internet\r\nUsername:\r\nPassword:\r\nIP: 1, www.smart-locator.com\r\nPort: 6060\r\nMove report time: 30 minutes\r\nNo move report time: 60 minutes\r\nHB: on, 20 minutes */\r\nvar data = ''; // empty\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar notSend = false;\r\nif (isForcedBySMS == 'False' && ((serverParams.CommandType == 'ByGPRS') || (serverParams.CommandType == 'Default' && ((serverParams.ParentCommandType == 'ByGPRS') || (serverParams.ParentCommandType == 'Default' && serverParams.ConfigType == 'GPRS') || (serverParams.ParentCommandType === null && serverParams.ConfigType == 'GPRS'))))) {\r\n notSend = true;\r\n}\r\n// For GPRS command\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\n// For SMS command\r\nAddValueSMS('dataSMS', dataSMS);\r\nvar commandConfigs = {\r\n template: \"main\",\r\n configs: configs,\r\n configsSMS: configsSMS,\r\n notSend: notSend\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n// functions\r\nfunction AddValue(p1, p2) {\r\n var cvpair = {\r\n code: p1,\r\n value: p2\r\n };\r\n configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n var cvpair = {\r\n code: p1,\r\n value: p2\r\n };\r\n configsSMS.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n var arr1 = [];\r\n for (var n = 0, l = str.length; n < l; n++) {\r\n var hex = Number(str.charCodeAt(n)).toString(16);\r\n arr1.push(hex);\r\n }\r\n return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n var crc = 0x0000;\r\n var j, i;\r\n for (i = 0; i < s.length; i++) {\r\n c = s[i];\r\n if (c > 255) {\r\n throw new RangeError();\r\n }\r\n j = (c ^ (crc >> 8)) & 0xFF;\r\n crc = crcTable[j] ^ (crc << 8);\r\n }\r\n return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n var splitStr = []\r\n var j = 0\r\n for (let i = 0; i < str.length; i += 2) {\r\n splitStr[j] = str.substring(i, i + 2)\r\n j++\r\n }\r\n var bytes = []\r\n var bytePos = 0\r\n for (let i = 0; i < splitStr.length; i++) {\r\n var byteStr = splitStr[i]\r\n var b = parseInt(byteStr, 16)\r\n if (b < 256) {\r\n bytes[bytePos] = b\r\n bytePos++\r\n }\r\n }\r\n return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n hexString = str.toString(16);\r\n return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n let bin = 0;\r\n let rem, i = 1,\r\n step = 1;\r\n while (x != 0) {\r\n rem = x % 2;\r\n x = parseInt(x / 2);\r\n bin = bin + rem * i;\r\n i = i * 10;\r\n }\r\n return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n var hexa = parseInt(x, 2).toString(16);\r\n return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n const result = [];\r\n let len = string.length - 2;\r\n while (len >= 0) {\r\n result.push(string.substr(len, 2));\r\n len -= 2;\r\n }\r\n return result.join('');\r\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":true,"SendingType":0,"HasAck":true,"HexString":true,"Order":21,"SendAttempts":4,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":5761,\"Name\":\"getCurrentSettings5\",\"TemplateSMS\":\"<>\",\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\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\":5765,\"Protocol\":{\"Id\":297,\"Code\":\"Access TEC Care Watch\",\"Version\":\"0.2\",\"FirmwareVersion\":\"\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"getCurrentSettings\",\"TemplateSMS\":\"<>\",\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\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 = '1A73344041424356101F44534733'; //1A73\\r\\n// Firmware Long, Contacts, APNusername, APNpass, server details, fall sensitivity and Beacon List, Fall down alert, Ring tome vol,System language, time interval, No motion alert,custom id, allow list\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\nvar command = '02';\\r\\n//var keyLength = '10'; // previous\\r\\nvar keyLength = '0F'; //+1 qnt of commands\\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' + '1100' + checksum + sequenceID; // add 2 to keylenght\\r\\nvar data = prefix + messageBody;\\r\\n// For GPRS command\\r\\nAddValue('data', data);\\r\\nAddValue('sequenceNumber', sequenceID);\\r\\n// For SMS command\\r\\nAddValueSMS('dataSMS', dataSMS);\\r\\nvar commandConfigs = {\\r\\n template: \\\"main\\\",\\r\\n configs: configs,\\r\\n configsSMS: configsSMS\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n// functions\\r\\nfunction AddValue(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n var arr1 = [];\\r\\n for (var n = 0, l = str.length; n < l; n++) {\\r\\n var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n arr1.push(hex);\\r\\n }\\r\\n return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n var crc = 0x0000;\\r\\n var j, i;\\r\\n for (i = 0; i < s.length; i++) {\\r\\n c = s[i];\\r\\n if (c > 255) {\\r\\n throw new RangeError();\\r\\n }\\r\\n j = (c ^ (crc >> 8)) & 0xFF;\\r\\n crc = crcTable[j] ^ (crc << 8);\\r\\n }\\r\\n return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n var splitStr = []\\r\\n var j = 0\\r\\n for (let i = 0; i < str.length; i += 2) {\\r\\n splitStr[j] = str.substring(i, i + 2)\\r\\n j++\\r\\n }\\r\\n var bytes = []\\r\\n var bytePos = 0\\r\\n for (let i = 0; i < splitStr.length; i++) {\\r\\n var byteStr = splitStr[i]\\r\\n var b = parseInt(byteStr, 16)\\r\\n if (b < 256) {\\r\\n bytes[bytePos] = b\\r\\n bytePos++\\r\\n }\\r\\n }\\r\\n return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n hexString = str.toString(16);\\r\\n return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n let bin = 0;\\r\\n let rem, i = 1,\\r\\n step = 1;\\r\\n while (x != 0) {\\r\\n rem = x % 2;\\r\\n x = parseInt(x / 2);\\r\\n bin = bin + rem * i;\\r\\n i = i * 10;\\r\\n }\\r\\n return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n var hexa = parseInt(x, 2).toString(16);\\r\\n return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n const result = [];\\r\\n let len = string.length - 2;\\r\\n while (len >= 0) {\\r\\n result.push(string.substr(len, 2));\\r\\n len -= 2;\\r\\n }\\r\\n return result.join('');\\r\\n}\",\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":true,\"SendAttempts\":4,\"Order\":17},\"AvoidResending\":false,\"FollowParentSentType\":true,\"SendingType\":0,\"HasAck\":true,\"HexString\":true,\"Order\":21,\"SendAttempts\":4,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1748863982}],"Tags":[]},{"Id":5762,"Name":"getCurrentSettings4","TemplateSMS":"<>","Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n 0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\nvar msg = [];\r\nvar configs = [];\r\nvar configsSMS = [];\r\n// Contacts, APN, server details, fall sensitivity and Beacon List\r\nvar dataSMS = 'A?'; // Check Contact List\r\n/* A1: 1,1,15899795842\r\nA2: 1,0,13632770106\r\nA3: 0,1,15986236978 */\r\nvar data = ''; // empty\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar notSend = false;\r\nif (isForcedBySMS == 'False' && ((serverParams.CommandType == 'ByGPRS') || (serverParams.CommandType == 'Default' && ((serverParams.ParentCommandType == 'ByGPRS') || (serverParams.ParentCommandType == 'Default' && serverParams.ConfigType == 'GPRS') || (serverParams.ParentCommandType === null && serverParams.ConfigType == 'GPRS'))))) {\r\n notSend = true;\r\n}\r\n// For GPRS command\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\n// For SMS command\r\nAddValueSMS('dataSMS', dataSMS);\r\nvar commandConfigs = {\r\n template: \"main\",\r\n configs: configs,\r\n configsSMS: configsSMS,\r\n notSend: notSend\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n// functions\r\nfunction AddValue(p1, p2) {\r\n var cvpair = {\r\n code: p1,\r\n value: p2\r\n };\r\n configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n var cvpair = {\r\n code: p1,\r\n value: p2\r\n };\r\n configsSMS.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n var arr1 = [];\r\n for (var n = 0, l = str.length; n < l; n++) {\r\n var hex = Number(str.charCodeAt(n)).toString(16);\r\n arr1.push(hex);\r\n }\r\n return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n var crc = 0x0000;\r\n var j, i;\r\n for (i = 0; i < s.length; i++) {\r\n c = s[i];\r\n if (c > 255) {\r\n throw new RangeError();\r\n }\r\n j = (c ^ (crc >> 8)) & 0xFF;\r\n crc = crcTable[j] ^ (crc << 8);\r\n }\r\n return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n var splitStr = []\r\n var j = 0\r\n for (let i = 0; i < str.length; i += 2) {\r\n splitStr[j] = str.substring(i, i + 2)\r\n j++\r\n }\r\n var bytes = []\r\n var bytePos = 0\r\n for (let i = 0; i < splitStr.length; i++) {\r\n var byteStr = splitStr[i]\r\n var b = parseInt(byteStr, 16)\r\n if (b < 256) {\r\n bytes[bytePos] = b\r\n bytePos++\r\n }\r\n }\r\n return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n hexString = str.toString(16);\r\n return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n let bin = 0;\r\n let rem, i = 1,\r\n step = 1;\r\n while (x != 0) {\r\n rem = x % 2;\r\n x = parseInt(x / 2);\r\n bin = bin + rem * i;\r\n i = i * 10;\r\n }\r\n return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n var hexa = parseInt(x, 2).toString(16);\r\n return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n const result = [];\r\n let len = string.length - 2;\r\n while (len >= 0) {\r\n result.push(string.substr(len, 2));\r\n len -= 2;\r\n }\r\n return result.join('');\r\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":true,"SendingType":0,"HasAck":true,"HexString":true,"Order":20,"SendAttempts":4,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":5762,\"Name\":\"getCurrentSettings4\",\"TemplateSMS\":\"<>\",\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\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\":5765,\"Protocol\":{\"Id\":297,\"Code\":\"Access TEC Care Watch\",\"Version\":\"0.2\",\"FirmwareVersion\":\"\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"getCurrentSettings\",\"TemplateSMS\":\"<>\",\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\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 = '1A73344041424356101F44534733'; //1A73\\r\\n// Firmware Long, Contacts, APNusername, APNpass, server details, fall sensitivity and Beacon List, Fall down alert, Ring tome vol,System language, time interval, No motion alert,custom id, allow list\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\nvar command = '02';\\r\\n//var keyLength = '10'; // previous\\r\\nvar keyLength = '0F'; //+1 qnt of commands\\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' + '1100' + checksum + sequenceID; // add 2 to keylenght\\r\\nvar data = prefix + messageBody;\\r\\n// For GPRS command\\r\\nAddValue('data', data);\\r\\nAddValue('sequenceNumber', sequenceID);\\r\\n// For SMS command\\r\\nAddValueSMS('dataSMS', dataSMS);\\r\\nvar commandConfigs = {\\r\\n template: \\\"main\\\",\\r\\n configs: configs,\\r\\n configsSMS: configsSMS\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n// functions\\r\\nfunction AddValue(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n var arr1 = [];\\r\\n for (var n = 0, l = str.length; n < l; n++) {\\r\\n var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n arr1.push(hex);\\r\\n }\\r\\n return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n var crc = 0x0000;\\r\\n var j, i;\\r\\n for (i = 0; i < s.length; i++) {\\r\\n c = s[i];\\r\\n if (c > 255) {\\r\\n throw new RangeError();\\r\\n }\\r\\n j = (c ^ (crc >> 8)) & 0xFF;\\r\\n crc = crcTable[j] ^ (crc << 8);\\r\\n }\\r\\n return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n var splitStr = []\\r\\n var j = 0\\r\\n for (let i = 0; i < str.length; i += 2) {\\r\\n splitStr[j] = str.substring(i, i + 2)\\r\\n j++\\r\\n }\\r\\n var bytes = []\\r\\n var bytePos = 0\\r\\n for (let i = 0; i < splitStr.length; i++) {\\r\\n var byteStr = splitStr[i]\\r\\n var b = parseInt(byteStr, 16)\\r\\n if (b < 256) {\\r\\n bytes[bytePos] = b\\r\\n bytePos++\\r\\n }\\r\\n }\\r\\n return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n hexString = str.toString(16);\\r\\n return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n let bin = 0;\\r\\n let rem, i = 1,\\r\\n step = 1;\\r\\n while (x != 0) {\\r\\n rem = x % 2;\\r\\n x = parseInt(x / 2);\\r\\n bin = bin + rem * i;\\r\\n i = i * 10;\\r\\n }\\r\\n return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n var hexa = parseInt(x, 2).toString(16);\\r\\n return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n const result = [];\\r\\n let len = string.length - 2;\\r\\n while (len >= 0) {\\r\\n result.push(string.substr(len, 2));\\r\\n len -= 2;\\r\\n }\\r\\n return result.join('');\\r\\n}\",\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":true,\"SendAttempts\":4,\"Order\":17},\"AvoidResending\":false,\"FollowParentSentType\":true,\"SendingType\":0,\"HasAck\":true,\"HexString\":true,\"Order\":20,\"SendAttempts\":4,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1748863968}],"Tags":[]},{"Id":5763,"Name":"getCurrentSettings3","TemplateSMS":"<>","Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n 0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\nvar msg = [];\r\nvar configs = [];\r\nvar configsSMS = [];\r\n// Contacts, APN, server details, fall sensitivity and Beacon List\r\nvar dataSMS = 'BCQ1'; // Check Beacon List\r\n/* 1,F7:37:B7:10:81:CE,office1\r\n2,C4:9F:A6:15:24:3F,office2\r\n3,D3:E3:AC:86:5E:46,office7 */\r\nvar data = ''; // empty\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar notSend = false;\r\nif (isForcedBySMS == 'False' && ((serverParams.CommandType == 'ByGPRS') || (serverParams.CommandType == 'Default' && ((serverParams.ParentCommandType == 'ByGPRS') || (serverParams.ParentCommandType == 'Default' && serverParams.ConfigType == 'GPRS') || (serverParams.ParentCommandType === null && serverParams.ConfigType == 'GPRS'))))) {\r\n notSend = true;\r\n}\r\n// For GPRS command\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\n// For SMS command\r\nAddValueSMS('dataSMS', dataSMS);\r\nvar commandConfigs = {\r\n template: \"main\",\r\n configs: configs,\r\n configsSMS: configsSMS,\r\n notSend: notSend\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n// functions\r\nfunction AddValue(p1, p2) {\r\n var cvpair = {\r\n code: p1,\r\n value: p2\r\n };\r\n configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n var cvpair = {\r\n code: p1,\r\n value: p2\r\n };\r\n configsSMS.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n var arr1 = [];\r\n for (var n = 0, l = str.length; n < l; n++) {\r\n var hex = Number(str.charCodeAt(n)).toString(16);\r\n arr1.push(hex);\r\n }\r\n return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n var crc = 0x0000;\r\n var j, i;\r\n for (i = 0; i < s.length; i++) {\r\n c = s[i];\r\n if (c > 255) {\r\n throw new RangeError();\r\n }\r\n j = (c ^ (crc >> 8)) & 0xFF;\r\n crc = crcTable[j] ^ (crc << 8);\r\n }\r\n return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n var splitStr = []\r\n var j = 0\r\n for (let i = 0; i < str.length; i += 2) {\r\n splitStr[j] = str.substring(i, i + 2)\r\n j++\r\n }\r\n var bytes = []\r\n var bytePos = 0\r\n for (let i = 0; i < splitStr.length; i++) {\r\n var byteStr = splitStr[i]\r\n var b = parseInt(byteStr, 16)\r\n if (b < 256) {\r\n bytes[bytePos] = b\r\n bytePos++\r\n }\r\n }\r\n return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n hexString = str.toString(16);\r\n return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n let bin = 0;\r\n let rem, i = 1,\r\n step = 1;\r\n while (x != 0) {\r\n rem = x % 2;\r\n x = parseInt(x / 2);\r\n bin = bin + rem * i;\r\n i = i * 10;\r\n }\r\n return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n var hexa = parseInt(x, 2).toString(16);\r\n return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n const result = [];\r\n let len = string.length - 2;\r\n while (len >= 0) {\r\n result.push(string.substr(len, 2));\r\n len -= 2;\r\n }\r\n return result.join('');\r\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":true,"SendingType":0,"HasAck":true,"HexString":true,"Order":19,"SendAttempts":4,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":5763,\"Name\":\"getCurrentSettings3\",\"TemplateSMS\":\"<>\",\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\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\":5765,\"Protocol\":{\"Id\":297,\"Code\":\"Access TEC Care Watch\",\"Version\":\"0.2\",\"FirmwareVersion\":\"\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"getCurrentSettings\",\"TemplateSMS\":\"<>\",\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\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 = '1A73344041424356101F44534733'; //1A73\\r\\n// Firmware Long, Contacts, APNusername, APNpass, server details, fall sensitivity and Beacon List, Fall down alert, Ring tome vol,System language, time interval, No motion alert,custom id, allow list\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\nvar command = '02';\\r\\n//var keyLength = '10'; // previous\\r\\nvar keyLength = '0F'; //+1 qnt of commands\\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' + '1100' + checksum + sequenceID; // add 2 to keylenght\\r\\nvar data = prefix + messageBody;\\r\\n// For GPRS command\\r\\nAddValue('data', data);\\r\\nAddValue('sequenceNumber', sequenceID);\\r\\n// For SMS command\\r\\nAddValueSMS('dataSMS', dataSMS);\\r\\nvar commandConfigs = {\\r\\n template: \\\"main\\\",\\r\\n configs: configs,\\r\\n configsSMS: configsSMS\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n// functions\\r\\nfunction AddValue(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n var arr1 = [];\\r\\n for (var n = 0, l = str.length; n < l; n++) {\\r\\n var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n arr1.push(hex);\\r\\n }\\r\\n return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n var crc = 0x0000;\\r\\n var j, i;\\r\\n for (i = 0; i < s.length; i++) {\\r\\n c = s[i];\\r\\n if (c > 255) {\\r\\n throw new RangeError();\\r\\n }\\r\\n j = (c ^ (crc >> 8)) & 0xFF;\\r\\n crc = crcTable[j] ^ (crc << 8);\\r\\n }\\r\\n return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n var splitStr = []\\r\\n var j = 0\\r\\n for (let i = 0; i < str.length; i += 2) {\\r\\n splitStr[j] = str.substring(i, i + 2)\\r\\n j++\\r\\n }\\r\\n var bytes = []\\r\\n var bytePos = 0\\r\\n for (let i = 0; i < splitStr.length; i++) {\\r\\n var byteStr = splitStr[i]\\r\\n var b = parseInt(byteStr, 16)\\r\\n if (b < 256) {\\r\\n bytes[bytePos] = b\\r\\n bytePos++\\r\\n }\\r\\n }\\r\\n return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n hexString = str.toString(16);\\r\\n return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n let bin = 0;\\r\\n let rem, i = 1,\\r\\n step = 1;\\r\\n while (x != 0) {\\r\\n rem = x % 2;\\r\\n x = parseInt(x / 2);\\r\\n bin = bin + rem * i;\\r\\n i = i * 10;\\r\\n }\\r\\n return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n var hexa = parseInt(x, 2).toString(16);\\r\\n return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n const result = [];\\r\\n let len = string.length - 2;\\r\\n while (len >= 0) {\\r\\n result.push(string.substr(len, 2));\\r\\n len -= 2;\\r\\n }\\r\\n return result.join('');\\r\\n}\",\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":true,\"SendAttempts\":4,\"Order\":17},\"AvoidResending\":false,\"FollowParentSentType\":true,\"SendingType\":0,\"HasAck\":true,\"HexString\":true,\"Order\":19,\"SendAttempts\":4,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1748863952}],"Tags":[]},{"Id":5764,"Name":"getCurrentSettings2","TemplateSMS":"<>","Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n 0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\nvar msg = [];\r\nvar configs = [];\r\nvar configsSMS = [];\r\n// Contacts, APN, server details, fall sensitivity and Beacon List\r\nvar dataSMS = 'status'; // Check fall sens (function settings)\r\n/* Mode:4,0 second\r\nLED: on\r\nBeep: on\r\nVibration: on\r\nTime zone: +10:00\r\nGEO Fence:0,0,0,0\r\nMotion alarm: off\r\nNo Motion alarm: off\r\nTilt alert: off\r\nFall alarm: on, level:5\r\nLow power alarm: on,15%\r\nSOS Call:10 minutes, loop:1 */\r\nvar data = ''; // empty\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar notSend = false;\r\nif (isForcedBySMS == 'False' && ((serverParams.CommandType == 'ByGPRS') || (serverParams.CommandType == 'Default' && ((serverParams.ParentCommandType == 'ByGPRS') || (serverParams.ParentCommandType == 'Default' && serverParams.ConfigType == 'GPRS') || (serverParams.ParentCommandType === null && serverParams.ConfigType == 'GPRS'))))) {\r\n notSend = true;\r\n}\r\n// For GPRS command\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\n// For SMS command\r\nAddValueSMS('dataSMS', dataSMS);\r\nvar commandConfigs = {\r\n template: \"main\",\r\n configs: configs,\r\n configsSMS: configsSMS,\r\n notSend: notSend\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n// functions\r\nfunction AddValue(p1, p2) {\r\n var cvpair = {\r\n code: p1,\r\n value: p2\r\n };\r\n configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n var cvpair = {\r\n code: p1,\r\n value: p2\r\n };\r\n configsSMS.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n var arr1 = [];\r\n for (var n = 0, l = str.length; n < l; n++) {\r\n var hex = Number(str.charCodeAt(n)).toString(16);\r\n arr1.push(hex);\r\n }\r\n return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n var crc = 0x0000;\r\n var j, i;\r\n for (i = 0; i < s.length; i++) {\r\n c = s[i];\r\n if (c > 255) {\r\n throw new RangeError();\r\n }\r\n j = (c ^ (crc >> 8)) & 0xFF;\r\n crc = crcTable[j] ^ (crc << 8);\r\n }\r\n return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n var splitStr = []\r\n var j = 0\r\n for (let i = 0; i < str.length; i += 2) {\r\n splitStr[j] = str.substring(i, i + 2)\r\n j++\r\n }\r\n var bytes = []\r\n var bytePos = 0\r\n for (let i = 0; i < splitStr.length; i++) {\r\n var byteStr = splitStr[i]\r\n var b = parseInt(byteStr, 16)\r\n if (b < 256) {\r\n bytes[bytePos] = b\r\n bytePos++\r\n }\r\n }\r\n return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n hexString = str.toString(16);\r\n return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n let bin = 0;\r\n let rem, i = 1,\r\n step = 1;\r\n while (x != 0) {\r\n rem = x % 2;\r\n x = parseInt(x / 2);\r\n bin = bin + rem * i;\r\n i = i * 10;\r\n }\r\n return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n var hexa = parseInt(x, 2).toString(16);\r\n return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n const result = [];\r\n let len = string.length - 2;\r\n while (len >= 0) {\r\n result.push(string.substr(len, 2));\r\n len -= 2;\r\n }\r\n return result.join('');\r\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":true,"SendingType":0,"HasAck":true,"HexString":true,"Order":18,"SendAttempts":4,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":5764,\"Name\":\"getCurrentSettings2\",\"TemplateSMS\":\"<>\",\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\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\":5765,\"Protocol\":{\"Id\":297,\"Code\":\"Access TEC Care Watch\",\"Version\":\"0.2\",\"FirmwareVersion\":\"\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"getCurrentSettings\",\"TemplateSMS\":\"<>\",\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\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 = '1A73344041424356101F44534733'; //1A73\\r\\n// Firmware Long, Contacts, APNusername, APNpass, server details, fall sensitivity and Beacon List, Fall down alert, Ring tome vol,System language, time interval, No motion alert,custom id, allow list\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\nvar command = '02';\\r\\n//var keyLength = '10'; // previous\\r\\nvar keyLength = '0F'; //+1 qnt of commands\\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' + '1100' + checksum + sequenceID; // add 2 to keylenght\\r\\nvar data = prefix + messageBody;\\r\\n// For GPRS command\\r\\nAddValue('data', data);\\r\\nAddValue('sequenceNumber', sequenceID);\\r\\n// For SMS command\\r\\nAddValueSMS('dataSMS', dataSMS);\\r\\nvar commandConfigs = {\\r\\n template: \\\"main\\\",\\r\\n configs: configs,\\r\\n configsSMS: configsSMS\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n// functions\\r\\nfunction AddValue(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n var arr1 = [];\\r\\n for (var n = 0, l = str.length; n < l; n++) {\\r\\n var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n arr1.push(hex);\\r\\n }\\r\\n return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n var crc = 0x0000;\\r\\n var j, i;\\r\\n for (i = 0; i < s.length; i++) {\\r\\n c = s[i];\\r\\n if (c > 255) {\\r\\n throw new RangeError();\\r\\n }\\r\\n j = (c ^ (crc >> 8)) & 0xFF;\\r\\n crc = crcTable[j] ^ (crc << 8);\\r\\n }\\r\\n return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n var splitStr = []\\r\\n var j = 0\\r\\n for (let i = 0; i < str.length; i += 2) {\\r\\n splitStr[j] = str.substring(i, i + 2)\\r\\n j++\\r\\n }\\r\\n var bytes = []\\r\\n var bytePos = 0\\r\\n for (let i = 0; i < splitStr.length; i++) {\\r\\n var byteStr = splitStr[i]\\r\\n var b = parseInt(byteStr, 16)\\r\\n if (b < 256) {\\r\\n bytes[bytePos] = b\\r\\n bytePos++\\r\\n }\\r\\n }\\r\\n return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n hexString = str.toString(16);\\r\\n return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n let bin = 0;\\r\\n let rem, i = 1,\\r\\n step = 1;\\r\\n while (x != 0) {\\r\\n rem = x % 2;\\r\\n x = parseInt(x / 2);\\r\\n bin = bin + rem * i;\\r\\n i = i * 10;\\r\\n }\\r\\n return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n var hexa = parseInt(x, 2).toString(16);\\r\\n return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n const result = [];\\r\\n let len = string.length - 2;\\r\\n while (len >= 0) {\\r\\n result.push(string.substr(len, 2));\\r\\n len -= 2;\\r\\n }\\r\\n return result.join('');\\r\\n}\",\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":true,\"SendAttempts\":4,\"Order\":17},\"AvoidResending\":false,\"FollowParentSentType\":true,\"SendingType\":0,\"HasAck\":true,\"HexString\":true,\"Order\":18,\"SendAttempts\":4,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1748863939}],"Tags":[]},{"Id":5766,"Name":"setServer","TemplateSMS":"<>","Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\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":[],"Tags":[]},{"Id":5767,"Name":"setGateway","TemplateSMS":"<>","Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\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 = '34';\r\nvar gateway_number = '00000000000';\r\nvar numberHex = '';\r\nvar numberLength = '00';\r\nvar nameLength = '00';\r\nvar nameHex = '';\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 nameHex = ascii_to_hexa(gateway).toUpperCase();\r\n nameLength = ('00' + decimalToHex(gateway.length)).slice(-2).toUpperCase();\r\n sosKeyLength = ('00' + decimalToHex(5 + (numberHex.length / 2) + (nameHex.length / 2))).slice(-2).toUpperCase();\r\n messageBody += sosKeyLength + key + confSOS + numberLength + numberHex + nameLength + nameHex + '00';\r\n dataSMS = `A10,0,0,${gateway_number}`; // doesn't accept SMS+ Untogle Call\r\n}\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar totalLength = ('0000' + decimalToHex(messageBody.length / 2)).slice(-4).toUpperCase();\r\ntotalLength = changeEndianness(totalLength);\r\n//totalLength = '1000'; //better to calculate it\r\nvar checksum = byteStringToByteArray(messageBody);\r\nchecksum = crc16byte(checksum);\r\nchecksum = decimalToHex(checksum);\r\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\r\nchecksum = changeEndianness(checksum);\r\nvar prefix = 'AB10' + totalLength + checksum + sequenceID;\r\nvar data = prefix + messageBody;\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\n// For SMS command\r\nAddValueSMS('dataSMS', dataSMS);\r\nvar commandConfigs = {\r\n template: \"main\",\r\n configs: configs,\r\n configsSMS: configsSMS\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n// functions\r\nfunction AddValue(p1, p2) {\r\n var cvpair = {\r\n code: p1,\r\n value: p2\r\n };\r\n configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n var cvpair = {\r\n code: p1,\r\n value: p2\r\n };\r\n configsSMS.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n var arr1 = [];\r\n for (var n = 0, l = str.length; n < l; n++) {\r\n var hex = Number(str.charCodeAt(n)).toString(16);\r\n arr1.push(hex);\r\n }\r\n return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n var crc = 0x0000;\r\n var j, i;\r\n for (i = 0; i < s.length; i++) {\r\n c = s[i];\r\n if (c > 255) {\r\n throw new RangeError();\r\n }\r\n j = (c ^ (crc >> 8)) & 0xFF;\r\n crc = crcTable[j] ^ (crc << 8);\r\n }\r\n return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n var splitStr = []\r\n var j = 0\r\n for (let i = 0; i < str.length; i += 2) {\r\n splitStr[j] = str.substring(i, i + 2)\r\n j++\r\n }\r\n var bytes = []\r\n var bytePos = 0\r\n for (let i = 0; i < splitStr.length; i++) {\r\n var byteStr = splitStr[i]\r\n var b = parseInt(byteStr, 16)\r\n if (b < 256) {\r\n bytes[bytePos] = b\r\n bytePos++\r\n }\r\n }\r\n return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n hexString = str.toString(16);\r\n return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n let bin = 0;\r\n let rem, i = 1,\r\n step = 1;\r\n while (x != 0) {\r\n rem = x % 2;\r\n x = parseInt(x / 2);\r\n bin = bin + rem * i;\r\n i = i * 10;\r\n }\r\n return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n var hexa = parseInt(x, 2).toString(16);\r\n return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n const result = [];\r\n let len = string.length - 2;\r\n while (len >= 0) {\r\n result.push(string.substr(len, 2));\r\n len -= 2;\r\n }\r\n return result.join('');\r\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":2,"HasAck":true,"HexString":true,"Order":2,"SendAttempts":4,"ProtocolActionObjects":[],"Tags":[]},{"Id":5768,"Name":"setEmergencySettings","TemplateSMS":"<>","Template":"<>","AckTemplate":null,"Operation":"//updated for EV06\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 msg = [];\r\nvar configs = [];\r\nvar configsSMS = [];\r\nvar messageBody = '02';\r\nvar key = '34';\r\nvar phone_number = '00000000000';\r\nvar numberHex = '';\r\nvar numberLength = '00';\r\nvar nameLength = '00';\r\nvar nameHex = '';\r\nvar sosKeyLength = '00';\r\n//var confFall = '1100'; // Enable, Dial\r\nvar confSOS = '10100000'; // Enable, no SMS, Toggle Call, No Sim Dialing, Contact Number 1\r\nvar dataSMS = '';\r\nif (params.AlertSettings.EmergencyNumber) {\r\n confSOS = ('00' + binaryToHex(confSOS)).slice(-2).toUpperCase();\r\n phone_number = params.AlertSettings.EmergencyNumber;\r\n numberHex = ascii_to_hexa(phone_number).toUpperCase();\r\n numberLength = ('00' + decimalToHex(phone_number.length)).slice(-2).toUpperCase();\r\n nameHex = ascii_to_hexa('Support').toUpperCase(); // Support 53 75 70 70 6F 72 74\r\n nameLength = '07'; // lenght of 'Support'\r\n sosKeyLength = ('00' + decimalToHex(5 + (numberHex.length / 2) + (nameHex.length / 2))).slice(-2).toUpperCase();\r\n messageBody += sosKeyLength + key + confSOS + numberLength + numberHex + nameLength + nameHex + '00';\r\n dataSMS = `A1,0,1,${phone_number}`;\r\n}\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar totalLength = ('0000' + decimalToHex(messageBody.length / 2)).slice(-4).toUpperCase();\r\ntotalLength = changeEndianness(totalLength);\r\n//totalLength = '1000'; //better to calculate it\r\nvar checksum = byteStringToByteArray(messageBody);\r\nchecksum = crc16byte(checksum);\r\nchecksum = decimalToHex(checksum);\r\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\r\nchecksum = changeEndianness(checksum);\r\nvar prefix = 'AB10' + totalLength + checksum + sequenceID;\r\nvar data = prefix + messageBody;\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\n// For SMS command\r\nAddValueSMS('dataSMS', dataSMS);\r\nvar commandConfigs = {\r\n template: \"main\",\r\n configs: configs,\r\n configsSMS: configsSMS\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n// functions\r\nfunction AddValue(p1, p2) {\r\n var cvpair = {\r\n code: p1,\r\n value: p2\r\n };\r\n configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n var cvpair = {\r\n code: p1,\r\n value: p2\r\n };\r\n configsSMS.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n var arr1 = [];\r\n for (var n = 0, l = str.length; n < l; n++) {\r\n var hex = Number(str.charCodeAt(n)).toString(16);\r\n arr1.push(hex);\r\n }\r\n return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n var crc = 0x0000;\r\n var j, i;\r\n for (i = 0; i < s.length; i++) {\r\n c = s[i];\r\n if (c > 255) {\r\n throw new RangeError();\r\n }\r\n j = (c ^ (crc >> 8)) & 0xFF;\r\n crc = crcTable[j] ^ (crc << 8);\r\n }\r\n return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n var splitStr = []\r\n var j = 0\r\n for (let i = 0; i < str.length; i += 2) {\r\n splitStr[j] = str.substring(i, i + 2)\r\n j++\r\n }\r\n var bytes = []\r\n var bytePos = 0\r\n for (let i = 0; i < splitStr.length; i++) {\r\n var byteStr = splitStr[i]\r\n var b = parseInt(byteStr, 16)\r\n if (b < 256) {\r\n bytes[bytePos] = b\r\n bytePos++\r\n }\r\n }\r\n return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n hexString = str.toString(16);\r\n return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n let bin = 0;\r\n let rem, i = 1,\r\n step = 1;\r\n while (x != 0) {\r\n rem = x % 2;\r\n x = parseInt(x / 2);\r\n bin = bin + rem * i;\r\n i = i * 10;\r\n }\r\n return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n var hexa = parseInt(x, 2).toString(16);\r\n return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n const result = [];\r\n let len = string.length - 2;\r\n while (len >= 0) {\r\n result.push(string.substr(len, 2));\r\n len -= 2;\r\n }\r\n return result.join('');\r\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":true,"Order":3,"SendAttempts":4,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":5768,\"Name\":\"setEmergencySettings\",\"TemplateSMS\":\"<>\",\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"//updated for EV06\\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 msg = [];\\r\\nvar configs = [];\\r\\nvar configsSMS = [];\\r\\nvar messageBody = '02';\\r\\nvar key = '34';\\r\\nvar phone_number = '00000000000';\\r\\nvar numberHex = '';\\r\\nvar numberLength = '00';\\r\\nvar nameLength = '00';\\r\\nvar nameHex = '';\\r\\nvar sosKeyLength = '00';\\r\\n//var confFall = '1100'; // Enable, Dial\\r\\nvar confSOS = '10100000'; // Enable, no SMS, Toggle Call, No Sim Dialing, Contact Number 1\\r\\nvar dataSMS = '';\\r\\nif (params.AlertSettings.EmergencyNumber) {\\r\\n confSOS = ('00' + binaryToHex(confSOS)).slice(-2).toUpperCase();\\r\\n phone_number = params.AlertSettings.EmergencyNumber;\\r\\n numberHex = ascii_to_hexa(phone_number).toUpperCase();\\r\\n numberLength = ('00' + decimalToHex(phone_number.length)).slice(-2).toUpperCase();\\r\\n nameHex = ascii_to_hexa('SOS Info').toUpperCase(); // 53 4F 53 20 49 6E 66 6F\\r\\n nameLength = '08'; // lenght of 'SOS Info'\\r\\n sosKeyLength = ('00' + decimalToHex(5 + (numberHex.length / 2) + (nameHex.length / 2))).slice(-2).toUpperCase();\\r\\n messageBody += sosKeyLength + key + confSOS + numberLength + numberHex + nameLength + nameHex + '00';\\r\\n dataSMS = `A1,0,1,${phone_number}`;\\r\\n}\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\nvar totalLength = ('0000' + decimalToHex(messageBody.length / 2)).slice(-4).toUpperCase();\\r\\ntotalLength = changeEndianness(totalLength);\\r\\n//totalLength = '1000'; //better to calculate it\\r\\nvar checksum = byteStringToByteArray(messageBody);\\r\\nchecksum = crc16byte(checksum);\\r\\nchecksum = decimalToHex(checksum);\\r\\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\\r\\nchecksum = changeEndianness(checksum);\\r\\nvar prefix = 'AB10' + totalLength + checksum + sequenceID;\\r\\nvar data = prefix + messageBody;\\r\\nAddValue('data', data);\\r\\nAddValue('sequenceNumber', sequenceID);\\r\\n// For SMS command\\r\\nAddValueSMS('dataSMS', dataSMS);\\r\\nvar commandConfigs = {\\r\\n template: \\\"main\\\",\\r\\n configs: configs,\\r\\n configsSMS: configsSMS\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n// functions\\r\\nfunction AddValue(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n var arr1 = [];\\r\\n for (var n = 0, l = str.length; n < l; n++) {\\r\\n var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n arr1.push(hex);\\r\\n }\\r\\n return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n var crc = 0x0000;\\r\\n var j, i;\\r\\n for (i = 0; i < s.length; i++) {\\r\\n c = s[i];\\r\\n if (c > 255) {\\r\\n throw new RangeError();\\r\\n }\\r\\n j = (c ^ (crc >> 8)) & 0xFF;\\r\\n crc = crcTable[j] ^ (crc << 8);\\r\\n }\\r\\n return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n var splitStr = []\\r\\n var j = 0\\r\\n for (let i = 0; i < str.length; i += 2) {\\r\\n splitStr[j] = str.substring(i, i + 2)\\r\\n j++\\r\\n }\\r\\n var bytes = []\\r\\n var bytePos = 0\\r\\n for (let i = 0; i < splitStr.length; i++) {\\r\\n var byteStr = splitStr[i]\\r\\n var b = parseInt(byteStr, 16)\\r\\n if (b < 256) {\\r\\n bytes[bytePos] = b\\r\\n bytePos++\\r\\n }\\r\\n }\\r\\n return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n hexString = str.toString(16);\\r\\n return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n let bin = 0;\\r\\n let rem, i = 1,\\r\\n step = 1;\\r\\n while (x != 0) {\\r\\n rem = x % 2;\\r\\n x = parseInt(x / 2);\\r\\n bin = bin + rem * i;\\r\\n i = i * 10;\\r\\n }\\r\\n return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n var hexa = parseInt(x, 2).toString(16);\\r\\n return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n const result = [];\\r\\n let len = string.length - 2;\\r\\n while (len >= 0) {\\r\\n result.push(string.substr(len, 2));\\r\\n len -= 2;\\r\\n }\\r\\n return result.join('');\\r\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":true,\"Order\":3,\"SendAttempts\":4,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1748622805},{"Type":1,"NewValue":"{\"Id\":5768,\"Name\":\"setEmergencySettings\",\"TemplateSMS\":\"<>\",\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"//updated for EV06\\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 msg = [];\\r\\nvar configs = [];\\r\\nvar configsSMS = [];\\r\\nvar messageBody = '02';\\r\\nvar key = '34';\\r\\nvar phone_number = '00000000000';\\r\\nvar numberHex = '';\\r\\nvar numberLength = '00';\\r\\nvar nameLength = '00';\\r\\nvar nameHex = '';\\r\\nvar sosKeyLength = '00';\\r\\n//var confFall = '1100'; // Enable, Dial\\r\\nvar confSOS = '10100000'; // Enable, no SMS, Toggle Call, No Sim Dialing, Contact Number 1\\r\\nvar dataSMS = '';\\r\\nif (params.AlertSettings.EmergencyNumber) {\\r\\n confSOS = ('00' + binaryToHex(confSOS)).slice(-2).toUpperCase();\\r\\n phone_number = params.AlertSettings.EmergencyNumber;\\r\\n numberHex = ascii_to_hexa(phone_number).toUpperCase();\\r\\n numberLength = ('00' + decimalToHex(phone_number.length)).slice(-2).toUpperCase();\\r\\n nameHex = ascii_to_hexa('SOS').toUpperCase(); // 53 4F 53\\r\\n nameLength = '03'; // lenght of 'SOS'\\r\\n sosKeyLength = ('00' + decimalToHex(5 + (numberHex.length / 2) + (nameHex.length / 2))).slice(-2).toUpperCase();\\r\\n messageBody += sosKeyLength + key + confSOS + numberLength + numberHex + nameLength + nameHex + '00';\\r\\n dataSMS = `A1,0,1,${phone_number}`;\\r\\n}\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\nvar totalLength = ('0000' + decimalToHex(messageBody.length / 2)).slice(-4).toUpperCase();\\r\\ntotalLength = changeEndianness(totalLength);\\r\\n//totalLength = '1000'; //better to calculate it\\r\\nvar checksum = byteStringToByteArray(messageBody);\\r\\nchecksum = crc16byte(checksum);\\r\\nchecksum = decimalToHex(checksum);\\r\\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\\r\\nchecksum = changeEndianness(checksum);\\r\\nvar prefix = 'AB10' + totalLength + checksum + sequenceID;\\r\\nvar data = prefix + messageBody;\\r\\nAddValue('data', data);\\r\\nAddValue('sequenceNumber', sequenceID);\\r\\n// For SMS command\\r\\nAddValueSMS('dataSMS', dataSMS);\\r\\nvar commandConfigs = {\\r\\n template: \\\"main\\\",\\r\\n configs: configs,\\r\\n configsSMS: configsSMS\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n// functions\\r\\nfunction AddValue(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n var arr1 = [];\\r\\n for (var n = 0, l = str.length; n < l; n++) {\\r\\n var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n arr1.push(hex);\\r\\n }\\r\\n return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n var crc = 0x0000;\\r\\n var j, i;\\r\\n for (i = 0; i < s.length; i++) {\\r\\n c = s[i];\\r\\n if (c > 255) {\\r\\n throw new RangeError();\\r\\n }\\r\\n j = (c ^ (crc >> 8)) & 0xFF;\\r\\n crc = crcTable[j] ^ (crc << 8);\\r\\n }\\r\\n return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n var splitStr = []\\r\\n var j = 0\\r\\n for (let i = 0; i < str.length; i += 2) {\\r\\n splitStr[j] = str.substring(i, i + 2)\\r\\n j++\\r\\n }\\r\\n var bytes = []\\r\\n var bytePos = 0\\r\\n for (let i = 0; i < splitStr.length; i++) {\\r\\n var byteStr = splitStr[i]\\r\\n var b = parseInt(byteStr, 16)\\r\\n if (b < 256) {\\r\\n bytes[bytePos] = b\\r\\n bytePos++\\r\\n }\\r\\n }\\r\\n return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n hexString = str.toString(16);\\r\\n return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n let bin = 0;\\r\\n let rem, i = 1,\\r\\n step = 1;\\r\\n while (x != 0) {\\r\\n rem = x % 2;\\r\\n x = parseInt(x / 2);\\r\\n bin = bin + rem * i;\\r\\n i = i * 10;\\r\\n }\\r\\n return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n var hexa = parseInt(x, 2).toString(16);\\r\\n return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n const result = [];\\r\\n let len = string.length - 2;\\r\\n while (len >= 0) {\\r\\n result.push(string.substr(len, 2));\\r\\n len -= 2;\\r\\n }\\r\\n return result.join('');\\r\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":true,\"Order\":3,\"SendAttempts\":4,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1748938524},{"Type":1,"NewValue":"{\"Id\":5768,\"Name\":\"setEmergencySettings\",\"TemplateSMS\":\"<>\",\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"//updated for EV06\\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 msg = [];\\r\\nvar configs = [];\\r\\nvar configsSMS = [];\\r\\nvar messageBody = '02';\\r\\nvar key = '34';\\r\\nvar phone_number = '00000000000';\\r\\nvar numberHex = '';\\r\\nvar numberLength = '00';\\r\\nvar nameLength = '00';\\r\\nvar nameHex = '';\\r\\nvar sosKeyLength = '00';\\r\\n//var confFall = '1100'; // Enable, Dial\\r\\nvar confSOS = '10100000'; // Enable, no SMS, Toggle Call, No Sim Dialing, Contact Number 1\\r\\nvar dataSMS = '';\\r\\nif (params.AlertSettings.EmergencyNumber) {\\r\\n confSOS = ('00' + binaryToHex(confSOS)).slice(-2).toUpperCase();\\r\\n phone_number = params.AlertSettings.EmergencyNumber;\\r\\n if (phone_number.startsWith(\\\"+\\\")) {\\r\\n phone_number = \\\"00\\\" + phone_number.substring(1);\\r\\n }\\r\\n numberHex = ascii_to_hexa(phone_number).toUpperCase();\\r\\n numberLength = ('00' + decimalToHex(phone_number.length)).slice(-2).toUpperCase();\\r\\n nameHex = ascii_to_hexa('SOS').toUpperCase(); // 53 4F 53\\r\\n nameLength = '03'; // lenght of 'SOS'\\r\\n sosKeyLength = ('00' + decimalToHex(5 + (numberHex.length / 2) + (nameHex.length / 2))).slice(-2).toUpperCase();\\r\\n messageBody += sosKeyLength + key + confSOS + numberLength + numberHex + nameLength + nameHex + '00';\\r\\n dataSMS = `A1,0,1,${phone_number}`;\\r\\n}\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\nvar totalLength = ('0000' + decimalToHex(messageBody.length / 2)).slice(-4).toUpperCase();\\r\\ntotalLength = changeEndianness(totalLength);\\r\\n//totalLength = '1000'; //better to calculate it\\r\\nvar checksum = byteStringToByteArray(messageBody);\\r\\nchecksum = crc16byte(checksum);\\r\\nchecksum = decimalToHex(checksum);\\r\\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\\r\\nchecksum = changeEndianness(checksum);\\r\\nvar prefix = 'AB10' + totalLength + checksum + sequenceID;\\r\\nvar data = prefix + messageBody;\\r\\nAddValue('data', data);\\r\\nAddValue('sequenceNumber', sequenceID);\\r\\n// For SMS command\\r\\nAddValueSMS('dataSMS', dataSMS);\\r\\nvar commandConfigs = {\\r\\n template: \\\"main\\\",\\r\\n configs: configs,\\r\\n configsSMS: configsSMS\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n// functions\\r\\nfunction AddValue(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n var arr1 = [];\\r\\n for (var n = 0, l = str.length; n < l; n++) {\\r\\n var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n arr1.push(hex);\\r\\n }\\r\\n return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n var crc = 0x0000;\\r\\n var j, i;\\r\\n for (i = 0; i < s.length; i++) {\\r\\n c = s[i];\\r\\n if (c > 255) {\\r\\n throw new RangeError();\\r\\n }\\r\\n j = (c ^ (crc >> 8)) & 0xFF;\\r\\n crc = crcTable[j] ^ (crc << 8);\\r\\n }\\r\\n return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n var splitStr = []\\r\\n var j = 0\\r\\n for (let i = 0; i < str.length; i += 2) {\\r\\n splitStr[j] = str.substring(i, i + 2)\\r\\n j++\\r\\n }\\r\\n var bytes = []\\r\\n var bytePos = 0\\r\\n for (let i = 0; i < splitStr.length; i++) {\\r\\n var byteStr = splitStr[i]\\r\\n var b = parseInt(byteStr, 16)\\r\\n if (b < 256) {\\r\\n bytes[bytePos] = b\\r\\n bytePos++\\r\\n }\\r\\n }\\r\\n return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n hexString = str.toString(16);\\r\\n return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n let bin = 0;\\r\\n let rem, i = 1,\\r\\n step = 1;\\r\\n while (x != 0) {\\r\\n rem = x % 2;\\r\\n x = parseInt(x / 2);\\r\\n bin = bin + rem * i;\\r\\n i = i * 10;\\r\\n }\\r\\n return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n var hexa = parseInt(x, 2).toString(16);\\r\\n return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n const result = [];\\r\\n let len = string.length - 2;\\r\\n while (len >= 0) {\\r\\n result.push(string.substr(len, 2));\\r\\n len -= 2;\\r\\n }\\r\\n return result.join('');\\r\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":true,\"Order\":3,\"SendAttempts\":4,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1752596355}],"Tags":[]},{"Id":5770,"Name":"actionTrace","TemplateSMS":"<>","Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\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":[],"Tags":[]},{"Id":5771,"Name":"actionPowerOff","TemplateSMS":"<>","Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n 0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\nvar configs = [];\r\nvar configsSMS = [];\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar command = '04';\r\nvar keyLength = '01';\r\nvar key = '14';\r\nvar messageBody = command + keyLength + key;\r\nvar checksum = byteStringToByteArray(messageBody);\r\nchecksum = crc16byte(checksum);\r\nchecksum = decimalToHex(checksum).toUpperCase();\r\nchecksum = ('0000' + checksum).slice(-4);\r\nchecksum = checksum.toString().substring(2, 4) + checksum.toString().substring(0, 2);\r\nvar prefix = 'AB10' + '0300' + checksum + sequenceID;\r\nvar data = prefix + messageBody;\r\n// For GPRS command\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\n// For SMS command\r\nvar dataSMS = 'off';\r\nAddValueSMS('dataSMS', dataSMS);\r\nvar commandConfigs = {\r\n template: \"main\",\r\n configs: configs,\r\n configsSMS: configsSMS\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n\r\nfunction AddValue(p1, p2) {\r\n var cvpair = {\r\n code: p1,\r\n value: p2\r\n };\r\n configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n var cvpair = {\r\n code: p1,\r\n value: p2\r\n };\r\n configsSMS.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n var arr1 = [];\r\n for (var n = 0, l = str.length; n < l; n++) {\r\n var hex = Number(str.charCodeAt(n)).toString(16);\r\n arr1.push(hex);\r\n }\r\n return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n var crc = 0x0000;\r\n var j, i;\r\n for (i = 0; i < s.length; i++) {\r\n c = s[i];\r\n if (c > 255) {\r\n throw new RangeError();\r\n }\r\n j = (c ^ (crc >> 8)) & 0xFF;\r\n crc = crcTable[j] ^ (crc << 8);\r\n }\r\n return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n var splitStr = [];\r\n var j = 0;\r\n for (let i = 0; i < str.length; i += 2) {\r\n splitStr[j] = str.substring(i, i + 2);\r\n j++;\r\n }\r\n var bytes = [];\r\n var bytePos = 0;\r\n for (let i = 0; i < splitStr.length; i++) {\r\n var byteStr = splitStr[i];\r\n var b = parseInt(byteStr, 16);\r\n if (b < 256) {\r\n bytes[bytePos] = b;\r\n bytePos++;\r\n }\r\n }\r\n return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n hexString = str.toString(16);\r\n return hexString\r\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":2,"HasAck":true,"HexString":true,"Order":14,"SendAttempts":4,"ProtocolActionObjects":[],"Tags":[]},{"Id":5772,"Name":"actionDeleteRecords","TemplateSMS":"<>","Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\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":[],"Tags":[]},{"Id":5773,"Name":"actionFactoryReset","TemplateSMS":"<>","Template":"<>","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 = 'ineedtoresetEV06A!'; // ticket 604747\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":3,"HasAck":true,"HexString":true,"Order":15,"SendAttempts":4,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":5773,\"Name\":\"actionFactoryReset\",\"TemplateSMS\":\"\",\"Template\":\"<>\",\"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 = 'ineedtoresetEV06A!'; // ticket 604747\\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\":3,\"HasAck\":false,\"HexString\":true,\"Order\":15,\"SendAttempts\":4,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1748537885},{"Type":1,"NewValue":"{\"Id\":5773,\"Name\":\"actionFactoryReset\",\"TemplateSMS\":\"\",\"Template\":\"<>\",\"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 = 'ineedtoresetEV06A!'; // ticket 604747\\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\":3,\"HasAck\":false,\"HexString\":true,\"Order\":15,\"SendAttempts\":4,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1748537902},{"Type":1,"NewValue":"{\"Id\":5773,\"Name\":\"actionFactoryReset\",\"TemplateSMS\":\"\",\"Template\":\"<>\",\"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 = 'ineedtoresetEV06A!'; // ticket 604747\\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\":3,\"HasAck\":false,\"HexString\":true,\"Order\":15,\"SendAttempts\":4,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1748537937},{"Type":1,"NewValue":"{\"Id\":5773,\"Name\":\"actionFactoryReset\",\"TemplateSMS\":\"\",\"Template\":\"<>\",\"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 = 'ineedtoresetEV06A!'; // ticket 604747\\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\":3,\"HasAck\":true,\"HexString\":true,\"Order\":15,\"SendAttempts\":4,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1748538097},{"Type":1,"NewValue":"{\"Id\":5773,\"Name\":\"actionFactoryReset\",\"TemplateSMS\":\"<>\",\"Template\":\"<>\",\"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 = 'ineedtoresetEV06A!'; // ticket 604747\\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\":3,\"HasAck\":false,\"HexString\":true,\"Order\":15,\"SendAttempts\":4,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1748538116},{"Type":1,"NewValue":"{\"Id\":5773,\"Name\":\"actionFactoryReset\",\"TemplateSMS\":\"<>\",\"Template\":\"<>\",\"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 = 'ineedtoresetEV06A!'; // ticket 604747\\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\":3,\"HasAck\":false,\"HexString\":true,\"Order\":15,\"SendAttempts\":4,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1748547976},{"Type":1,"NewValue":"{\"Id\":5773,\"Name\":\"actionFactoryReset\",\"TemplateSMS\":\"\",\"Template\":\"<>\",\"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 = 'ineedtoresetEV06A!'; // ticket 604747\\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\":3,\"HasAck\":false,\"HexString\":true,\"Order\":15,\"SendAttempts\":4,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1748623419},{"Type":1,"NewValue":"{\"Id\":5773,\"Name\":\"actionFactoryReset\",\"TemplateSMS\":\"<>\",\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\n 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\\n 0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\\n 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\n];\\nvar configs = [];\\nvar configsSMS = [];\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\nvar command = '04';\\nvar keyLength = '01';\\nvar key = '11';\\nvar messageBody = command + keyLength + key;\\nvar checksum = byteStringToByteArray(messageBody);\\nchecksum = crc16byte(checksum);\\nchecksum = decimalToHex(checksum).toUpperCase();\\nchecksum = ('0000' + checksum).slice(-4);\\nchecksum = checksum.toString().substring(2, 4) + checksum.toString().substring(0, 2);\\nvar prefix = 'AB10' + '0300' + checksum + sequenceID;\\nvar data = prefix + messageBody;\\n// For GPRS command\\nAddValue('data', data);\\nAddValue('sequenceNumber', sequenceID);\\n// For SMS command\\nvar dataSMS = 'INEEDTORESETEV-06A!'; // ticket 604747\\nAddValueSMS('dataSMS', dataSMS);\\nvar commandConfigs = {\\n template: \\\"main\\\",\\n configs: configs,\\n configsSMS: configsSMS\\n};\\nmsg.push(JSON.stringify(commandConfigs));\\n\\nfunction AddValue(p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configs.push(cvpair);\\n}\\n\\nfunction AddValueSMS(p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configsSMS.push(cvpair);\\n}\\n\\nfunction ascii_to_hexa(str) {\\n var arr1 = [];\\n for (var n = 0, l = str.length; n < l; n++) {\\n var hex = Number(str.charCodeAt(n)).toString(16);\\n arr1.push(hex);\\n }\\n return arr1.join('');\\n}\\n\\nfunction crc16byte(s) {\\n var crc = 0x0000;\\n var j, i;\\n for (i = 0; i < s.length; i++) {\\n c = s[i];\\n if (c > 255) {\\n throw new RangeError();\\n }\\n j = (c ^ (crc >> 8)) & 0xFF;\\n crc = crcTable[j] ^ (crc << 8);\\n }\\n return ((crc ^ 0) & 0xFFFF);\\n}\\n\\nfunction byteStringToByteArray(str) {\\n var splitStr = []\\n var j = 0\\n for (let i = 0; i < str.length; i += 2) {\\n splitStr[j] = str.substring(i, i + 2)\\n j++\\n }\\n var bytes = []\\n var bytePos = 0\\n for (let i = 0; i < splitStr.length; i++) {\\n var byteStr = splitStr[i]\\n var b = parseInt(byteStr, 16)\\n if (b < 256) {\\n bytes[bytePos] = b\\n bytePos++\\n }\\n }\\n return bytes\\n}\\n\\nfunction decimalToHex(str) {\\n hexString = str.toString(16);\\n return hexString\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":false,\"HexString\":true,\"Order\":15,\"SendAttempts\":4,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1749193448},{"Type":1,"NewValue":"{\"Id\":5773,\"Name\":\"actionFactoryReset\",\"TemplateSMS\":\"<>\",\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\n 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\\n 0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\\n 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\n];\\nvar configs = [];\\nvar configsSMS = [];\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\nvar command = '04';\\nvar keyLength = '01';\\nvar key = '11';\\nvar messageBody = command + keyLength + key;\\nvar checksum = byteStringToByteArray(messageBody);\\nchecksum = crc16byte(checksum);\\nchecksum = decimalToHex(checksum).toUpperCase();\\nchecksum = ('0000' + checksum).slice(-4);\\nchecksum = checksum.toString().substring(2, 4) + checksum.toString().substring(0, 2);\\nvar prefix = 'AB10' + '0300' + checksum + sequenceID;\\nvar data = prefix + messageBody;\\n// For GPRS command\\nAddValue('data', data);\\nAddValue('sequenceNumber', sequenceID);\\n// For SMS command\\nvar dataSMS = 'INEEDTORESETEV-06A!'; // ticket 604747\\nAddValueSMS('dataSMS', dataSMS);\\nvar commandConfigs = {\\n template: \\\"main\\\",\\n configs: configs,\\n configsSMS: configsSMS\\n};\\nmsg.push(JSON.stringify(commandConfigs));\\n\\nfunction AddValue(p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configs.push(cvpair);\\n}\\n\\nfunction AddValueSMS(p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configsSMS.push(cvpair);\\n}\\n\\nfunction ascii_to_hexa(str) {\\n var arr1 = [];\\n for (var n = 0, l = str.length; n < l; n++) {\\n var hex = Number(str.charCodeAt(n)).toString(16);\\n arr1.push(hex);\\n }\\n return arr1.join('');\\n}\\n\\nfunction crc16byte(s) {\\n var crc = 0x0000;\\n var j, i;\\n for (i = 0; i < s.length; i++) {\\n c = s[i];\\n if (c > 255) {\\n throw new RangeError();\\n }\\n j = (c ^ (crc >> 8)) & 0xFF;\\n crc = crcTable[j] ^ (crc << 8);\\n }\\n return ((crc ^ 0) & 0xFFFF);\\n}\\n\\nfunction byteStringToByteArray(str) {\\n var splitStr = []\\n var j = 0\\n for (let i = 0; i < str.length; i += 2) {\\n splitStr[j] = str.substring(i, i + 2)\\n j++\\n }\\n var bytes = []\\n var bytePos = 0\\n for (let i = 0; i < splitStr.length; i++) {\\n var byteStr = splitStr[i]\\n var b = parseInt(byteStr, 16)\\n if (b < 256) {\\n bytes[bytePos] = b\\n bytePos++\\n }\\n }\\n return bytes\\n}\\n\\nfunction decimalToHex(str) {\\n hexString = str.toString(16);\\n return hexString\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":2,\"HasAck\":true,\"HexString\":true,\"Order\":15,\"SendAttempts\":4,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1749211988}],"Tags":[]},{"Id":5774,"Name":"setSMSPrefix","TemplateSMS":null,"Template":"<>","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":5775,"Name":"actionRequestLocation","TemplateSMS":null,"Template":"<>","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":5776,"Name":"setWelfareCheck","TemplateSMS":null,"Template":"<>","AckTemplate":null,"Operation":"var configs = [];\r\nvar crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n 0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\n//create the bit table to use with control\r\nvar value = '';\r\nvar value2 = '';\r\nif (params.WelfareCheck.EnableDisableWelfareCheck == 'true') {\r\n value += '1';\r\n var time = params.WelfareCheck.CheckTime * 60; //in minutes\r\n value += ('0000000000000000000000000000000' + decimalToBinary(parseInt(time))).slice(-31);\r\n} else {\r\n value += ('0000000000000000000000000000000' + decimalToBinary(parseInt(3600))).slice(-31); //default\r\n}\r\nvalue = ('00000000' + binaryToHex(value)).slice(-8).toUpperCase();\r\nvalue = changeEndianness(value);\r\nif (params.WelfareCheck.DialWarningTime == 'true') {\r\n value2 += '1';\r\n var time = params.WelfareCheck.WarningTime * 60; //in minutes\r\n value2 += ('0000000000000000000000000000000' + decimalToBinary(parseInt(time))).slice(-31);\r\n} else {\r\n value2 += ('0000000000000000000000000000000' + decimalToBinary(parseInt(300))).slice(-31); // default\r\n}\r\nvalue2 = ('00000000' + binaryToHex(value2)).slice(-8).toUpperCase();\r\nvalue2 = changeEndianness(value2);\r\n// join both msg\r\nvalue += value2;\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar command = '02';\r\nvar keyLength = '09';\r\nvar key = '57';\r\nvar totalLenght = '0B00';\r\nif (params.DeviceVersion.DeviceVersion == '2') { // command not for watch so mic to 10\r\n command = '02';\r\n keyLength = '02';\r\n key = '11';\r\n value = '10';\r\n totalLenght = '0400';\r\n}\r\nvar messageBody = command + keyLength + key + value;\r\nvar checksum = byteStringToByteArray(messageBody);\r\nchecksum = crc16byte(checksum);\r\nchecksum = decimalToHex(checksum);\r\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\r\nchecksum = checksum.toString().substring(2, 4) + checksum.toString().substring(0, 2);\r\nvar prefix = 'AB10' + totalLenght + checksum + sequenceID;\r\nvar data = prefix + messageBody;\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\nvar commandConfigs = {\r\n template: \"main\",\r\n configs: configs\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n\r\nfunction AddValue(p1, p2) {\r\n var cvpair = {\r\n code: p1,\r\n value: p2\r\n };\r\n configs.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n var arr1 = [];\r\n for (var n = 0, l = str.length; n < l; n++) {\r\n var hex = Number(str.charCodeAt(n)).toString(16);\r\n arr1.push(hex);\r\n }\r\n return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n var crc = 0x0000;\r\n var j, i;\r\n for (i = 0; i < s.length; i++) {\r\n c = s[i];\r\n if (c > 255) {\r\n throw new RangeError();\r\n }\r\n j = (c ^ (crc >> 8)) & 0xFF;\r\n crc = crcTable[j] ^ (crc << 8);\r\n }\r\n return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n var splitStr = [];\r\n var j = 0;\r\n for (let i = 0; i < str.length; i += 2) {\r\n splitStr[j] = str.substring(i, i + 2);\r\n j++;\r\n }\r\n var bytes = [];\r\n var bytePos = 0;\r\n for (let i = 0; i < splitStr.length; i++) {\r\n var byteStr = splitStr[i];\r\n var b = parseInt(byteStr, 16);\r\n if (b < 256) {\r\n bytes[bytePos] = b;\r\n bytePos++;\r\n }\r\n }\r\n return bytes;\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n hexString = str.toString(16);\r\n return hexString;\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n let bin = 0;\r\n let rem, i = 1,\r\n step = 1;\r\n while (x !== 0) {\r\n rem = x % 2;\r\n x = parseInt(x / 2);\r\n bin = bin + rem * i;\r\n i = i * 10;\r\n }\r\n return bin;\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n var hexa = parseInt(x, 2).toString(16);\r\n return hexa;\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n const result = [];\r\n let len = string.length - 2;\r\n while (len >= 0) {\r\n result.push(string.substr(len, 2));\r\n len -= 2;\r\n }\r\n return result.join('');\r\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":true,"Order":null,"SendAttempts":4,"ProtocolActionObjects":[],"Tags":[]},{"Id":5777,"Name":"setAPN","TemplateSMS":"<>","Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\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":[],"Tags":[]},{"Id":5778,"Name":"getAPN","TemplateSMS":null,"Template":"<>","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":5779,"Name":"actionRealTimeLocation","TemplateSMS":"<>","Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n 0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\nvar configs = [];\r\nvar configsSMS = [];\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar command = '01';\r\nvar key = '12';\r\nvar totalLenght = '0300';\r\nvar keyLength = '01';\r\nvar messageBody = command + keyLength + key;\r\nvar checksum = byteStringToByteArray(messageBody);\r\nchecksum = crc16byte(checksum);\r\nchecksum = decimalToHex(checksum);\r\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\r\nchecksum = changeEndianness(checksum);\r\nvar prefix = 'AB10' + totalLenght + checksum + sequenceID;\r\nvar data = prefix + messageBody;\r\n// For GPRS command\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\n// For SMS command\r\n/* Answer from the device\r\nGPS Loc!\r\nNow:\r\nLoc Time:07/04/2021 17:36:44\r\nSpeed:0km/h\r\nAltitude:97.0\r\nBattery:57%\r\nwww.google.com/maps?q=22.6537233,114.0006070\r\n*/\r\nvar dataSMS = 'loc';\r\nAddValueSMS('dataSMS', dataSMS);\r\nvar commandConfigs = {\r\n template: \"main\",\r\n configs: configs,\r\n configsSMS: configsSMS\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n\r\nfunction AddValue(p1, p2) {\r\n var cvpair = {\r\n code: p1,\r\n value: p2\r\n };\r\n configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n var cvpair = {\r\n code: p1,\r\n value: p2\r\n };\r\n configsSMS.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n var arr1 = [];\r\n for (var n = 0, l = str.length; n < l; n++) {\r\n var hex = Number(str.charCodeAt(n)).toString(16);\r\n arr1.push(hex);\r\n }\r\n return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n var crc = 0x0000;\r\n var j, i;\r\n for (i = 0; i < s.length; i++) {\r\n c = s[i];\r\n if (c > 255) {\r\n throw new RangeError();\r\n }\r\n j = (c ^ (crc >> 8)) & 0xFF;\r\n crc = crcTable[j] ^ (crc << 8);\r\n }\r\n return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n var splitStr = []\r\n var j = 0\r\n for (let i = 0; i < str.length; i += 2) {\r\n splitStr[j] = str.substring(i, i + 2)\r\n j++\r\n }\r\n var bytes = []\r\n var bytePos = 0\r\n for (let i = 0; i < splitStr.length; i++) {\r\n var byteStr = splitStr[i]\r\n var b = parseInt(byteStr, 16)\r\n if (b < 256) {\r\n bytes[bytePos] = b\r\n bytePos++\r\n }\r\n }\r\n return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n hexString = str.toString(16);\r\n return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n let bin = 0;\r\n let rem, i = 1,\r\n step = 1;\r\n while (x != 0) {\r\n rem = x % 2;\r\n x = parseInt(x / 2);\r\n bin = bin + rem * i;\r\n i = i * 10;\r\n }\r\n return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n var hexa = parseInt(x, 2).toString(16);\r\n return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n const result = [];\r\n let len = string.length - 2;\r\n while (len >= 0) {\r\n result.push(string.substr(len, 2));\r\n len -= 2;\r\n }\r\n return result.join('');\r\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":2,"HasAck":true,"HexString":true,"Order":10,"SendAttempts":4,"ProtocolActionObjects":[],"Tags":[]},{"Id":5780,"Name":"actionConfigurationMode","TemplateSMS":null,"Template":"<>","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":5781,"Name":"setSOSNumber","TemplateSMS":null,"Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\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":5782,"Name":"getServer","TemplateSMS":null,"Template":"<>","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":5783,"Name":"setMicVolume","TemplateSMS":null,"Template":"<>","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":5784,"Name":"setPowerAlert","TemplateSMS":null,"Template":"<>","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":[],"Tags":[]},{"Id":5785,"Name":"actionInitializeMileage","TemplateSMS":null,"Template":"<>","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":5786,"Name":"setAuthorisedNumbers","TemplateSMS":"","Template":"<>","AckTemplate":null,"Operation":"//updated v 3 for EV06\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//[Length]:10 [Key]:34 [Value]:E0 09 31 32 33 34 35 36 37 38 39 02 79 6F 00\r\n//{\"numberNamePhoto\":{\"call\":1,\"noCard\":0,\"number\":\"123456789\",\"enable\":1,\"sms\":1,\"name\":\"yo\",\"headURL\":\"\",\"index\":0}}\r\n// para pruebas en local Contact':\r\n//AB 10 12 00 94 ED 00 00 02 10 34 E0 09 31 32 33 34 35 36 37 38 39 02 79 6F 00\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 nameHex = '';\r\nvar value = '02';\r\nvar keyLength = '00';\r\nvar confTel = '';\r\nvar count = 1; // approved contact will be from A2 to A9 - index 1 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 += \"0534\" + 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 nameHex = ascii_to_hexa(params.ApprovedContacts[contact].Name).toUpperCase();\r\n nameLength = ('00' + decimalToHex(params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\r\n keyLength = ('00' + decimalToHex(5 + params.ApprovedContacts[contact].Contact.length + params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\r\n value += keyLength + \"34\" + confTel + numberLength + numberHex + nameLength + nameHex + '00'; //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 nameHex = ascii_to_hexa(params.ApprovedContacts[contact].Name).toUpperCase();\r\n nameLength = ('00' + decimalToHex(params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\r\n keyLength = ('00' + decimalToHex(5 + params.ApprovedContacts[contact].Contact.length + params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\r\n value += keyLength + \"34\" + confTel + numberLength + numberHex + nameLength + nameHex + '00'; //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 += \"0534\" + 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\":5786,\"Name\":\"setAuthorisedNumbers\",\"TemplateSMS\":\"\",\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"//updated v 3 for EV06\\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//[Length]:10 [Key]:34 [Value]:E0 09 31 32 33 34 35 36 37 38 39 02 79 6F 00\\r\\n//{\\\"numberNamePhoto\\\":{\\\"call\\\":1,\\\"noCard\\\":0,\\\"number\\\":\\\"123456789\\\",\\\"enable\\\":1,\\\"sms\\\":1,\\\"name\\\":\\\"yo\\\",\\\"headURL\\\":\\\"\\\",\\\"index\\\":0}}\\r\\n// para pruebas en local Contact':\\r\\n//AB 10 12 00 94 ED 00 00 02 10 34 E0 09 31 32 33 34 35 36 37 38 39 02 79 6F 00\\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 nameHex = '';\\r\\nvar value = '02';\\r\\nvar keyLength = '00';\\r\\nvar confTel = '';\\r\\nvar count = 1; // approved contact will be from A2 to A9 - index 1 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 += \\\"0534\\\" + 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 = params.ApprovedContacts[contact].Contact;\\r\\n if (numberHex.startsWith(\\\"+\\\")) {\\r\\n numberHex = \\\"00\\\" + numberHex.substring(1);\\r\\n }\\r\\n numberHex = ascii_to_hexa(numberHex).toUpperCase();\\r\\n numberLength = ('00' + decimalToHex(params.ApprovedContacts[contact].Contact.length)).slice(-2).toUpperCase();\\r\\n nameHex = ascii_to_hexa(params.ApprovedContacts[contact].Name).toUpperCase();\\r\\n nameLength = ('00' + decimalToHex(params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n keyLength = ('00' + decimalToHex(5 + params.ApprovedContacts[contact].Contact.length + params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n value += keyLength + \\\"34\\\" + confTel + numberLength + numberHex + nameLength + nameHex + '00'; //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 = params.ApprovedContacts[contact].Contact;\\r\\n if (numberHex.startsWith(\\\"+\\\")) {\\r\\n numberHex = \\\"00\\\" + numberHex.substring(1);\\r\\n }\\r\\n numberHex = ascii_to_hexa(numberHex).toUpperCase();\\r\\n numberLength = ('00' + decimalToHex(params.ApprovedContacts[contact].Contact.length)).slice(-2).toUpperCase();\\r\\n nameHex = ascii_to_hexa(params.ApprovedContacts[contact].Name).toUpperCase();\\r\\n nameLength = ('00' + decimalToHex(params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n keyLength = ('00' + decimalToHex(5 + params.ApprovedContacts[contact].Contact.length + params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n value += keyLength + \\\"34\\\" + confTel + numberLength + numberHex + nameLength + nameHex + '00'; //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 += \\\"0534\\\" + 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\":[],\"Tags\":[]}","Timestamp":1752596927},{"Type":1,"NewValue":"{\"Id\":5786,\"Name\":\"setAuthorisedNumbers\",\"TemplateSMS\":\"\",\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"//updated v 3 for EV06\\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//[Length]:10 [Key]:34 [Value]:E0 09 31 32 33 34 35 36 37 38 39 02 79 6F 00\\r\\n//{\\\"numberNamePhoto\\\":{\\\"call\\\":1,\\\"noCard\\\":0,\\\"number\\\":\\\"123456789\\\",\\\"enable\\\":1,\\\"sms\\\":1,\\\"name\\\":\\\"yo\\\",\\\"headURL\\\":\\\"\\\",\\\"index\\\":0}}\\r\\n// para pruebas en local Contact':\\r\\n//AB 10 12 00 94 ED 00 00 02 10 34 E0 09 31 32 33 34 35 36 37 38 39 02 79 6F 00\\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 phoneNumber = '';\\r\\nvar numberLength = '00';\\r\\nvar numberHex = '';\\r\\nvar nameLength = '00';\\r\\nvar nameHex = '';\\r\\nvar value = '02';\\r\\nvar keyLength = '00';\\r\\nvar confTel = '';\\r\\nvar count = 1; // approved contact will be from A2 to A9 - index 1 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 += \\\"0534\\\" + 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 phoneNumber = params.ApprovedContacts[contact].Contact;\\r\\n if (phoneNumber.startsWith(\\\"+\\\")) {\\r\\n phoneNumber = \\\"00\\\" + phoneNumber.substring(1);\\r\\n }\\r\\n numberHex = ascii_to_hexa(phoneNumber).toUpperCase();\\r\\n numberLength = ('00' + decimalToHex(phoneNumber.length)).slice(-2).toUpperCase();\\r\\n nameHex = ascii_to_hexa(params.ApprovedContacts[contact].Name).toUpperCase();\\r\\n nameLength = ('00' + decimalToHex(params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n keyLength = ('00' + decimalToHex(5 + phoneNumber.length + params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n value += keyLength + \\\"34\\\" + confTel + numberLength + numberHex + nameLength + nameHex + '00'; //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 phoneNumber = params.ApprovedContacts[contact].Contact;\\r\\n if (phoneNumber.startsWith(\\\"+\\\")) {\\r\\n phoneNumber = \\\"00\\\" + phoneNumber.substring(1);\\r\\n }\\r\\n numberHex = ascii_to_hexa(phoneNumber).toUpperCase();\\r\\n numberLength = ('00' + decimalToHex(phoneNumber.length)).slice(-2).toUpperCase();\\r\\n nameHex = ascii_to_hexa(params.ApprovedContacts[contact].Name).toUpperCase();\\r\\n nameLength = ('00' + decimalToHex(params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n keyLength = ('00' + decimalToHex(5 + phoneNumber.length + params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n value += keyLength + \\\"34\\\" + confTel + numberLength + numberHex + nameLength + nameHex + '00'; //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 += \\\"0534\\\" + 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\":[],\"Tags\":[]}","Timestamp":1752597287}],"Tags":[]},{"Id":5787,"Name":"actionFindDevice","TemplateSMS":"<>","Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\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":[],"Tags":[]},{"Id":5788,"Name":"setWifiSettings","TemplateSMS":"<>","Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\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":5789,"Name":"getSystemSettings","TemplateSMS":"<>","Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\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":5790,"Name":"setSpeedDialNumber","TemplateSMS":null,"Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\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":5791,"Name":"getVolume","TemplateSMS":null,"Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\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":[],"Tags":[]},{"Id":5792,"Name":"getFallDownAlert","TemplateSMS":"","Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\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":[],"Tags":[]},{"Id":5793,"Name":"getNoMotionAlert","TemplateSMS":"","Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\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":[],"Tags":[]},{"Id":5794,"Name":"getCustomId","TemplateSMS":"","Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\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":[],"Tags":[]},{"Id":5795,"Name":"getPerformanceMode","TemplateSMS":"","Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\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":[],"Tags":[]},{"Id":5796,"Name":"getFirmwareVersion","TemplateSMS":"<>","Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\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":[],"Tags":[]},{"Id":5797,"Name":"setWifiList","TemplateSMS":null,"Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\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":5798,"Name":"getSystemLanguage","TemplateSMS":"<>","Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\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":[],"Tags":[]},{"Id":5730,"Name":"setVoicePromptVolume","TemplateSMS":null,"Template":"<>","AckTemplate":null,"Operation":"var configs = [];\nvar crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\n 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\n 0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\n 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\n];\nif (params.SystemSettings.Volume) {\n var volume = parseInt(params.SystemSettings.Volume)\n volume = decimalToHex(volume)\n volume = ('00' + volume).slice(-2).toUpperCase()\n}\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase()\nvar command = '02'\nvar keyLength = '02'\nvar key = '1C'\nvar messageBody = command + keyLength + key + volume\nvar checksum = byteStringToByteArray(messageBody)\nchecksum = crc16byte(checksum)\nchecksum = decimalToHex(checksum).toUpperCase()\nchecksum = ('0000' + checksum).slice(-4)\nchecksum = changeEndianness(checksum)\n//Hpw to calculate sequenceID\nvar prefix = 'AB10' + '0400' + checksum + sequenceID\nvar data = prefix + messageBody\nAddValue('data', data);\nAddValue('sequenceNumber', sequenceID); //add 20/07\nvar commandConfigs = {\n template: \"main\",\n configs: configs\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValue(p1, p2) {\n var cvpair = {\n code: p1,\n value: p2\n };\n configs.push(cvpair);\n}\n\nfunction ascii_to_hexa(str) {\n var arr1 = [];\n for (var n = 0, l = str.length; n < l; n++) {\n var hex = Number(str.charCodeAt(n)).toString(16);\n arr1.push(hex);\n }\n return arr1.join('');\n}\n\nfunction crc16byte(s) {\n var crc = 0x0000;\n var j, i;\n for (i = 0; i < s.length; i++) {\n c = s[i];\n if (c > 255) {\n throw new RangeError();\n }\n j = (c ^ (crc >> 8)) & 0xFF;\n crc = crcTable[j] ^ (crc << 8);\n }\n return ((crc ^ 0) & 0xFFFF);\n}\n\nfunction byteStringToByteArray(str) {\n var splitStr = []\n var j = 0\n for (let i = 0; i < str.length; i += 2) {\n splitStr[j] = str.substring(i, i + 2)\n j++\n }\n var bytes = []\n var bytePos = 0\n for (let i = 0; i < splitStr.length; i++) {\n var byteStr = splitStr[i]\n var b = parseInt(byteStr, 16)\n if (b < 256) {\n bytes[bytePos] = b\n bytePos++\n }\n }\n return bytes\n}\n\nfunction decimalToHex(str) {\n hexString = str.toString(16);\n return hexString\n}\n\nfunction changeEndianness(string) {\n const result = [];\n let len = string.length - 2;\n while (len >= 0) {\n result.push(string.substr(len, 2));\n len -= 2;\n }\n return result.join('');\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":true,"Order":null,"SendAttempts":2,"ProtocolActionObjects":[],"Tags":[]},{"Id":5765,"Name":"getCurrentSettings","TemplateSMS":"<>","Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\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 = '1A73344041424356101F44534733'; //1A73\r\n// Firmware Long, Contacts, APNusername, APNpass, server details, fall sensitivity and Beacon List, Fall down alert, Ring tome vol,System language, time interval, No motion alert,custom id, allow list\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar command = '02';\r\n//var keyLength = '10'; // previous\r\nvar keyLength = '0F'; //+1 qnt of commands\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' + '1100' + 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\":5765,\"Name\":\"getCurrentSettings\",\"TemplateSMS\":\"<>\",\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\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 = '1A73344041424356101F445347330F46'; //1A73\\r\\n// Firmware Long, Contacts, APNusername, APNpass, server details, fall sensitivity and Beacon List, Fall down alert, Ring tome vol,System language, time interval, No motion alert,custom id, allow list, Step settings, HRate Setting\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\nvar command = '02';\\r\\n//var keyLength = '10'; // previous\\r\\nvar keyLength = '11'; //+1 qnt of commands\\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' + '1300' + checksum + sequenceID; // add 2 to keylenght\\r\\nvar data = prefix + messageBody;\\r\\n// For GPRS command\\r\\nAddValue('data', data);\\r\\nAddValue('sequenceNumber', sequenceID);\\r\\n// For SMS command\\r\\nAddValueSMS('dataSMS', dataSMS);\\r\\nvar commandConfigs = {\\r\\n template: \\\"main\\\",\\r\\n configs: configs,\\r\\n configsSMS: configsSMS\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n// functions\\r\\nfunction AddValue(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n var arr1 = [];\\r\\n for (var n = 0, l = str.length; n < l; n++) {\\r\\n var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n arr1.push(hex);\\r\\n }\\r\\n return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n var crc = 0x0000;\\r\\n var j, i;\\r\\n for (i = 0; i < s.length; i++) {\\r\\n c = s[i];\\r\\n if (c > 255) {\\r\\n throw new RangeError();\\r\\n }\\r\\n j = (c ^ (crc >> 8)) & 0xFF;\\r\\n crc = crcTable[j] ^ (crc << 8);\\r\\n }\\r\\n return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n var splitStr = []\\r\\n var j = 0\\r\\n for (let i = 0; i < str.length; i += 2) {\\r\\n splitStr[j] = str.substring(i, i + 2)\\r\\n j++\\r\\n }\\r\\n var bytes = []\\r\\n var bytePos = 0\\r\\n for (let i = 0; i < splitStr.length; i++) {\\r\\n var byteStr = splitStr[i]\\r\\n var b = parseInt(byteStr, 16)\\r\\n if (b < 256) {\\r\\n bytes[bytePos] = b\\r\\n bytePos++\\r\\n }\\r\\n }\\r\\n return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n hexString = str.toString(16);\\r\\n return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n let bin = 0;\\r\\n let rem, i = 1,\\r\\n step = 1;\\r\\n while (x != 0) {\\r\\n rem = x % 2;\\r\\n x = parseInt(x / 2);\\r\\n bin = bin + rem * i;\\r\\n i = i * 10;\\r\\n }\\r\\n return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n var hexa = parseInt(x, 2).toString(16);\\r\\n return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n const result = [];\\r\\n let len = string.length - 2;\\r\\n while (len >= 0) {\\r\\n result.push(string.substr(len, 2));\\r\\n len -= 2;\\r\\n }\\r\\n return result.join('');\\r\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":true,\"Order\":17,\"SendAttempts\":4,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1749577720},{"Type":1,"NewValue":"{\"Id\":5765,\"Name\":\"getCurrentSettings\",\"TemplateSMS\":\"<>\",\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\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 = '1A73344041424356101F445347330F467A'; //1A73\\r\\n// Firmware Long, Contacts, APNusername, APNpass, server details, fall sensitivity and Beacon List, Fall down alert, Ring tome vol,System language, time interval, No motion alert,custom id, allow list, Step settings, HRate Setting\\r\\n// SPO2 interval\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\nvar command = '02';\\r\\n//var keyLength = '10'; // previous\\r\\nvar keyLength = '12'; //+1 qnt of commands\\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' + '1400' + checksum + sequenceID; // add 2 to keylenght\\r\\nvar data = prefix + messageBody;\\r\\n// For GPRS command\\r\\nAddValue('data', data);\\r\\nAddValue('sequenceNumber', sequenceID);\\r\\n// For SMS command\\r\\nAddValueSMS('dataSMS', dataSMS);\\r\\nvar commandConfigs = {\\r\\n template: \\\"main\\\",\\r\\n configs: configs,\\r\\n configsSMS: configsSMS\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n// functions\\r\\nfunction AddValue(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n var arr1 = [];\\r\\n for (var n = 0, l = str.length; n < l; n++) {\\r\\n var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n arr1.push(hex);\\r\\n }\\r\\n return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n var crc = 0x0000;\\r\\n var j, i;\\r\\n for (i = 0; i < s.length; i++) {\\r\\n c = s[i];\\r\\n if (c > 255) {\\r\\n throw new RangeError();\\r\\n }\\r\\n j = (c ^ (crc >> 8)) & 0xFF;\\r\\n crc = crcTable[j] ^ (crc << 8);\\r\\n }\\r\\n return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n var splitStr = []\\r\\n var j = 0\\r\\n for (let i = 0; i < str.length; i += 2) {\\r\\n splitStr[j] = str.substring(i, i + 2)\\r\\n j++\\r\\n }\\r\\n var bytes = []\\r\\n var bytePos = 0\\r\\n for (let i = 0; i < splitStr.length; i++) {\\r\\n var byteStr = splitStr[i]\\r\\n var b = parseInt(byteStr, 16)\\r\\n if (b < 256) {\\r\\n bytes[bytePos] = b\\r\\n bytePos++\\r\\n }\\r\\n }\\r\\n return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n hexString = str.toString(16);\\r\\n return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n let bin = 0;\\r\\n let rem, i = 1,\\r\\n step = 1;\\r\\n while (x != 0) {\\r\\n rem = x % 2;\\r\\n x = parseInt(x / 2);\\r\\n bin = bin + rem * i;\\r\\n i = i * 10;\\r\\n }\\r\\n return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n var hexa = parseInt(x, 2).toString(16);\\r\\n return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n const result = [];\\r\\n let len = string.length - 2;\\r\\n while (len >= 0) {\\r\\n result.push(string.substr(len, 2));\\r\\n len -= 2;\\r\\n }\\r\\n return result.join('');\\r\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":true,\"Order\":17,\"SendAttempts\":4,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1763495958}],"Tags":[]},{"Id":5769,"Name":"setFallSettings","TemplateSMS":"<>","Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n 0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\nvar msg = [];\r\nvar configs = [];\r\nvar configsSMS = [];\r\n// configuration command (0X02) Fall sensitivity\r\nvar messageBody = '02';\r\nvar sensitivity = '';\r\nvar dataSMS = '';\r\nvar value = ''\r\nif (params.FallSettings.EnableDisableFallSettings == 'true') {\r\n value += '1'\r\n value += '100' //Dial\r\n //}\r\n if (params.FallSettings.Sensitivity) {\r\n var sensiString = params.FallSettings.Sensitivity.split(',');\r\n var level = sensiString[1];\r\n sensitivity = parseInt(sensiString[0]);\r\n // For SMS\r\n dataSMS = `FL1,${sensitivity},1`;\r\n //numberHex = ascii_to_hexa(sensitivity).toUpperCase();\r\n sensitivity = ('0000' + decimalToBinary(sensitivity)).slice(-4).toUpperCase()\r\n value += sensitivity\r\n }\r\n} else {\r\n value = '01100001'\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":[],"Tags":[]},{"Id":5806,"Name":"setWatchSettings","TemplateSMS":null,"Template":"<>","AckTemplate":null,"Operation":"// Watch Settings\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 Watch Settings' Only enable y disable:\r\n// params.StepCounting.EnableDisableStepCounting == 'true'\r\n// params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true'\r\n//var params = {StepCounting:{'EnableDisableStepCounting':'true'},HeartRateMonitor:{'EnableDisableHeartRateMonitor':'true'}, DeviceVersion:{'DeviceVersion':2}}\r\n// Test enabled both\r\n// AB 10 13 00 40 6F 00 00 02 11 36 00 08 1A 00 00 3E 00 00 00 14 00 00 00 00 00 00\r\n// test step on HRT off\r\n// 02 11 36 00 08 0A 00 00 3C 00 00 00 14 00 00 00 00 00 00\r\n// test step off HRT on\r\n// 02 11 36 00 08 12 00 00 3A 00 00 00 14 00 00 00 00 00 00\r\n// test both off \r\n// 02 11 36 00 08 02 00 00 38 00 00 00 14 00 00 00 00 00 00 \r\nvar msg = [];\r\nvar configs = [];\r\n// configuration command (0X02) , lenght and key\r\nvar messageBody = '021136';\r\n// step count/heart value display\r\n// Watch setting related FACE ID\r\nmessageBody += '00'; // Default FACE ID 0 \r\n// Future\r\n//if (params.WatchFace.SetWatchFace) {\r\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \r\n//} else {\r\n// messageBody += '00'; // Analog Face Default FACE ID 0 \r\n//}\r\n// Watch Display setting related to Step and heart rate settings\r\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true')) {\r\n messageBody += '081A0000'; //both displays\r\n messageBody += '06000000'; //menu 1 and 2\r\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'false')) {\r\n messageBody += '080A0000'; // step display\r\n messageBody += '04000000'; //menu 2\r\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true')) {\r\n messageBody += '08120000'; // heart display\r\n messageBody += '02000000'; //menu 1\r\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'false')) {\r\n messageBody += '08020000'; // no displays\r\n messageBody += '00000000'; // no menu\r\n} else {\r\n messageBody += '08020000'; //no displays\r\n messageBody += '00000000'; // no menu\r\n}\r\n//menu items for the future\r\n/*if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'true')) {\r\n messageBody += '06000000'; //menu 1 and 2\r\n} else if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'false')) {\r\n messageBody += '04000000'; //menu 2\r\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'true')) {\r\n messageBody += '02000000'; //menu 1\r\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'false')) {\r\n messageBody += '00000000'; // no menu\r\n} else {\r\n messageBody += '00000000'; // no menu\r\n}*/\r\n// from autohome page to the end\r\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\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":4,"ProtocolActionObjects":[{"Type":0,"NewValue":"{\"Id\":5806,\"Name\":\"setWatchSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"// Watch Settings\\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 Watch Settings' Only enable y disable:\\r\\n// params.StepCounting.EnableDisableStepCounting == 'true'\\r\\n// params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true'\\r\\n//var params = {StepCounting:{'EnableDisableStepCounting':'true'},HeartRateMonitor:{'EnableDisableHeartRateMonitor':'true'}, DeviceVersion:{'DeviceVersion':2}}\\r\\n// Test enabled both\\r\\n// AB 10 13 00 40 6F 00 00 02 11 36 00 08 1A 00 00 3E 00 00 00 14 00 00 00 00 00 00\\r\\n// test step on HRT off\\r\\n// 02 11 36 00 08 0A 00 00 3C 00 00 00 14 00 00 00 00 00 00\\r\\n// test step off HRT on\\r\\n// 02 11 36 00 08 12 00 00 3A 00 00 00 14 00 00 00 00 00 00\\r\\n// test both off \\r\\n// 02 11 36 00 08 02 00 00 38 00 00 00 14 00 00 00 00 00 00 \\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\n// configuration command (0X02) , lenght and key\\r\\nvar messageBody = '021136';\\r\\n// step count/heart value display\\r\\n// Watch setting related FACE ID\\r\\nmessageBody += '00'; // Default FACE ID 0 \\r\\n// Future\\r\\n//if (params.WatchFace.SetWatchFace) {\\r\\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \\r\\n//} else {\\r\\n// messageBody += '00'; // Analog Face Default FACE ID 0 \\r\\n//}\\r\\n// Watch Display setting related to Step and heart rate settings\\r\\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true')) {\\r\\n messageBody += '081A0000'; //both displays\\r\\n messageBody += '06000000'; //menu 1 and 2\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'false')) {\\r\\n messageBody += '080A0000'; // step display\\r\\n messageBody += '04000000'; //menu 2\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true')) {\\r\\n messageBody += '08120000'; // heart display\\r\\n messageBody += '02000000'; //menu 1\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'false')) {\\r\\n messageBody += '08020000'; // no displays\\r\\n messageBody += '00000000'; // no menu\\r\\n} else {\\r\\n messageBody += '08020000'; //no displays\\r\\n messageBody += '00000000'; // no menu\\r\\n}\\r\\n//menu items for the future\\r\\n/*if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '06000000'; //menu 1 and 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '04000000'; //menu 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '02000000'; //menu 1\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '00000000'; // no menu\\r\\n} else {\\r\\n messageBody += '00000000'; // no menu\\r\\n}*/\\r\\n// from autohome page to the end\\r\\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\\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\":4,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1748973730},{"Type":1,"NewValue":"{\"Id\":5806,\"Name\":\"setWatchSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"// Watch Settings\\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 Watch Settings' Only enable y disable:\\r\\n// params.StepCounting.EnableDisableStepCounting == 'true'\\r\\n// params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true'\\r\\n//var params = {StepCounting:{'EnableDisableStepCounting':'true'},HeartRateMonitor:{'EnableDisableHeartRateMonitor':'true'}, DeviceVersion:{'DeviceVersion':2}}\\r\\n// Test enabled both\\r\\n// AB 10 13 00 40 6F 00 00 02 11 36 00 08 1A 00 00 3E 00 00 00 14 00 00 00 00 00 00\\r\\n// test step on HRT off\\r\\n// 02 11 36 00 08 0A 00 00 3C 00 00 00 14 00 00 00 00 00 00\\r\\n// test step off HRT on\\r\\n// 02 11 36 00 08 12 00 00 3A 00 00 00 14 00 00 00 00 00 00\\r\\n// test both off \\r\\n// 02 11 36 00 08 02 00 00 38 00 00 00 14 00 00 00 00 00 00 \\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\n// configuration command (0X02) , lenght and key\\r\\nvar messageBody = '021136';\\r\\n// step count/heart value display\\r\\n// Watch setting related FACE ID\\r\\nmessageBody += '00'; // Default FACE ID 0 \\r\\n// Future\\r\\n//if (params.WatchFace.SetWatchFace) {\\r\\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \\r\\n//} else {\\r\\n// messageBody += '00'; // Analog Face Default FACE ID 0 \\r\\n//}\\r\\n// Watch Display setting related to Step and heart rate settings\\r\\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '081A0000'; //both displays\\r\\n messageBody += '06000000'; //menu 1 and 2\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '080A0000'; // step display\\r\\n messageBody += '04000000'; //menu 2\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '08120000'; // heart display\\r\\n messageBody += '02000000'; //menu 1\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '08020000'; // no displays\\r\\n messageBody += '00000000'; // no menu\\r\\n} else {\\r\\n messageBody += '08020000'; //no displays\\r\\n messageBody += '00000000'; // no menu\\r\\n}\\r\\n//menu items for the future\\r\\n/*if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '06000000'; //menu 1 and 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '04000000'; //menu 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '02000000'; //menu 1\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '00000000'; // no menu\\r\\n} else {\\r\\n messageBody += '00000000'; // no menu\\r\\n}*/\\r\\n// from autohome page to the end\\r\\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\\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\":4,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1749574591},{"Type":1,"NewValue":"{\"Id\":5806,\"Name\":\"setWatchSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"// Watch Settings\\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 Watch Settings' Only enable y disable:\\r\\n// params.StepCounting.EnableDisableStepCounting == 'true'\\r\\n// params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true'\\r\\n//var params = {StepCounting:{'EnableDisableStepCounting':'true'},HeartRateMonitor:{'EnableDisableHeartRateMonitor':'true'}, DeviceVersion:{'DeviceVersion':2}}\\r\\n// Test enabled both\\r\\n// AB 10 13 00 40 6F 00 00 02 11 36 00 08 1A 00 00 3E 00 00 00 14 00 00 00 00 00 00\\r\\n// test step on HRT off\\r\\n// 02 11 36 00 08 0A 00 00 3C 00 00 00 14 00 00 00 00 00 00\\r\\n// test step off HRT on\\r\\n// 02 11 36 00 08 12 00 00 3A 00 00 00 14 00 00 00 00 00 00\\r\\n// test both off \\r\\n// 02 11 36 00 08 02 00 00 38 00 00 00 14 00 00 00 00 00 00 \\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\n// configuration command (0X02) , lenght and key\\r\\nvar messageBody = '021136';\\r\\n// step count/heart value display\\r\\n// Watch setting related FACE ID\\r\\nmessageBody += '00'; // Default FACE ID 0 \\r\\n// Future\\r\\n//if (params.WatchFace.SetWatchFace) {\\r\\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \\r\\n//} else {\\r\\n// messageBody += '00'; // Analog Face Default FACE ID 0 \\r\\n//}\\r\\n// Watch Display setting related to Step and heart rate settings\\r\\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '081A0000'; //both displays\\r\\n messageBody += '06000000'; //menu 1 and 2\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '080A0000'; // step display\\r\\n messageBody += '04000000'; //menu 2\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '08120000'; // heart display\\r\\n messageBody += '02000000'; //menu 1\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '08020000'; // no displays\\r\\n messageBody += '00000000'; // no menu\\r\\n} else {\\r\\n messageBody += '08020000'; //no displays\\r\\n messageBody += '00000000'; // no menu\\r\\n}\\r\\n//menu items for the future\\r\\n/*if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '06000000'; //menu 1 and 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '04000000'; //menu 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '02000000'; //menu 1\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '00000000'; // no menu\\r\\n} else {\\r\\n messageBody += '00000000'; // no menu\\r\\n}*/\\r\\n// from autohome page to the end\\r\\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\\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\\n//AddValueSMS('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":1749575829},{"Type":1,"NewValue":"{\"Id\":5806,\"Name\":\"setWatchSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"// Watch Settings\\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 Watch Settings' Only enable y disable:\\r\\n// params.StepCounting.EnableDisableStepCounting == 'true'\\r\\n// params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true'\\r\\n//var params = {StepCounting:{'EnableDisableStepCounting':'true'},HeartRateMonitor:{'EnableDisableHeartRateMonitor':'true'}, DeviceVersion:{'DeviceVersion':2}}\\r\\n// Test enabled both\\r\\n// AB 10 13 00 99 6A 0A 00 02 11 36 00 08 1B 00 00 0E 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step on HRT off\\r\\n// AB 10 13 00 DD 0C 0B 00 02 11 36 00 08 0B 00 00 0C 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step off HRT on\\r\\n// AB 10 13 00 B5 D0 09 00 02 11 36 00 08 13 00 00 0A 00 00 00 14 00 00 00 03 0A 01\\r\\n// test both off \\r\\n// AB 10 13 00 F1 B6 0C 00 02 11 36 00 08 03 00 00 08 00 00 00 14 00 00 00 03 0A 01 \\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\n// configuration command (0X02) , lenght and key\\r\\nvar messageBody = '021136';\\r\\n// step count/heart value display\\r\\n// Watch setting related FACE ID\\r\\nmessageBody += '00'; // Default FACE ID 0 \\r\\n// Future\\r\\n//if (params.WatchFace.SetWatchFace) {\\r\\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \\r\\n//} else {\\r\\n// messageBody += '00'; // Analog Face Default FACE ID 0 \\r\\n//}\\r\\n// Watch Display setting related to Step and heart rate settings\\r\\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '081B0000'; //both displays\\r\\n messageBody += '0E000000'; //menu 1 and 2\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '080B0000'; // step display\\r\\n messageBody += '0C000000'; //menu 2\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '08130000'; // heart display\\r\\n messageBody += '0A000000'; //menu 1\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '08030000'; // no displays\\r\\n messageBody += '08000000'; // no menu , only contact\\r\\n} else {\\r\\n messageBody += '08030000'; //no displays\\r\\n messageBody += '08000000'; // no menu.. only contact\\r\\n}\\r\\n//menu items for the future\\r\\n/*if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '06000000'; //menu 1 and 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '04000000'; //menu 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '02000000'; //menu 1\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '00000000'; // no menu\\r\\n} else {\\r\\n messageBody += '00000000'; // no menu\\r\\n}*/\\r\\n// from autohome page to the end\\r\\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\\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\\n//AddValueSMS('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":1749576611},{"Type":1,"NewValue":"{\"Id\":5806,\"Name\":\"setWatchSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"// Watch Settings\\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 Watch Settings' Only enable y disable:\\r\\n// params.StepCounting.EnableDisableStepCounting == 'true'\\r\\n// params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true'\\r\\n//var params = {StepCounting:{'EnableDisableStepCounting':'true'},HeartRateMonitor:{'EnableDisableHeartRateMonitor':'true'}, DeviceVersion:{'DeviceVersion':2}}\\r\\n// Test enabled both\\r\\n// AB 10 13 00 99 6A 0A 00 02 11 36 00 08 1B 00 00 0E 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step on HRT off\\r\\n// AB 10 13 00 DD 0C 0B 00 02 11 36 00 08 0B 00 00 0C 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step off HRT on\\r\\n// AB 10 13 00 B5 D0 09 00 02 11 36 00 08 13 00 00 0A 00 00 00 14 00 00 00 03 0A 01\\r\\n// test both off \\r\\n// AB 10 13 00 F1 B6 0C 00 02 11 36 00 08 03 00 00 08 00 00 00 14 00 00 00 03 0A 01 \\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\n// configuration command (0X02) , lenght and key\\r\\nvar messageBody = '021136';\\r\\n// step count/heart value display\\r\\n// Watch setting related FACE ID\\r\\nmessageBody += '00'; // Default FACE ID 0 \\r\\n// Future\\r\\n//if (params.WatchFace.SetWatchFace) {\\r\\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \\r\\n//} else {\\r\\n// messageBody += '00'; // Analog Face Default FACE ID 0 \\r\\n//}\\r\\n// Watch Display setting related to Step and heart rate settings\\r\\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '081B0000'; //both displays\\r\\n messageBody += '06000000'; //menu 1 and 2 no contact (menu 3) // 0E with contact menu\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '080B0000'; // step display\\r\\n messageBody += '04000000'; //menu 2 no contact (menu 3) //0C with contact menu\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '08130000'; // heart display\\r\\n messageBody += '02000000'; //menu 1 no contact (menu 3) // 0A with contact menu\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '08030000'; // no displays\\r\\n messageBody += '00000000'; // no menu , //08 only contact\\r\\n} else {\\r\\n messageBody += '08030000'; //no displays\\r\\n messageBody += '00000000'; // no menu.. only contact\\r\\n}\\r\\n//menu items for the future\\r\\n/*if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '06000000'; //menu 1 and 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '04000000'; //menu 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '02000000'; //menu 1\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '00000000'; // no menu\\r\\n} else {\\r\\n messageBody += '00000000'; // no menu\\r\\n}*/\\r\\n// from autohome page to the end\\r\\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\\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\\n//AddValueSMS('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":1751040656},{"Type":1,"NewValue":"{\"Id\":5806,\"Name\":\"setWatchSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"// Watch Settings\\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 Watch Settings' Only enable y disable:\\r\\n// params.StepCounting.EnableDisableStepCounting == 'true'\\r\\n// params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true'\\r\\n//var params = {StepCounting:{'EnableDisableStepCounting':'true'},HeartRateMonitor:{'EnableDisableHeartRateMonitor':'true'}, DeviceVersion:{'DeviceVersion':2}}\\r\\n// Test enabled both\\r\\n// AB 10 13 00 99 6A 0A 00 02 11 36 00 08 1B 00 00 0E 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step on HRT off\\r\\n// AB 10 13 00 DD 0C 0B 00 02 11 36 00 08 0B 00 00 0C 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step off HRT on\\r\\n// AB 10 13 00 B5 D0 09 00 02 11 36 00 08 13 00 00 0A 00 00 00 14 00 00 00 03 0A 01\\r\\n// test both off \\r\\n// AB 10 13 00 F1 B6 0C 00 02 11 36 00 08 03 00 00 08 00 00 00 14 00 00 00 03 0A 01 \\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\n// configuration command (0X02) , lenght and key\\r\\nvar messageBody = '021136';\\r\\n// step count/heart value display\\r\\n// Watch setting related FACE ID\\r\\nmessageBody += '00'; // Default FACE ID 0 \\r\\n// Future\\r\\n//if (params.WatchFace.SetWatchFace) {\\r\\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \\r\\n//} else {\\r\\n// messageBody += '00'; // Analog Face Default FACE ID 0 \\r\\n//}\\r\\n// Watch Display setting related to Step and heart rate settings\\r\\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '081B0000'; //both displays\\r\\n messageBody += (params.StepsSettings.EnableDisableSP02Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '6000000'; //menu 1 and 2 no contact (menu 3) // 0E with contact menu\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '080B0000'; // step display\\r\\n messageBody += (params.StepsSettings.EnableDisableSP02Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '4000000'; //menu 2 no contact (menu 3) //0C with contact menu\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '08130000'; // heart display\\r\\n messageBody += (params.StepsSettings.EnableDisableSP02Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '2000000'; //menu 1 no contact (menu 3) // 0A with contact menu\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '08030000'; // no displays\\r\\n messageBody += (params.StepsSettings.EnableDisableSP02Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '0000000'; // no menu , //08 only contact\\r\\n} else {\\r\\n messageBody += '08030000'; //no displays\\r\\n messageBody += (params.StepsSettings.EnableDisableSP02Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '0000000'; // no menu.. only contact\\r\\n}\\r\\n//menu items for the future\\r\\n/*if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '06000000'; //menu 1 and 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '04000000'; //menu 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '02000000'; //menu 1\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '00000000'; // no menu\\r\\n} else {\\r\\n messageBody += '00000000'; // no menu\\r\\n}*/\\r\\n// from autohome page to the end\\r\\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\\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\\n//AddValueSMS('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":1763060987},{"Type":1,"NewValue":"{\"Id\":5806,\"Name\":\"setWatchSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"// Watch Settings\\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 Watch Settings' Only enable y disable:\\r\\n// params.StepCounting.EnableDisableStepCounting == 'true'\\r\\n// params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true'\\r\\n//var params = {StepCounting:{'EnableDisableStepCounting':'true'},HeartRateMonitor:{'EnableDisableHeartRateMonitor':'true'}, DeviceVersion:{'DeviceVersion':2}}\\r\\n// Test enabled both\\r\\n// AB 10 13 00 99 6A 0A 00 02 11 36 00 08 1B 00 00 0E 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step on HRT off\\r\\n// AB 10 13 00 DD 0C 0B 00 02 11 36 00 08 0B 00 00 0C 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step off HRT on\\r\\n// AB 10 13 00 B5 D0 09 00 02 11 36 00 08 13 00 00 0A 00 00 00 14 00 00 00 03 0A 01\\r\\n// test both off \\r\\n// AB 10 13 00 F1 B6 0C 00 02 11 36 00 08 03 00 00 08 00 00 00 14 00 00 00 03 0A 01 \\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\n// configuration command (0X02) , lenght and key\\r\\nvar messageBody = '021136';\\r\\n// step count/heart value display\\r\\n// Watch setting related FACE ID\\r\\nmessageBody += '00'; // Default FACE ID 0 \\r\\n// Future\\r\\n//if (params.WatchFace.SetWatchFace) {\\r\\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \\r\\n//} else {\\r\\n// messageBody += '00'; // Analog Face Default FACE ID 0 \\r\\n//}\\r\\n// Watch Display setting related to Step and heart rate settings\\r\\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '081B0000'; //both displays\\r\\n messageBody += (params.StepsSettings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '6000000'; //menu 1 and 2 no contact (menu 3) // 0E with contact menu\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '080B0000'; // step display\\r\\n messageBody += (params.StepsSettings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '4000000'; //menu 2 no contact (menu 3) //0C with contact menu\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '08130000'; // heart display\\r\\n messageBody += (params.StepsSettings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '2000000'; //menu 1 no contact (menu 3) // 0A with contact menu\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '08030000'; // no displays\\r\\n messageBody += (params.StepsSettings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '0000000'; // no menu , //08 only contact\\r\\n} else {\\r\\n messageBody += '08030000'; //no displays\\r\\n messageBody += (params.StepsSettings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '0000000'; // no menu.. only contact\\r\\n}\\r\\n//menu items for the future\\r\\n/*if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '06000000'; //menu 1 and 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '04000000'; //menu 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '02000000'; //menu 1\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '00000000'; // no menu\\r\\n} else {\\r\\n messageBody += '00000000'; // no menu\\r\\n}*/\\r\\n// from autohome page to the end\\r\\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\\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\\n//AddValueSMS('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":1763107860},{"Type":1,"NewValue":"{\"Id\":5806,\"Name\":\"setWatchSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"// Watch Settings\\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 Watch Settings' Only enable y disable:\\r\\n// params.StepCounting.EnableDisableStepCounting == 'true'\\r\\n// params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true'\\r\\n//var params = {StepCounting:{'EnableDisableStepCounting':'true'},HeartRateMonitor:{'EnableDisableHeartRateMonitor':'true'}, DeviceVersion:{'DeviceVersion':2}}\\r\\n// Test enabled both\\r\\n// AB 10 13 00 99 6A 0A 00 02 11 36 00 08 1B 00 00 0E 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step on HRT off\\r\\n// AB 10 13 00 DD 0C 0B 00 02 11 36 00 08 0B 00 00 0C 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step off HRT on\\r\\n// AB 10 13 00 B5 D0 09 00 02 11 36 00 08 13 00 00 0A 00 00 00 14 00 00 00 03 0A 01\\r\\n// test both off \\r\\n// AB 10 13 00 F1 B6 0C 00 02 11 36 00 08 03 00 00 08 00 00 00 14 00 00 00 03 0A 01 \\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\n// configuration command (0X02) , lenght and key\\r\\nvar messageBody = '021136';\\r\\n// step count/heart value display\\r\\n// Watch setting related FACE ID\\r\\nmessageBody += '00'; // Default FACE ID 0 \\r\\n// Future\\r\\n//if (params.WatchFace.SetWatchFace) {\\r\\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \\r\\n//} else {\\r\\n// messageBody += '00'; // Analog Face Default FACE ID 0 \\r\\n//}\\r\\n// Watch Display setting related to Step and heart rate settings\\r\\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '081B0000'; //both displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '6000000'; //menu 1 and 2 no contact (menu 3) // 0E with contact menu\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '080B0000'; // step display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '4000000'; //menu 2 no contact (menu 3) //0C with contact menu\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '08130000'; // heart display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '2000000'; //menu 1 no contact (menu 3) // 0A with contact menu\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '08030000'; // no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '0000000'; // no menu , //08 only contact\\r\\n} else {\\r\\n messageBody += '08030000'; //no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '0000000'; // no menu.. only contact\\r\\n}\\r\\n//menu items for the future\\r\\n/*if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '06000000'; //menu 1 and 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '04000000'; //menu 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '02000000'; //menu 1\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '00000000'; // no menu\\r\\n} else {\\r\\n messageBody += '00000000'; // no menu\\r\\n}*/\\r\\n// from autohome page to the end\\r\\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\\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\\n//AddValueSMS('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":1763108274},{"Type":1,"NewValue":"{\"Id\":5806,\"Name\":\"setWatchSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"// Watch Settings\\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 Watch Settings' Only enable y disable:\\r\\n// params.StepCounting.EnableDisableStepCounting == 'true'\\r\\n// params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true'\\r\\n//var params = {StepCounting:{'EnableDisableStepCounting':'true'},HeartRateMonitor:{'EnableDisableHeartRateMonitor':'true'}, DeviceVersion:{'DeviceVersion':2}}\\r\\n// Test enabled both\\r\\n// AB 10 13 00 99 6A 0A 00 02 11 36 00 08 1B 00 00 0E 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step on HRT off\\r\\n// AB 10 13 00 DD 0C 0B 00 02 11 36 00 08 0B 00 00 0C 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step off HRT on\\r\\n// AB 10 13 00 B5 D0 09 00 02 11 36 00 08 13 00 00 0A 00 00 00 14 00 00 00 03 0A 01\\r\\n// test both off \\r\\n// AB 10 13 00 F1 B6 0C 00 02 11 36 00 08 03 00 00 08 00 00 00 14 00 00 00 03 0A 01 \\r\\n// comando para Contact on ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 4C 2E 03 00 02 11 36 00 08 1B 00 00 4E 00 00 00 14 00 00 00 03 0A 01\\r\\n// comando para contact off ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 C2 8C 04 00 02 11 36 00 08 1B 00 00 46 00 00 00 14 00 00 00 03 0A 01\\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\n// configuration command (0X02) , lenght and key\\r\\nvar messageBody = '021136';\\r\\n// step count/heart value display\\r\\n// Watch setting related FACE ID\\r\\nmessageBody += '00'; // Default FACE ID 0 \\r\\n// Future\\r\\n//if (params.WatchFace.SetWatchFace) {\\r\\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \\r\\n//} else {\\r\\n// messageBody += '00'; // Analog Face Default FACE ID 0 \\r\\n//}\\r\\n// Watch Display setting related to Step and heart rate settings\\r\\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '081B0000'; //both displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '6'; //menu 1 and 2 \\r\\n messageBody += 'E'; //menu 1 and 2 and contact (menu 3) \\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '080B0000'; // step display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '4'; //menu 2 \\r\\n messageBody += 'C'; // menu 2 and contact (menu 3) \\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '08130000'; // heart display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '2'; //menu 1 no contact (menu 3) \\r\\n messageBody += 'A'; //menu 1 and contact (menu 3) \\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '08030000'; // no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '0000000'; // no menu , //08 only contact\\r\\n messageBody += '8'; // //08 only contact\\r\\n messageBody += '000000'; // other settings\\r\\n} else {\\r\\n messageBody += '08030000'; //no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '0000000'; // no menu..\\r\\n}\\r\\n//menu items for the future\\r\\n/*if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '06000000'; //menu 1 and 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '04000000'; //menu 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '02000000'; //menu 1\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '00000000'; // no menu\\r\\n} else {\\r\\n messageBody += '00000000'; // no menu\\r\\n}*/\\r\\n// from autohome page to the end\\r\\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\\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\\n//AddValueSMS('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":1764099175},{"Type":1,"NewValue":"{\"Id\":5806,\"Name\":\"setWatchSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"// Watch Settings\\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 Watch Settings' Only enable y disable:\\r\\n// params.StepCounting.EnableDisableStepCounting == 'true'\\r\\n// params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true'\\r\\n//var params = {StepCounting:{'EnableDisableStepCounting':'true'},HeartRateMonitor:{'EnableDisableHeartRateMonitor':'true'}, DeviceVersion:{'DeviceVersion':2}}\\r\\n// Test enabled both\\r\\n// AB 10 13 00 99 6A 0A 00 02 11 36 00 08 1B 00 00 0E 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step on HRT off\\r\\n// AB 10 13 00 DD 0C 0B 00 02 11 36 00 08 0B 00 00 0C 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step off HRT on\\r\\n// AB 10 13 00 B5 D0 09 00 02 11 36 00 08 13 00 00 0A 00 00 00 14 00 00 00 03 0A 01\\r\\n// test both off \\r\\n// AB 10 13 00 F1 B6 0C 00 02 11 36 00 08 03 00 00 08 00 00 00 14 00 00 00 03 0A 01 \\r\\n// comando para Contact on ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 4C 2E 03 00 02 11 36 00 08 1B 00 00 4E 00 00 00 14 00 00 00 03 0A 01\\r\\n// comando para contact off ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 C2 8C 04 00 02 11 36 00 08 1B 00 00 46 00 00 00 14 00 00 00 03 0A 01\\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\n// To store the quantity of contacts in the whitelist to enable disable the contact menu\\r\\nvar contactos = params.ApprovedContacts && params.ApprovedContacts.Contact;\\r\\nvar numDuplas = Array.isArray(contactos) ? contactos.length : 0;\\r\\n// configuration command (0X02) , lenght and key\\r\\nvar messageBody = '021136';\\r\\n// step count/heart value display\\r\\n// Watch setting related FACE ID\\r\\nmessageBody += '00'; // Default FACE ID 0 \\r\\n// Future\\r\\n//if (params.WatchFace.SetWatchFace) {\\r\\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \\r\\n//} else {\\r\\n// messageBody += '00'; // Analog Face Default FACE ID 0 \\r\\n//}\\r\\n// Watch Display setting related to Step and heart rate settings\\r\\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '081B0000'; //both displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += (numDuplas > 2) ? 'E' : '6';\\r\\n //messageBody += '6'; //menu 1 and 2 \\r\\n //messageBody += 'E'; //menu 1 and 2 and contact (menu 3) \\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '080B0000'; // step display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '4'; //menu 2 \\r\\n //messageBody += 'C'; // menu 2 and contact (menu 3) \\r\\n messageBody += (numDuplas > 2) ? 'C' : '4';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '08130000'; // heart display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '2'; //menu 1 no contact (menu 3) \\r\\n //messageBody += 'A'; //menu 1 and contact (menu 3) \\r\\n messageBody += (numDuplas > 2) ? 'A' : '2';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '08030000'; // no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '0000000'; // no menu , //08 only contact\\r\\n //messageBody += '8'; // //08 only contact\\r\\n messageBody += (numDuplas > 2) ? '8' : '0';\\r\\n messageBody += '000000'; // other settings\\r\\n} else {\\r\\n messageBody += '08030000'; //no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '0000000'; // no menu..\\r\\n}\\r\\n//menu items for the future\\r\\n/*if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '06000000'; //menu 1 and 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '04000000'; //menu 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '02000000'; //menu 1\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '00000000'; // no menu\\r\\n} else {\\r\\n messageBody += '00000000'; // no menu\\r\\n}*/\\r\\n// from autohome page to the end\\r\\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\\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\\n//AddValueSMS('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":1764100032},{"Type":1,"NewValue":"{\"Id\":5806,\"Name\":\"setWatchSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"// Watch Settings\\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 Watch Settings' Only enable y disable:\\r\\n// params.StepCounting.EnableDisableStepCounting == 'true'\\r\\n// params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true'\\r\\n//var params = {StepCounting:{'EnableDisableStepCounting':'true'},HeartRateMonitor:{'EnableDisableHeartRateMonitor':'true'}, DeviceVersion:{'DeviceVersion':2}}\\r\\n// Test enabled both\\r\\n// AB 10 13 00 99 6A 0A 00 02 11 36 00 08 1B 00 00 0E 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step on HRT off\\r\\n// AB 10 13 00 DD 0C 0B 00 02 11 36 00 08 0B 00 00 0C 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step off HRT on\\r\\n// AB 10 13 00 B5 D0 09 00 02 11 36 00 08 13 00 00 0A 00 00 00 14 00 00 00 03 0A 01\\r\\n// test both off \\r\\n// AB 10 13 00 F1 B6 0C 00 02 11 36 00 08 03 00 00 08 00 00 00 14 00 00 00 03 0A 01 \\r\\n// comando para Contact on ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 4C 2E 03 00 02 11 36 00 08 1B 00 00 4E 00 00 00 14 00 00 00 03 0A 01\\r\\n// comando para contact off ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 C2 8C 04 00 02 11 36 00 08 1B 00 00 46 00 00 00 14 00 00 00 03 0A 01\\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\n// To store the quantity of contacts in the whitelist to enable disable the contact menu\\r\\n//var contactos = params.ApprovedContacts && params.ApprovedContacts.Contact;\\r\\nvar numDuplas = Array.isArray(params.ApprovedContacts) ? params.ApprovedContacts.length : 0;\\r\\n// configuration command (0X02) , lenght and key\\r\\nvar messageBody = '021136';\\r\\n// step count/heart value display\\r\\n// Watch setting related FACE ID\\r\\nmessageBody += '00'; // Default FACE ID 0 \\r\\n// Future\\r\\n//if (params.WatchFace.SetWatchFace) {\\r\\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \\r\\n//} else {\\r\\n// messageBody += '00'; // Analog Face Default FACE ID 0 \\r\\n//}\\r\\n// Watch Display setting related to Step and heart rate settings\\r\\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '081B0000'; //both displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += (numDuplas > 2) ? 'E' : '6';\\r\\n //messageBody += '6'; //menu 1 and 2 \\r\\n //messageBody += 'E'; //menu 1 and 2 and contact (menu 3) \\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '080B0000'; // step display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '4'; //menu 2 \\r\\n //messageBody += 'C'; // menu 2 and contact (menu 3) \\r\\n messageBody += (numDuplas > 2) ? 'C' : '4';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '08130000'; // heart display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '2'; //menu 1 no contact (menu 3) \\r\\n //messageBody += 'A'; //menu 1 and contact (menu 3) \\r\\n messageBody += (numDuplas > 2) ? 'A' : '2';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '08030000'; // no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '0000000'; // no menu , //08 only contact\\r\\n //messageBody += '8'; // //08 only contact\\r\\n messageBody += (numDuplas > 2) ? '8' : '0';\\r\\n messageBody += '000000'; // other settings\\r\\n} else {\\r\\n messageBody += '08030000'; //no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '0000000'; // no menu..\\r\\n}\\r\\n//menu items for the future\\r\\n/*if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '06000000'; //menu 1 and 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '04000000'; //menu 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '02000000'; //menu 1\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '00000000'; // no menu\\r\\n} else {\\r\\n messageBody += '00000000'; // no menu\\r\\n}*/\\r\\n// from autohome page to the end\\r\\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\\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\\n//AddValueSMS('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":1764100744},{"Type":1,"NewValue":"{\"Id\":5806,\"Name\":\"setWatchSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"// Watch Settings\\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 Watch Settings' Only enable y disable:\\r\\n// params.StepCounting.EnableDisableStepCounting == 'true'\\r\\n// params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true'\\r\\n//var params = {StepCounting:{'EnableDisableStepCounting':'true'},HeartRateMonitor:{'EnableDisableHeartRateMonitor':'true'}, DeviceVersion:{'DeviceVersion':2}}\\r\\n// Test enabled both\\r\\n// AB 10 13 00 99 6A 0A 00 02 11 36 00 08 1B 00 00 0E 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step on HRT off\\r\\n// AB 10 13 00 DD 0C 0B 00 02 11 36 00 08 0B 00 00 0C 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step off HRT on\\r\\n// AB 10 13 00 B5 D0 09 00 02 11 36 00 08 13 00 00 0A 00 00 00 14 00 00 00 03 0A 01\\r\\n// test both off \\r\\n// AB 10 13 00 F1 B6 0C 00 02 11 36 00 08 03 00 00 08 00 00 00 14 00 00 00 03 0A 01 \\r\\n// comando para Contact on ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 4C 2E 03 00 02 11 36 00 08 1B 00 00 4E 00 00 00 14 00 00 00 03 0A 01\\r\\n// comando para contact off ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 C2 8C 04 00 02 11 36 00 08 1B 00 00 46 00 00 00 14 00 00 00 03 0A 01\\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\n// To store the quantity of contacts in the whitelist to enable disable the contact menu\\r\\n//var contactos = params.ApprovedContacts && params.ApprovedContacts.Contact;\\r\\nvar numDuplas = Array.isArray(params.ApprovedContacts) ? params.ApprovedContacts.length : 0;\\r\\n// configuration command (0X02) , lenght and key\\r\\nvar messageBody = '021136';\\r\\n// step count/heart value display\\r\\n// Watch setting related FACE ID\\r\\nmessageBody += '00'; // Default FACE ID 0 \\r\\n// Future\\r\\n//if (params.WatchFace.SetWatchFace) {\\r\\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \\r\\n//} else {\\r\\n// messageBody += '00'; // Analog Face Default FACE ID 0 \\r\\n//}\\r\\n// Watch Display setting related to Step and heart rate settings\\r\\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '081B0000'; //both displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += (numDuplas > 0) ? 'E' : '6';\\r\\n //messageBody += '6'; //menu 1 and 2 \\r\\n //messageBody += 'E'; //menu 1 and 2 and contact (menu 3) \\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '080B0000'; // step display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '4'; //menu 2 \\r\\n //messageBody += 'C'; // menu 2 and contact (menu 3) \\r\\n messageBody += (numDuplas > 0) ? 'C' : '4';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '08130000'; // heart display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '2'; //menu 1 no contact (menu 3) \\r\\n //messageBody += 'A'; //menu 1 and contact (menu 3) \\r\\n messageBody += (numDuplas > 0) ? 'A' : '2';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '08030000'; // no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '0000000'; // no menu , //08 only contact\\r\\n //messageBody += '8'; // //08 only contact\\r\\n messageBody += (numDuplas > 0) ? '8' : '0';\\r\\n messageBody += '000000'; // other settings\\r\\n} else {\\r\\n messageBody += '08030000'; //no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '0000000'; // no menu..\\r\\n}\\r\\n//menu items for the future\\r\\n/*if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '06000000'; //menu 1 and 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '04000000'; //menu 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '02000000'; //menu 1\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '00000000'; // no menu\\r\\n} else {\\r\\n messageBody += '00000000'; // no menu\\r\\n}*/\\r\\n// from autohome page to the end\\r\\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\\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\\n//AddValueSMS('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":1764101454},{"Type":1,"NewValue":"{\"Id\":5806,\"Name\":\"setWatchSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"// Watch Settings\\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 Watch Settings' Only enable y disable:\\r\\n// params.StepCounting.EnableDisableStepCounting == 'true'\\r\\n// params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true'\\r\\n//var params = {StepCounting:{'EnableDisableStepCounting':'true'},HeartRateMonitor:{'EnableDisableHeartRateMonitor':'true'}, DeviceVersion:{'DeviceVersion':2}}\\r\\n// Test enabled both\\r\\n// AB 10 13 00 99 6A 0A 00 02 11 36 00 08 1B 00 00 0E 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step on HRT off\\r\\n// AB 10 13 00 DD 0C 0B 00 02 11 36 00 08 0B 00 00 0C 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step off HRT on\\r\\n// AB 10 13 00 B5 D0 09 00 02 11 36 00 08 13 00 00 0A 00 00 00 14 00 00 00 03 0A 01\\r\\n// test both off \\r\\n// AB 10 13 00 F1 B6 0C 00 02 11 36 00 08 03 00 00 08 00 00 00 14 00 00 00 03 0A 01 \\r\\n// comando para Contact on ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 4C 2E 03 00 02 11 36 00 08 1B 00 00 4E 00 00 00 14 00 00 00 03 0A 01\\r\\n// comando para contact off ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 C2 8C 04 00 02 11 36 00 08 1B 00 00 46 00 00 00 14 00 00 00 03 0A 01\\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\nvar idsToUpdate = [];\\r\\n// To store the quantity of contacts in the whitelist to enable disable the contact menu\\r\\n//var contactos = params.ApprovedContacts && params.ApprovedContacts.Contact;\\r\\nvar numDuplas = Array.isArray(params.ApprovedContacts) ? params.ApprovedContacts.length : 0;\\r\\n// configuration command (0X02) , lenght and key\\r\\nvar messageBody = '021136';\\r\\n// step count/heart value display\\r\\n// Watch setting related FACE ID\\r\\nmessageBody += '00'; // Default FACE ID 0 \\r\\n// Future\\r\\n//if (params.WatchFace.SetWatchFace) {\\r\\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \\r\\n//} else {\\r\\n// messageBody += '00'; // Analog Face Default FACE ID 0 \\r\\n//}\\r\\n// Watch Display setting related to Step and heart rate settings\\r\\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '081B0000'; //both displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += (numDuplas > 0) ? 'E' : '6';\\r\\n //messageBody += '6'; //menu 1 and 2 \\r\\n //messageBody += 'E'; //menu 1 and 2 and contact (menu 3) \\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '080B0000'; // step display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '4'; //menu 2 \\r\\n //messageBody += 'C'; // menu 2 and contact (menu 3) \\r\\n messageBody += (numDuplas > 0) ? 'C' : '4';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '08130000'; // heart display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '2'; //menu 1 no contact (menu 3) \\r\\n //messageBody += 'A'; //menu 1 and contact (menu 3) \\r\\n messageBody += (numDuplas > 0) ? 'A' : '2';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '08030000'; // no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '0000000'; // no menu , //08 only contact\\r\\n //messageBody += '8'; // //08 only contact\\r\\n messageBody += (numDuplas > 0) ? '8' : '0';\\r\\n messageBody += '000000'; // other settings\\r\\n} else {\\r\\n messageBody += '08030000'; //no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '0000000'; // no menu..\\r\\n}\\r\\n//menu items for the future\\r\\n/*if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '06000000'; //menu 1 and 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '04000000'; //menu 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '02000000'; //menu 1\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '00000000'; // no menu\\r\\n} else {\\r\\n messageBody += '00000000'; // no menu\\r\\n}*/\\r\\n// from autohome page to the end\\r\\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\\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\\n//AddValueSMS('dataSMS', dataSMS);\\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// 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":1764837636},{"Type":1,"NewValue":"{\"Id\":5806,\"Name\":\"setWatchSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"// Watch Settings\\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 Watch Settings' Only enable y disable:\\r\\n// params.StepCounting.EnableDisableStepCounting == 'true'\\r\\n// params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true'\\r\\n//var params = {StepCounting:{'EnableDisableStepCounting':'true'},HeartRateMonitor:{'EnableDisableHeartRateMonitor':'true'}, DeviceVersion:{'DeviceVersion':2}}\\r\\n// Test enabled both\\r\\n// AB 10 13 00 99 6A 0A 00 02 11 36 00 08 1B 00 00 0E 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step on HRT off\\r\\n// AB 10 13 00 DD 0C 0B 00 02 11 36 00 08 0B 00 00 0C 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step off HRT on\\r\\n// AB 10 13 00 B5 D0 09 00 02 11 36 00 08 13 00 00 0A 00 00 00 14 00 00 00 03 0A 01\\r\\n// test both off \\r\\n// AB 10 13 00 F1 B6 0C 00 02 11 36 00 08 03 00 00 08 00 00 00 14 00 00 00 03 0A 01 \\r\\n// comando para Contact on ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 4C 2E 03 00 02 11 36 00 08 1B 00 00 4E 00 00 00 14 00 00 00 03 0A 01\\r\\n// comando para contact off ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 C2 8C 04 00 02 11 36 00 08 1B 00 00 46 00 00 00 14 00 00 00 03 0A 01\\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\nvar idsToUpdate = [];\\r\\nvar notSend = false;\\r\\n// To store the quantity of contacts in the whitelist to enable disable the contact menu\\r\\n//var contactos = params.ApprovedContacts && params.ApprovedContacts.Contact;\\r\\nvar numDuplas = Array.isArray(params.ApprovedContacts) ? params.ApprovedContacts.length : 0;\\r\\n// configuration command (0X02) , lenght and key\\r\\nvar messageBody = '021136';\\r\\n// step count/heart value display\\r\\n// Watch setting related FACE ID\\r\\nmessageBody += '00'; // Default FACE ID 0 \\r\\n// Future\\r\\n//if (params.WatchFace.SetWatchFace) {\\r\\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \\r\\n//} else {\\r\\n// messageBody += '00'; // Analog Face Default FACE ID 0 \\r\\n//}\\r\\n// Watch Display setting related to Step and heart rate settings\\r\\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '081B0000'; //both displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += (numDuplas > 0) ? 'E' : '6';\\r\\n //messageBody += '6'; //menu 1 and 2 \\r\\n //messageBody += 'E'; //menu 1 and 2 and contact (menu 3) \\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '080B0000'; // step display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '4'; //menu 2 \\r\\n //messageBody += 'C'; // menu 2 and contact (menu 3) \\r\\n messageBody += (numDuplas > 0) ? 'C' : '4';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '08130000'; // heart display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '2'; //menu 1 no contact (menu 3) \\r\\n //messageBody += 'A'; //menu 1 and contact (menu 3) \\r\\n messageBody += (numDuplas > 0) ? 'A' : '2';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '08030000'; // no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '0000000'; // no menu , //08 only contact\\r\\n //messageBody += '8'; // //08 only contact\\r\\n messageBody += (numDuplas > 0) ? '8' : '0';\\r\\n messageBody += '000000'; // other settings\\r\\n} else {\\r\\n messageBody += '08030000'; //no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '0000000'; // no menu..\\r\\n}\\r\\n//menu items for the future\\r\\n/*if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '06000000'; //menu 1 and 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '04000000'; //menu 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '02000000'; //menu 1\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '00000000'; // no menu\\r\\n} else {\\r\\n messageBody += '00000000'; // no menu\\r\\n}*/\\r\\n// from autohome page to the end\\r\\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\\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\\n//AddValueSMS('dataSMS', dataSMS);\\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// 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":1764837717},{"Type":1,"NewValue":"{\"Id\":5806,\"Name\":\"setWatchSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"// Watch Settings\\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 Watch Settings' Only enable y disable:\\r\\n// params.StepCounting.EnableDisableStepCounting == 'true'\\r\\n// params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true'\\r\\n//var params = {StepCounting:{'EnableDisableStepCounting':'true'},HeartRateMonitor:{'EnableDisableHeartRateMonitor':'true'}, DeviceVersion:{'DeviceVersion':2}}\\r\\n// Test enabled both\\r\\n// AB 10 13 00 99 6A 0A 00 02 11 36 00 08 1B 00 00 0E 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step on HRT off\\r\\n// AB 10 13 00 DD 0C 0B 00 02 11 36 00 08 0B 00 00 0C 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step off HRT on\\r\\n// AB 10 13 00 B5 D0 09 00 02 11 36 00 08 13 00 00 0A 00 00 00 14 00 00 00 03 0A 01\\r\\n// test both off \\r\\n// AB 10 13 00 F1 B6 0C 00 02 11 36 00 08 03 00 00 08 00 00 00 14 00 00 00 03 0A 01 \\r\\n// comando para Contact on ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 4C 2E 03 00 02 11 36 00 08 1B 00 00 4E 00 00 00 14 00 00 00 03 0A 01\\r\\n// comando para contact off ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 C2 8C 04 00 02 11 36 00 08 1B 00 00 46 00 00 00 14 00 00 00 03 0A 01\\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\nvar idsToUpdate = [];\\r\\nvar notSend = false;\\r\\n// To store the quantity of contacts in the whitelist to enable disable the contact menu\\r\\n//var contactos = params.ApprovedContacts && params.ApprovedContacts.Contact;\\r\\nvar numDuplas = Array.isArray(params.ApprovedContacts) ? params.ApprovedContacts.length : 0;\\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// configuration command (0X02) , lenght and key\\r\\nvar messageBody = '021136';\\r\\n// step count/heart value display\\r\\n// Watch setting related FACE ID\\r\\nmessageBody += '00'; // Default FACE ID 0 \\r\\n// Future\\r\\n//if (params.WatchFace.SetWatchFace) {\\r\\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \\r\\n//} else {\\r\\n// messageBody += '00'; // Analog Face Default FACE ID 0 \\r\\n//}\\r\\n// Watch Display setting related to Step and heart rate settings\\r\\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '081B0000'; //both displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += (numDuplas > 0) ? 'E' : '6';\\r\\n //messageBody += '6'; //menu 1 and 2 \\r\\n //messageBody += 'E'; //menu 1 and 2 and contact (menu 3) \\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '080B0000'; // step display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '4'; //menu 2 \\r\\n //messageBody += 'C'; // menu 2 and contact (menu 3) \\r\\n messageBody += (numDuplas > 0) ? 'C' : '4';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '08130000'; // heart display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '2'; //menu 1 no contact (menu 3) \\r\\n //messageBody += 'A'; //menu 1 and contact (menu 3) \\r\\n messageBody += (numDuplas > 0) ? 'A' : '2';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '08030000'; // no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '0000000'; // no menu , //08 only contact\\r\\n //messageBody += '8'; // //08 only contact\\r\\n messageBody += (numDuplas > 0) ? '8' : '0';\\r\\n messageBody += '000000'; // other settings\\r\\n} else {\\r\\n messageBody += '08030000'; //no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '0000000'; // no menu..\\r\\n}\\r\\n//menu items for the future\\r\\n/*if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '06000000'; //menu 1 and 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '04000000'; //menu 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '02000000'; //menu 1\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '00000000'; // no menu\\r\\n} else {\\r\\n messageBody += '00000000'; // no menu\\r\\n}*/\\r\\n// from autohome page to the end\\r\\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\\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\\n//AddValueSMS('dataSMS', dataSMS);\\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// 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":1764838121},{"Type":1,"NewValue":"{\"Id\":5806,\"Name\":\"setWatchSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"// Watch Settings\\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 Watch Settings' Only enable y disable:\\r\\n// params.StepCounting.EnableDisableStepCounting == 'true'\\r\\n// params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true'\\r\\n//var params = {StepCounting:{'EnableDisableStepCounting':'true'},HeartRateMonitor:{'EnableDisableHeartRateMonitor':'true'}, DeviceVersion:{'DeviceVersion':2}}\\r\\n// Test enabled both\\r\\n// AB 10 13 00 99 6A 0A 00 02 11 36 00 08 1B 00 00 0E 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step on HRT off\\r\\n// AB 10 13 00 DD 0C 0B 00 02 11 36 00 08 0B 00 00 0C 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step off HRT on\\r\\n// AB 10 13 00 B5 D0 09 00 02 11 36 00 08 13 00 00 0A 00 00 00 14 00 00 00 03 0A 01\\r\\n// test both off \\r\\n// AB 10 13 00 F1 B6 0C 00 02 11 36 00 08 03 00 00 08 00 00 00 14 00 00 00 03 0A 01 \\r\\n// comando para Contact on ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 4C 2E 03 00 02 11 36 00 08 1B 00 00 4E 00 00 00 14 00 00 00 03 0A 01\\r\\n// comando para contact off ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 C2 8C 04 00 02 11 36 00 08 1B 00 00 46 00 00 00 14 00 00 00 03 0A 01\\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\n// To store the quantity of contacts in the whitelist to enable disable the contact menu\\r\\n//var contactos = params.ApprovedContacts && params.ApprovedContacts.Contact;\\r\\nvar numDuplas = Array.isArray(params.ApprovedContacts) ? params.ApprovedContacts.length : 0;\\r\\n// configuration command (0X02) , lenght and key\\r\\nvar messageBody = '021136';\\r\\n// step count/heart value display\\r\\n// Watch setting related FACE ID\\r\\nmessageBody += '00'; // Default FACE ID 0 \\r\\n// Future\\r\\n//if (params.WatchFace.SetWatchFace) {\\r\\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \\r\\n//} else {\\r\\n// messageBody += '00'; // Analog Face Default FACE ID 0 \\r\\n//}\\r\\n// Watch Display setting related to Step and heart rate settings\\r\\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '081B0000'; //both displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += (numDuplas > 0) ? 'E' : '6';\\r\\n //messageBody += '6'; //menu 1 and 2 \\r\\n //messageBody += 'E'; //menu 1 and 2 and contact (menu 3) \\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '080B0000'; // step display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '4'; //menu 2 \\r\\n //messageBody += 'C'; // menu 2 and contact (menu 3) \\r\\n messageBody += (numDuplas > 0) ? 'C' : '4';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '08130000'; // heart display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '2'; //menu 1 no contact (menu 3) \\r\\n //messageBody += 'A'; //menu 1 and contact (menu 3) \\r\\n messageBody += (numDuplas > 0) ? 'A' : '2';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '08030000'; // no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '0000000'; // no menu , //08 only contact\\r\\n //messageBody += '8'; // //08 only contact\\r\\n messageBody += (numDuplas > 0) ? '8' : '0';\\r\\n messageBody += '000000'; // other settings\\r\\n} else {\\r\\n messageBody += '08030000'; //no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '0000000'; // no menu..\\r\\n}\\r\\n//menu items for the future\\r\\n/*if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '06000000'; //menu 1 and 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '04000000'; //menu 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '02000000'; //menu 1\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '00000000'; // no menu\\r\\n} else {\\r\\n messageBody += '00000000'; // no menu\\r\\n}*/\\r\\n// from autohome page to the end\\r\\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\\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\\n//AddValueSMS('dataSMS', dataSMS);\\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// 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":1764838305},{"Type":1,"NewValue":"{\"Id\":5806,\"Name\":\"setWatchSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"// Watch Settings\\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 Watch Settings' Only enable y disable:\\r\\n// params.StepCounting.EnableDisableStepCounting == 'true'\\r\\n// params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true'\\r\\n//var params = {StepCounting:{'EnableDisableStepCounting':'true'},HeartRateMonitor:{'EnableDisableHeartRateMonitor':'true'}, DeviceVersion:{'DeviceVersion':2}}\\r\\n// Test enabled both\\r\\n// AB 10 13 00 99 6A 0A 00 02 11 36 00 08 1B 00 00 0E 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step on HRT off\\r\\n// AB 10 13 00 DD 0C 0B 00 02 11 36 00 08 0B 00 00 0C 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step off HRT on\\r\\n// AB 10 13 00 B5 D0 09 00 02 11 36 00 08 13 00 00 0A 00 00 00 14 00 00 00 03 0A 01\\r\\n// test both off \\r\\n// AB 10 13 00 F1 B6 0C 00 02 11 36 00 08 03 00 00 08 00 00 00 14 00 00 00 03 0A 01 \\r\\n// comando para Contact on ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 4C 2E 03 00 02 11 36 00 08 1B 00 00 4E 00 00 00 14 00 00 00 03 0A 01\\r\\n// comando para contact off ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 C2 8C 04 00 02 11 36 00 08 1B 00 00 46 00 00 00 14 00 00 00 03 0A 01\\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\n// To store the quantity of contacts in the whitelist to enable disable the contact menu\\r\\n//var contactos = params.ApprovedContacts && params.ApprovedContacts.Contact;\\r\\n//var numDuplas = Array.isArray(params.ApprovedContacts) ? params.ApprovedContacts.length : 0;\\r\\nvar numDuplas = params.ApprovedContacts.length;\\r\\n// configuration command (0X02) , lenght and key\\r\\nvar messageBody = '021136';\\r\\n// step count/heart value display\\r\\n// Watch setting related FACE ID\\r\\nmessageBody += '00'; // Default FACE ID 0 \\r\\n// Future\\r\\n//if (params.WatchFace.SetWatchFace) {\\r\\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \\r\\n//} else {\\r\\n// messageBody += '00'; // Analog Face Default FACE ID 0 \\r\\n//}\\r\\n// Watch Display setting related to Step and heart rate settings\\r\\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '081B0000'; //both displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += (numDuplas > 0) ? 'E' : '6';\\r\\n //messageBody += '6'; //menu 1 and 2 \\r\\n //messageBody += 'E'; //menu 1 and 2 and contact (menu 3) \\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '080B0000'; // step display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '4'; //menu 2 \\r\\n //messageBody += 'C'; // menu 2 and contact (menu 3) \\r\\n messageBody += (numDuplas > 0) ? 'C' : '4';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '08130000'; // heart display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '2'; //menu 1 no contact (menu 3) \\r\\n //messageBody += 'A'; //menu 1 and contact (menu 3) \\r\\n messageBody += (numDuplas > 0) ? 'A' : '2';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '08030000'; // no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '0000000'; // no menu , //08 only contact\\r\\n //messageBody += '8'; // //08 only contact\\r\\n messageBody += (numDuplas > 0) ? '8' : '0';\\r\\n messageBody += '000000'; // other settings\\r\\n} else {\\r\\n messageBody += '08030000'; //no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '0000000'; // no menu..\\r\\n}\\r\\n//menu items for the future\\r\\n/*if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '06000000'; //menu 1 and 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '04000000'; //menu 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '02000000'; //menu 1\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '00000000'; // no menu\\r\\n} else {\\r\\n messageBody += '00000000'; // no menu\\r\\n}*/\\r\\n// from autohome page to the end\\r\\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\\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\\n//AddValueSMS('dataSMS', dataSMS);\\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// 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":1764839274},{"Type":1,"NewValue":"{\"Id\":5806,\"Name\":\"setWatchSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"// Watch Settings\\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 Watch Settings' Only enable y disable:\\r\\n// params.StepCounting.EnableDisableStepCounting == 'true'\\r\\n// params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true'\\r\\n//var params = {StepCounting:{'EnableDisableStepCounting':'true'},HeartRateMonitor:{'EnableDisableHeartRateMonitor':'true'}, DeviceVersion:{'DeviceVersion':2}}\\r\\n// Test enabled both\\r\\n// AB 10 13 00 99 6A 0A 00 02 11 36 00 08 1B 00 00 0E 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step on HRT off\\r\\n// AB 10 13 00 DD 0C 0B 00 02 11 36 00 08 0B 00 00 0C 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step off HRT on\\r\\n// AB 10 13 00 B5 D0 09 00 02 11 36 00 08 13 00 00 0A 00 00 00 14 00 00 00 03 0A 01\\r\\n// test both off \\r\\n// AB 10 13 00 F1 B6 0C 00 02 11 36 00 08 03 00 00 08 00 00 00 14 00 00 00 03 0A 01 \\r\\n// comando para Contact on ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 4C 2E 03 00 02 11 36 00 08 1B 00 00 4E 00 00 00 14 00 00 00 03 0A 01\\r\\n// comando para contact off ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 C2 8C 04 00 02 11 36 00 08 1B 00 00 46 00 00 00 14 00 00 00 03 0A 01\\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\n// To store the quantity of contacts in the whitelist to enable disable the contact menu\\r\\n//var contactos = params.ApprovedContacts && params.ApprovedContacts.Contact;\\r\\n//var numDuplas = Array.isArray(params.ApprovedContacts) ? params.ApprovedContacts.length : 0;\\r\\nvar numDuplas = params.ApprovedContacts.Contact.length;\\r\\n// configuration command (0X02) , lenght and key\\r\\nvar messageBody = '021136';\\r\\n// step count/heart value display\\r\\n// Watch setting related FACE ID\\r\\nmessageBody += '00'; // Default FACE ID 0 \\r\\n// Future\\r\\n//if (params.WatchFace.SetWatchFace) {\\r\\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \\r\\n//} else {\\r\\n// messageBody += '00'; // Analog Face Default FACE ID 0 \\r\\n//}\\r\\n// Watch Display setting related to Step and heart rate settings\\r\\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '081B0000'; //both displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += (numDuplas > 0) ? 'E' : '6';\\r\\n //messageBody += '6'; //menu 1 and 2 \\r\\n //messageBody += 'E'; //menu 1 and 2 and contact (menu 3) \\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '080B0000'; // step display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '4'; //menu 2 \\r\\n //messageBody += 'C'; // menu 2 and contact (menu 3) \\r\\n messageBody += (numDuplas > 0) ? 'C' : '4';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '08130000'; // heart display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '2'; //menu 1 no contact (menu 3) \\r\\n //messageBody += 'A'; //menu 1 and contact (menu 3) \\r\\n messageBody += (numDuplas > 0) ? 'A' : '2';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '08030000'; // no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '0000000'; // no menu , //08 only contact\\r\\n //messageBody += '8'; // //08 only contact\\r\\n messageBody += (numDuplas > 0) ? '8' : '0';\\r\\n messageBody += '000000'; // other settings\\r\\n} else {\\r\\n messageBody += '08030000'; //no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '0000000'; // no menu..\\r\\n}\\r\\n//menu items for the future\\r\\n/*if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '06000000'; //menu 1 and 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '04000000'; //menu 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '02000000'; //menu 1\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '00000000'; // no menu\\r\\n} else {\\r\\n messageBody += '00000000'; // no menu\\r\\n}*/\\r\\n// from autohome page to the end\\r\\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\\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\\n//AddValueSMS('dataSMS', dataSMS);\\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// 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":1764840000},{"Type":1,"NewValue":"{\"Id\":5806,\"Name\":\"setWatchSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"// Watch Settings\\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 Watch Settings' Only enable y disable:\\r\\n// params.StepCounting.EnableDisableStepCounting == 'true'\\r\\n// params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true'\\r\\n//var params = {StepCounting:{'EnableDisableStepCounting':'true'},HeartRateMonitor:{'EnableDisableHeartRateMonitor':'true'}, DeviceVersion:{'DeviceVersion':2}}\\r\\n// Test enabled both\\r\\n// AB 10 13 00 99 6A 0A 00 02 11 36 00 08 1B 00 00 0E 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step on HRT off\\r\\n// AB 10 13 00 DD 0C 0B 00 02 11 36 00 08 0B 00 00 0C 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step off HRT on\\r\\n// AB 10 13 00 B5 D0 09 00 02 11 36 00 08 13 00 00 0A 00 00 00 14 00 00 00 03 0A 01\\r\\n// test both off \\r\\n// AB 10 13 00 F1 B6 0C 00 02 11 36 00 08 03 00 00 08 00 00 00 14 00 00 00 03 0A 01 \\r\\n// comando para Contact on ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 4C 2E 03 00 02 11 36 00 08 1B 00 00 4E 00 00 00 14 00 00 00 03 0A 01\\r\\n// comando para contact off ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 C2 8C 04 00 02 11 36 00 08 1B 00 00 46 00 00 00 14 00 00 00 03 0A 01\\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\n// To store the quantity of contacts in the whitelist to enable disable the contact menu\\r\\n//var contactos = params.ApprovedContacts && params.ApprovedContacts.Contact;\\r\\n//var numDuplas = Array.isArray(params.ApprovedContacts) ? params.ApprovedContacts.length : 0;\\r\\nvar numDuplas = paramsChanged.ApprovedContacts.lenght;\\r\\n// configuration command (0X02) , lenght and key\\r\\nvar messageBody = '021136';\\r\\n// step count/heart value display\\r\\n// Watch setting related FACE ID\\r\\nmessageBody += '00'; // Default FACE ID 0 \\r\\n// Future\\r\\n//if (params.WatchFace.SetWatchFace) {\\r\\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \\r\\n//} else {\\r\\n// messageBody += '00'; // Analog Face Default FACE ID 0 \\r\\n//}\\r\\n// Watch Display setting related to Step and heart rate settings\\r\\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '081B0000'; //both displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += (numDuplas > 0) ? 'E' : '6';\\r\\n //messageBody += '6'; //menu 1 and 2 \\r\\n //messageBody += 'E'; //menu 1 and 2 and contact (menu 3) \\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '080B0000'; // step display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '4'; //menu 2 \\r\\n //messageBody += 'C'; // menu 2 and contact (menu 3) \\r\\n messageBody += (numDuplas > 0) ? 'C' : '4';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '08130000'; // heart display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '2'; //menu 1 no contact (menu 3) \\r\\n //messageBody += 'A'; //menu 1 and contact (menu 3) \\r\\n messageBody += (numDuplas > 0) ? 'A' : '2';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '08030000'; // no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '0000000'; // no menu , //08 only contact\\r\\n //messageBody += '8'; // //08 only contact\\r\\n messageBody += (numDuplas > 0) ? '8' : '0';\\r\\n messageBody += '000000'; // other settings\\r\\n} else {\\r\\n messageBody += '08030000'; //no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '0000000'; // no menu..\\r\\n}\\r\\n//menu items for the future\\r\\n/*if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '06000000'; //menu 1 and 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '04000000'; //menu 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '02000000'; //menu 1\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '00000000'; // no menu\\r\\n} else {\\r\\n messageBody += '00000000'; // no menu\\r\\n}*/\\r\\n// from autohome page to the end\\r\\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\\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\\n//AddValueSMS('dataSMS', dataSMS);\\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// 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":1764840561},{"Type":1,"NewValue":"{\"Id\":5806,\"Name\":\"setWatchSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"// Watch Settings\\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 Watch Settings' Only enable y disable:\\r\\n// params.StepCounting.EnableDisableStepCounting == 'true'\\r\\n// params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true'\\r\\n//var params = {StepCounting:{'EnableDisableStepCounting':'true'},HeartRateMonitor:{'EnableDisableHeartRateMonitor':'true'}, DeviceVersion:{'DeviceVersion':2}}\\r\\n// Test enabled both\\r\\n// AB 10 13 00 99 6A 0A 00 02 11 36 00 08 1B 00 00 0E 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step on HRT off\\r\\n// AB 10 13 00 DD 0C 0B 00 02 11 36 00 08 0B 00 00 0C 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step off HRT on\\r\\n// AB 10 13 00 B5 D0 09 00 02 11 36 00 08 13 00 00 0A 00 00 00 14 00 00 00 03 0A 01\\r\\n// test both off \\r\\n// AB 10 13 00 F1 B6 0C 00 02 11 36 00 08 03 00 00 08 00 00 00 14 00 00 00 03 0A 01 \\r\\n// comando para Contact on ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 4C 2E 03 00 02 11 36 00 08 1B 00 00 4E 00 00 00 14 00 00 00 03 0A 01\\r\\n// comando para contact off ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 C2 8C 04 00 02 11 36 00 08 1B 00 00 46 00 00 00 14 00 00 00 03 0A 01\\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\n// To store the quantity of contacts in the whitelist to enable disable the contact menu\\r\\n//var contactos = params.ApprovedContacts && params.ApprovedContacts.Contact;\\r\\n//var numDuplas = Array.isArray(params.ApprovedContacts) ? params.ApprovedContacts.length : 0;\\r\\nvar numDuplas = params.ApprovedContacts[0].Contact.length;\\r\\n// configuration command (0X02) , lenght and key\\r\\nvar messageBody = '021136';\\r\\n// step count/heart value display\\r\\n// Watch setting related FACE ID\\r\\nmessageBody += '00'; // Default FACE ID 0 \\r\\n// Future\\r\\n//if (params.WatchFace.SetWatchFace) {\\r\\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \\r\\n//} else {\\r\\n// messageBody += '00'; // Analog Face Default FACE ID 0 \\r\\n//}\\r\\n// Watch Display setting related to Step and heart rate settings\\r\\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '081B0000'; //both displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += (numDuplas > 0) ? 'E' : '6';\\r\\n //messageBody += '6'; //menu 1 and 2 \\r\\n //messageBody += 'E'; //menu 1 and 2 and contact (menu 3) \\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '080B0000'; // step display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '4'; //menu 2 \\r\\n //messageBody += 'C'; // menu 2 and contact (menu 3) \\r\\n messageBody += (numDuplas > 0) ? 'C' : '4';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '08130000'; // heart display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '2'; //menu 1 no contact (menu 3) \\r\\n //messageBody += 'A'; //menu 1 and contact (menu 3) \\r\\n messageBody += (numDuplas > 0) ? 'A' : '2';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '08030000'; // no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '0000000'; // no menu , //08 only contact\\r\\n //messageBody += '8'; // //08 only contact\\r\\n messageBody += (numDuplas > 0) ? '8' : '0';\\r\\n messageBody += '000000'; // other settings\\r\\n} else {\\r\\n messageBody += '08030000'; //no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '0000000'; // no menu..\\r\\n}\\r\\n//menu items for the future\\r\\n/*if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '06000000'; //menu 1 and 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '04000000'; //menu 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '02000000'; //menu 1\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '00000000'; // no menu\\r\\n} else {\\r\\n messageBody += '00000000'; // no menu\\r\\n}*/\\r\\n// from autohome page to the end\\r\\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\\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\\n//AddValueSMS('dataSMS', dataSMS);\\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// 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":1764840793},{"Type":1,"NewValue":"{\"Id\":5806,\"Name\":\"setWatchSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"// Watch Settings\\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 Watch Settings' Only enable y disable:\\r\\n// params.StepCounting.EnableDisableStepCounting == 'true'\\r\\n// params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true'\\r\\n//var params = {StepCounting:{'EnableDisableStepCounting':'true'},HeartRateMonitor:{'EnableDisableHeartRateMonitor':'true'}, DeviceVersion:{'DeviceVersion':2}}\\r\\n// Test enabled both\\r\\n// AB 10 13 00 99 6A 0A 00 02 11 36 00 08 1B 00 00 0E 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step on HRT off\\r\\n// AB 10 13 00 DD 0C 0B 00 02 11 36 00 08 0B 00 00 0C 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step off HRT on\\r\\n// AB 10 13 00 B5 D0 09 00 02 11 36 00 08 13 00 00 0A 00 00 00 14 00 00 00 03 0A 01\\r\\n// test both off \\r\\n// AB 10 13 00 F1 B6 0C 00 02 11 36 00 08 03 00 00 08 00 00 00 14 00 00 00 03 0A 01 \\r\\n// comando para Contact on ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 4C 2E 03 00 02 11 36 00 08 1B 00 00 4E 00 00 00 14 00 00 00 03 0A 01\\r\\n// comando para contact off ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 C2 8C 04 00 02 11 36 00 08 1B 00 00 46 00 00 00 14 00 00 00 03 0A 01\\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\n// To store the quantity of contacts in the whitelist to enable disable the contact menu\\r\\n//var contactos = params.ApprovedContacts && params.ApprovedContacts.Contact;\\r\\n//var numDuplas = Array.isArray(params.ApprovedContacts) ? params.ApprovedContacts.length : 0;\\r\\nvar numDuplas = params.ApprovedContacts;\\r\\n// configuration command (0X02) , lenght and key\\r\\nvar messageBody = '021136';\\r\\n// step count/heart value display\\r\\n// Watch setting related FACE ID\\r\\nmessageBody += '00'; // Default FACE ID 0 \\r\\n// Future\\r\\n//if (params.WatchFace.SetWatchFace) {\\r\\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \\r\\n//} else {\\r\\n// messageBody += '00'; // Analog Face Default FACE ID 0 \\r\\n//}\\r\\n// Watch Display setting related to Step and heart rate settings\\r\\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '081B0000'; //both displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += (numDuplas > 0) ? 'E' : '6';\\r\\n //messageBody += '6'; //menu 1 and 2 \\r\\n //messageBody += 'E'; //menu 1 and 2 and contact (menu 3) \\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '080B0000'; // step display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '4'; //menu 2 \\r\\n //messageBody += 'C'; // menu 2 and contact (menu 3) \\r\\n messageBody += (numDuplas > 0) ? 'C' : '4';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '08130000'; // heart display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '2'; //menu 1 no contact (menu 3) \\r\\n //messageBody += 'A'; //menu 1 and contact (menu 3) \\r\\n messageBody += (numDuplas > 0) ? 'A' : '2';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '08030000'; // no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '0000000'; // no menu , //08 only contact\\r\\n //messageBody += '8'; // //08 only contact\\r\\n messageBody += (numDuplas > 0) ? '8' : '0';\\r\\n messageBody += '000000'; // other settings\\r\\n} else {\\r\\n messageBody += '08030000'; //no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '0000000'; // no menu..\\r\\n}\\r\\n//menu items for the future\\r\\n/*if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '06000000'; //menu 1 and 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '04000000'; //menu 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '02000000'; //menu 1\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '00000000'; // no menu\\r\\n} else {\\r\\n messageBody += '00000000'; // no menu\\r\\n}*/\\r\\n// from autohome page to the end\\r\\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\\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\\n//AddValueSMS('dataSMS', dataSMS);\\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// 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":1764841065},{"Type":1,"NewValue":"{\"Id\":5806,\"Name\":\"setWatchSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"// Watch Settings\\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 Watch Settings' Only enable y disable:\\r\\n// params.StepCounting.EnableDisableStepCounting == 'true'\\r\\n// params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true'\\r\\n//var params = {StepCounting:{'EnableDisableStepCounting':'true'},HeartRateMonitor:{'EnableDisableHeartRateMonitor':'true'}, DeviceVersion:{'DeviceVersion':2}}\\r\\n// Test enabled both\\r\\n// AB 10 13 00 99 6A 0A 00 02 11 36 00 08 1B 00 00 0E 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step on HRT off\\r\\n// AB 10 13 00 DD 0C 0B 00 02 11 36 00 08 0B 00 00 0C 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step off HRT on\\r\\n// AB 10 13 00 B5 D0 09 00 02 11 36 00 08 13 00 00 0A 00 00 00 14 00 00 00 03 0A 01\\r\\n// test both off \\r\\n// AB 10 13 00 F1 B6 0C 00 02 11 36 00 08 03 00 00 08 00 00 00 14 00 00 00 03 0A 01 \\r\\n// comando para Contact on ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 4C 2E 03 00 02 11 36 00 08 1B 00 00 4E 00 00 00 14 00 00 00 03 0A 01\\r\\n// comando para contact off ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 C2 8C 04 00 02 11 36 00 08 1B 00 00 46 00 00 00 14 00 00 00 03 0A 01\\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\n// To store the quantity of contacts in the whitelist to enable disable the contact menu\\r\\n//var contactos = params.ApprovedContacts && params.ApprovedContacts.Contact;\\r\\n//var numDuplas = Array.isArray(params.ApprovedContacts) ? params.ApprovedContacts.length : 0;\\r\\n//var numDuplas = params.ApprovedContacts;\\r\\nlet numDuplas = 0;\\r\\nfor (const key in params.ApprovedContacts) {\\r\\n if (params.ApprovedContacts[key] && params.ApprovedContacts[key].Contact && params.ApprovedContacts[key].Contact !== \\\"\\\") {\\r\\n numDuplas++;\\r\\n }\\r\\n}\\r\\n// configuration command (0X02) , lenght and key\\r\\nvar messageBody = '021136';\\r\\n// step count/heart value display\\r\\n// Watch setting related FACE ID\\r\\nmessageBody += '00'; // Default FACE ID 0 \\r\\n// Future\\r\\n//if (params.WatchFace.SetWatchFace) {\\r\\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \\r\\n//} else {\\r\\n// messageBody += '00'; // Analog Face Default FACE ID 0 \\r\\n//}\\r\\n// Watch Display setting related to Step and heart rate settings\\r\\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '081B0000'; //both displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += (numDuplas > 0) ? 'E' : '6';\\r\\n //messageBody += '6'; //menu 1 and 2 \\r\\n //messageBody += 'E'; //menu 1 and 2 and contact (menu 3) \\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '080B0000'; // step display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '4'; //menu 2 \\r\\n //messageBody += 'C'; // menu 2 and contact (menu 3) \\r\\n messageBody += (numDuplas > 0) ? 'C' : '4';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '08130000'; // heart display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '2'; //menu 1 no contact (menu 3) \\r\\n //messageBody += 'A'; //menu 1 and contact (menu 3) \\r\\n messageBody += (numDuplas > 0) ? 'A' : '2';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '08030000'; // no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '0000000'; // no menu , //08 only contact\\r\\n //messageBody += '8'; // //08 only contact\\r\\n messageBody += (numDuplas > 0) ? '8' : '0';\\r\\n messageBody += '000000'; // other settings\\r\\n} else {\\r\\n messageBody += '08030000'; //no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '0000000'; // no menu..\\r\\n}\\r\\n//menu items for the future\\r\\n/*if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '06000000'; //menu 1 and 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '04000000'; //menu 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '02000000'; //menu 1\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '00000000'; // no menu\\r\\n} else {\\r\\n messageBody += '00000000'; // no menu\\r\\n}*/\\r\\n// from autohome page to the end\\r\\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\\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\\n//AddValueSMS('dataSMS', dataSMS);\\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// 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":1764842271},{"Type":1,"NewValue":"{\"Id\":5806,\"Name\":\"setWatchSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"// Watch Settings\\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 Watch Settings' Only enable y disable:\\r\\n// params.StepCounting.EnableDisableStepCounting == 'true'\\r\\n// params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true'\\r\\n//var params = {StepCounting:{'EnableDisableStepCounting':'true'},HeartRateMonitor:{'EnableDisableHeartRateMonitor':'true'}, DeviceVersion:{'DeviceVersion':2}}\\r\\n// Test enabled both\\r\\n// AB 10 13 00 99 6A 0A 00 02 11 36 00 08 1B 00 00 0E 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step on HRT off\\r\\n// AB 10 13 00 DD 0C 0B 00 02 11 36 00 08 0B 00 00 0C 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step off HRT on\\r\\n// AB 10 13 00 B5 D0 09 00 02 11 36 00 08 13 00 00 0A 00 00 00 14 00 00 00 03 0A 01\\r\\n// test both off \\r\\n// AB 10 13 00 F1 B6 0C 00 02 11 36 00 08 03 00 00 08 00 00 00 14 00 00 00 03 0A 01 \\r\\n// comando para Contact on ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 4C 2E 03 00 02 11 36 00 08 1B 00 00 4E 00 00 00 14 00 00 00 03 0A 01\\r\\n// comando para contact off ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 C2 8C 04 00 02 11 36 00 08 1B 00 00 46 00 00 00 14 00 00 00 03 0A 01\\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\n// To store the quantity of contacts in the whitelist to enable disable the contact menu\\r\\n//var contactos = params.ApprovedContacts && params.ApprovedContacts.Contact;\\r\\n//var numDuplas = Array.isArray(params.ApprovedContacts) ? params.ApprovedContacts.length : 0;\\r\\n//var numDuplas = params.ApprovedContacts;\\r\\nlet numDuplas = 0;\\r\\n//for (const key in params.ApprovedContacts) {\\r\\n// if (params.ApprovedContacts[key] && params.ApprovedContacts[key].Contact && params.ApprovedContacts[key].Contact !== \\\"\\\") {\\r\\n// numDuplas++;\\r\\n// }\\r\\n//}\\r\\nfor (const key in params.ApprovedContacts) {\\r\\n // if (params.ApprovedContacts[key] && params.ApprovedContacts[key].Contact && params.ApprovedContacts[key].Contact !== \\\"\\\") {\\r\\n numDuplas++;\\r\\n // }\\r\\n}\\r\\n// configuration command (0X02) , lenght and key\\r\\nvar messageBody = '021136';\\r\\n// step count/heart value display\\r\\n// Watch setting related FACE ID\\r\\nmessageBody += '00'; // Default FACE ID 0 \\r\\n// Future\\r\\n//if (params.WatchFace.SetWatchFace) {\\r\\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \\r\\n//} else {\\r\\n// messageBody += '00'; // Analog Face Default FACE ID 0 \\r\\n//}\\r\\n// Watch Display setting related to Step and heart rate settings\\r\\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '081B0000'; //both displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += (numDuplas > 0) ? 'E' : '6';\\r\\n //messageBody += '6'; //menu 1 and 2 \\r\\n //messageBody += 'E'; //menu 1 and 2 and contact (menu 3) \\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '080B0000'; // step display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '4'; //menu 2 \\r\\n //messageBody += 'C'; // menu 2 and contact (menu 3) \\r\\n messageBody += (numDuplas > 0) ? 'C' : '4';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '08130000'; // heart display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '2'; //menu 1 no contact (menu 3) \\r\\n //messageBody += 'A'; //menu 1 and contact (menu 3) \\r\\n messageBody += (numDuplas > 0) ? 'A' : '2';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '08030000'; // no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '0000000'; // no menu , //08 only contact\\r\\n //messageBody += '8'; // //08 only contact\\r\\n messageBody += (numDuplas > 0) ? '8' : '0';\\r\\n messageBody += '000000'; // other settings\\r\\n} else {\\r\\n messageBody += '08030000'; //no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '0000000'; // no menu..\\r\\n}\\r\\n//menu items for the future\\r\\n/*if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '06000000'; //menu 1 and 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '04000000'; //menu 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '02000000'; //menu 1\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '00000000'; // no menu\\r\\n} else {\\r\\n messageBody += '00000000'; // no menu\\r\\n}*/\\r\\n// from autohome page to the end\\r\\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\\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\\n//AddValueSMS('dataSMS', dataSMS);\\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// 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":1764842718},{"Type":1,"NewValue":"{\"Id\":5806,\"Name\":\"setWatchSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"// Watch Settings\\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 Watch Settings' Only enable y disable:\\r\\n// params.StepCounting.EnableDisableStepCounting == 'true'\\r\\n// params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true'\\r\\n//var params = {StepCounting:{'EnableDisableStepCounting':'true'},HeartRateMonitor:{'EnableDisableHeartRateMonitor':'true'}, DeviceVersion:{'DeviceVersion':2}}\\r\\n// Test enabled both\\r\\n// AB 10 13 00 99 6A 0A 00 02 11 36 00 08 1B 00 00 0E 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step on HRT off\\r\\n// AB 10 13 00 DD 0C 0B 00 02 11 36 00 08 0B 00 00 0C 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step off HRT on\\r\\n// AB 10 13 00 B5 D0 09 00 02 11 36 00 08 13 00 00 0A 00 00 00 14 00 00 00 03 0A 01\\r\\n// test both off \\r\\n// AB 10 13 00 F1 B6 0C 00 02 11 36 00 08 03 00 00 08 00 00 00 14 00 00 00 03 0A 01 \\r\\n// comando para Contact on ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 4C 2E 03 00 02 11 36 00 08 1B 00 00 4E 00 00 00 14 00 00 00 03 0A 01\\r\\n// comando para contact off ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 C2 8C 04 00 02 11 36 00 08 1B 00 00 46 00 00 00 14 00 00 00 03 0A 01\\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\n// To store the quantity of contacts in the whitelist to enable disable the contact menu\\r\\n//var contactos = params.ApprovedContacts && params.ApprovedContacts.Contact;\\r\\n//var numDuplas = Array.isArray(params.ApprovedContacts) ? params.ApprovedContacts.length : 0;\\r\\n//var numDuplas = params.ApprovedContacts;\\r\\nlet numDuplas = 2;\\r\\n//for (const key in params.ApprovedContacts) {\\r\\n// if (params.ApprovedContacts[key] && params.ApprovedContacts[key].Contact && params.ApprovedContacts[key].Contact !== \\\"\\\") {\\r\\n// numDuplas++;\\r\\n// }\\r\\n//}\\r\\n//for (const key in params.ApprovedContacts) {\\r\\n// if (params.ApprovedContacts[key] && params.ApprovedContacts[key].Contact && params.ApprovedContacts[key].Contact !== \\\"\\\") {\\r\\n// numDuplas++;\\r\\n// }\\r\\n//}\\r\\n// configuration command (0X02) , lenght and key\\r\\nvar messageBody = '021136';\\r\\n// step count/heart value display\\r\\n// Watch setting related FACE ID\\r\\nmessageBody += '00'; // Default FACE ID 0 \\r\\n// Future\\r\\n//if (params.WatchFace.SetWatchFace) {\\r\\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \\r\\n//} else {\\r\\n// messageBody += '00'; // Analog Face Default FACE ID 0 \\r\\n//}\\r\\n// Watch Display setting related to Step and heart rate settings\\r\\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '081B0000'; //both displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += (numDuplas > 0) ? 'E' : '6';\\r\\n //messageBody += '6'; //menu 1 and 2 \\r\\n //messageBody += 'E'; //menu 1 and 2 and contact (menu 3) \\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '080B0000'; // step display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '4'; //menu 2 \\r\\n //messageBody += 'C'; // menu 2 and contact (menu 3) \\r\\n messageBody += (numDuplas > 0) ? 'C' : '4';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '08130000'; // heart display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '2'; //menu 1 no contact (menu 3) \\r\\n //messageBody += 'A'; //menu 1 and contact (menu 3) \\r\\n messageBody += (numDuplas > 0) ? 'A' : '2';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '08030000'; // no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '0000000'; // no menu , //08 only contact\\r\\n //messageBody += '8'; // //08 only contact\\r\\n messageBody += (numDuplas > 0) ? '8' : '0';\\r\\n messageBody += '000000'; // other settings\\r\\n} else {\\r\\n messageBody += '08030000'; //no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '0000000'; // no menu..\\r\\n}\\r\\n//menu items for the future\\r\\n/*if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '06000000'; //menu 1 and 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '04000000'; //menu 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '02000000'; //menu 1\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '00000000'; // no menu\\r\\n} else {\\r\\n messageBody += '00000000'; // no menu\\r\\n}*/\\r\\n// from autohome page to the end\\r\\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\\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\\n//AddValueSMS('dataSMS', dataSMS);\\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// 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":1765218047}],"Tags":[]},{"Id":5807,"Name":"setEnableStep","TemplateSMS":null,"Template":"<>","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 true\nvalue += '1';\n// Voice true\nvalue += '1';\n// Vibration true\nvalue += '1';\n// Cell Tower True\nvalue += '1';\n// Wifi true\nvalue += '1';\n// SOS speaker true\nvalue += '1';\n// Side call Speaker true\nvalue += '1';\n// BLE stay connected true\nvalue += '1';\n// BLE locating true\nvalue += '1';\n// SOS Call Voice true\nvalue += '1';\n// BLE always on true\nvalue += '1';\n// GPS location true\nvalue += '1';\n// TCP fast true\nvalue += '1';\n// Rotate screen to iluminate true\nvalue += '1'; //watch only girar muñeca para iluminar pantalla\n// Beacon true\nvalue += '1';\n// activity fuction true\nvalue += '1'; // activity fuction, \n//step counting, \nif (params.StepsSettings.EnableDisableStepsSettings == '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';\n// stop call sequence true\nvalue += '1';\n// other no use\nvalue += '00000000';\n// auto update false\nvalue += '0';\n// AGPS true\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":[{"Type":0,"NewValue":"{\"Id\":5807,\"Name\":\"setEnableStep\",\"TemplateSMS\":null,\"Template\":\"<>\",\"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 true\\nvalue += '1';\\n// Voice true\\nvalue += '1';\\n// Vibration true\\nvalue += '1';\\n// Cell Tower True\\nvalue += '1';\\n// Wifi true\\nvalue += '1';\\n// SOS speaker true\\nvalue += '1';\\n// Side call Speaker true\\nvalue += '1';\\n// BLE stay connected true\\nvalue += '1';\\n// BLE locating true\\nvalue += '1';\\n// SOS Call Voice true\\nvalue += '1';\\n// BLE always on true\\nvalue += '1';\\n// GPS location true\\nvalue += '1';\\n// TCP fast true\\nvalue += '1';\\n// Rotate screen to iluminate true\\nvalue += '1'; //watch only girar muñeca para iluminar pantalla\\n// Beacon true\\nvalue += '1';\\n// activity fuction true\\nvalue += '1'; // activity fuction, \\n//step counting, \\nif (params.StepsSettings.EnableDisableStepsSettings == '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';\\n// stop call sequence true\\nvalue += '1';\\n// other no use\\nvalue += '00000000';\\n// auto update false\\nvalue += '0';\\n// AGPS true\\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":1749059198},{"Type":1,"NewValue":"{\"Id\":5807,\"Name\":\"setEnableStep\",\"TemplateSMS\":null,\"Template\":\"<>\",\"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 true\\nvalue += '1';\\n// Voice true\\nvalue += '1';\\n// Vibration true\\nvalue += '1';\\n// Cell Tower True\\nvalue += '1';\\n// Wifi true\\nvalue += '1';\\n// SOS speaker true\\nvalue += '1';\\n// Side call Speaker true\\nvalue += '1';\\n// BLE stay connected true\\nvalue += '1';\\n// BLE locating true\\nvalue += '1';\\n// SOS Call Voice true\\nvalue += '1';\\n// BLE always on true\\nvalue += '1';\\n// GPS location true\\nvalue += '1';\\n// TCP fast false to force send location on Alarm msgs\\nvalue += '0';\\n// Rotate screen to iluminate true\\nvalue += '1'; //watch only girar muñeca para iluminar pantalla\\n// Beacon true\\nvalue += '1';\\n// activity fuction true\\nvalue += '1'; // activity fuction, \\n//step counting, \\nif (params.StepsSettings.EnableDisableStepsSettings == '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';\\n// stop call sequence true\\nvalue += '1';\\n// other no use\\nvalue += '00000000';\\n// auto update false\\nvalue += '0';\\n// AGPS true\\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":1763456936}],"Tags":[]},{"Id":5818,"Name":"setSPOInterval","TemplateSMS":null,"Template":"<>","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.HeartrateSettings.ReportingFrequency) {\n var heartBeat = parseInt(params.HeartrateSettings.ReportingFrequency) * 60; //in seconds\n heartBeat = decimalToHex(heartBeat);\n heartBeat = ('000000' + heartBeat).slice(-6).toUpperCase();\n if (params.HeartrateSettings.EnableDisableHeartrateSettings == '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 = '58020000'\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":2,"ProtocolActionObjects":[{"Type":0,"NewValue":"{\"Id\":5818,\"Name\":\"setSPOInterval\",\"TemplateSMS\":null,\"Template\":\"<>\",\"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.HeartrateSettings.ReportingFrequency) {\\n var heartBeat = parseInt(params.HeartrateSettings.ReportingFrequency) * 60; //in seconds\\n heartBeat = decimalToHex(heartBeat);\\n heartBeat = ('000000' + heartBeat).slice(-6).toUpperCase();\\n if (params.HeartrateSettings.EnableDisableHeartrateSettings == '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 = '58020000'\\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\":2,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1762892227},{"Type":1,"NewValue":"{\"Id\":5818,\"Name\":\"setSPOInterval\",\"TemplateSMS\":null,\"Template\":\"<>\",\"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.SPO2Settings.ReportingFrequency) {\\n var heartBeat = parseInt(params.SPO2Settings.ReportingFrequency) * 60; //in seconds\\n heartBeat = decimalToHex(heartBeat);\\n heartBeat = ('000000' + heartBeat).slice(-6).toUpperCase();\\n if (params.SPO2Settings.EnableDisableSPO2Settings == '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 = '58020000'\\n} // disable and 600 seconds\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\nvar command = '02';\\nvar keyLength = '05';\\nvar key = '7A';\\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\":2,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1762893497}],"Tags":[]},{"Id":5819,"Name":"setAuthorisedNumbersAndWatchSettings","TemplateSMS":null,"Template":"<>","AckTemplate":null,"Operation":"//updated v 3 for EV06\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//[Length]:10 [Key]:34 [Value]:E0 09 31 32 33 34 35 36 37 38 39 02 79 6F 00\r\n//{\"numberNamePhoto\":{\"call\":1,\"noCard\":0,\"number\":\"123456789\",\"enable\":1,\"sms\":1,\"name\":\"yo\",\"headURL\":\"\",\"index\":0}}\r\n// para pruebas en local Contact':\r\n//AB 10 12 00 94 ED 00 00 02 10 34 E0 09 31 32 33 34 35 36 37 38 39 02 79 6F 00\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 phoneNumber = '';\r\nvar numberLength = '00';\r\nvar numberHex = '';\r\nvar nameLength = '00';\r\nvar nameHex = '';\r\nvar value = '02';\r\nvar keyLength = '00';\r\nvar confTel = '';\r\nvar count = 1; // approved contact will be from A2 to A9 - index 1 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 += \"0534\" + 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 phoneNumber = params.ApprovedContacts[contact].Contact;\r\n if (phoneNumber.startsWith(\"+\")) {\r\n phoneNumber = \"00\" + phoneNumber.substring(1);\r\n }\r\n numberHex = ascii_to_hexa(phoneNumber).toUpperCase();\r\n numberLength = ('00' + decimalToHex(phoneNumber.length)).slice(-2).toUpperCase();\r\n nameHex = ascii_to_hexa(params.ApprovedContacts[contact].Name).toUpperCase();\r\n nameLength = ('00' + decimalToHex(params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\r\n keyLength = ('00' + decimalToHex(5 + phoneNumber.length + params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\r\n value += keyLength + \"34\" + confTel + numberLength + numberHex + nameLength + nameHex + '00'; //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 phoneNumber = params.ApprovedContacts[contact].Contact;\r\n if (phoneNumber.startsWith(\"+\")) {\r\n phoneNumber = \"00\" + phoneNumber.substring(1);\r\n }\r\n numberHex = ascii_to_hexa(phoneNumber).toUpperCase();\r\n numberLength = ('00' + decimalToHex(phoneNumber.length)).slice(-2).toUpperCase();\r\n nameHex = ascii_to_hexa(params.ApprovedContacts[contact].Name).toUpperCase();\r\n nameLength = ('00' + decimalToHex(params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\r\n keyLength = ('00' + decimalToHex(5 + phoneNumber.length + params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\r\n value += keyLength + \"34\" + confTel + numberLength + numberHex + nameLength + nameHex + '00'; //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 += \"0534\" + 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":2,"ProtocolActionObjects":[{"Type":0,"NewValue":"{\"Id\":5819,\"Name\":\"setAuthorisedNumbersAndWatchSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"//updated v 3 for EV06\\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//[Length]:10 [Key]:34 [Value]:E0 09 31 32 33 34 35 36 37 38 39 02 79 6F 00\\r\\n//{\\\"numberNamePhoto\\\":{\\\"call\\\":1,\\\"noCard\\\":0,\\\"number\\\":\\\"123456789\\\",\\\"enable\\\":1,\\\"sms\\\":1,\\\"name\\\":\\\"yo\\\",\\\"headURL\\\":\\\"\\\",\\\"index\\\":0}}\\r\\n// para pruebas en local Contact':\\r\\n//AB 10 12 00 94 ED 00 00 02 10 34 E0 09 31 32 33 34 35 36 37 38 39 02 79 6F 00\\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 phoneNumber = '';\\r\\nvar numberLength = '00';\\r\\nvar numberHex = '';\\r\\nvar nameLength = '00';\\r\\nvar nameHex = '';\\r\\nvar value = '02';\\r\\nvar keyLength = '00';\\r\\nvar confTel = '';\\r\\nvar count = 1; // approved contact will be from A2 to A9 - index 1 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 += \\\"0534\\\" + 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 phoneNumber = params.ApprovedContacts[contact].Contact;\\r\\n if (phoneNumber.startsWith(\\\"+\\\")) {\\r\\n phoneNumber = \\\"00\\\" + phoneNumber.substring(1);\\r\\n }\\r\\n numberHex = ascii_to_hexa(phoneNumber).toUpperCase();\\r\\n numberLength = ('00' + decimalToHex(phoneNumber.length)).slice(-2).toUpperCase();\\r\\n nameHex = ascii_to_hexa(params.ApprovedContacts[contact].Name).toUpperCase();\\r\\n nameLength = ('00' + decimalToHex(params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n keyLength = ('00' + decimalToHex(5 + phoneNumber.length + params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n value += keyLength + \\\"34\\\" + confTel + numberLength + numberHex + nameLength + nameHex + '00'; //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 phoneNumber = params.ApprovedContacts[contact].Contact;\\r\\n if (phoneNumber.startsWith(\\\"+\\\")) {\\r\\n phoneNumber = \\\"00\\\" + phoneNumber.substring(1);\\r\\n }\\r\\n numberHex = ascii_to_hexa(phoneNumber).toUpperCase();\\r\\n numberLength = ('00' + decimalToHex(phoneNumber.length)).slice(-2).toUpperCase();\\r\\n nameHex = ascii_to_hexa(params.ApprovedContacts[contact].Name).toUpperCase();\\r\\n nameLength = ('00' + decimalToHex(params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n keyLength = ('00' + decimalToHex(5 + phoneNumber.length + params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n value += keyLength + \\\"34\\\" + confTel + numberLength + numberHex + nameLength + nameHex + '00'; //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 += \\\"0534\\\" + 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\":2,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1765217764},{"Type":1,"NewValue":"{\"Id\":5819,\"Name\":\"setAuthorisedNumbersAndWatchSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"// Combinated version setAuthorisedNumber with Watch Settings for EV06\\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// AB 10 22 00 32 FA 00 00 02 11 36 00 00 00 00 00 00 00 00 00 14 00 00 00 00 0A 00 0E 34 80 09 31 32 33 34 35 36 37 38 39 00 00\\r\\n// [Length]:11 [Key]:36 [Value]:00 00 00 00 00 00 00 00 00 14 00 00 00 00 0A 00\\r\\n//{\\\"watch\\\":{\\\"status18\\\":0,\\\"status17\\\":0,\\\"status19\\\":0,\\\"status10\\\":0,\\\"flagValue\\\":0,\\\"status12\\\":0,\\\"faceId\\\":0,\\\"status11\\\":0,\\\"status14\\\":0,\\\"status13\\\":0,\\\"status16\\\":0,\\\"status15\\\":0,\\\"status0\\\":0,\\\"status1\\\":0,\\\"menu8\\\":0,\\\"menu7\\\":0,\\\"menu6\\\":0,\\\"menu5\\\":0,\\\"menu4\\\":0,\\\"menu3\\\":0,\\\"menu2\\\":0,\\\"menu1\\\":0,\\\"autoTime\\\":20,\\\"brightNess\\\":0,\\\"logoIndex\\\":0,\\\"status20\\\":0,\\\"status8\\\":0,\\\"status9\\\":0,\\\"status2\\\":0,\\\"status3\\\":0,\\\"brightTime\\\":10}}\\r\\n//[Length]:0E [Key]:34 [Value]:80 09 31 32 33 34 35 36 37 38 39 00 00\\r\\n//{\\\"numberNamePhoto\\\":{\\\"call\\\":0,\\\"noCard\\\":0,\\\"number\\\":\\\"123456789\\\",\\\"enable\\\":1,\\\"sms\\\":0,\\\"name\\\":\\\"\\\",\\\"headURL\\\":\\\"\\\",\\\"index\\\":0}}\\r\\n// para pruebas en local Contact':\\r\\n//AB 10 12 00 94 ED 00 00 02 10 34 E0 09 31 32 33 34 35 36 37 38 39 02 79 6F 00\\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 phoneNumber = '';\\r\\nvar numberLength = '00';\\r\\nvar numberHex = '';\\r\\nvar nameLength = '00';\\r\\nvar nameHex = '';\\r\\nvar value = '02';\\r\\nvar keyLength = '00';\\r\\nvar confTel = '';\\r\\nvar count = 1; // approved contact will be from A2 to A9 - index 1 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 += \\\"0534\\\" + 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 phoneNumber = params.ApprovedContacts[contact].Contact;\\r\\n if (phoneNumber.startsWith(\\\"+\\\")) {\\r\\n phoneNumber = \\\"00\\\" + phoneNumber.substring(1);\\r\\n }\\r\\n numberHex = ascii_to_hexa(phoneNumber).toUpperCase();\\r\\n numberLength = ('00' + decimalToHex(phoneNumber.length)).slice(-2).toUpperCase();\\r\\n nameHex = ascii_to_hexa(params.ApprovedContacts[contact].Name).toUpperCase();\\r\\n nameLength = ('00' + decimalToHex(params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n keyLength = ('00' + decimalToHex(5 + phoneNumber.length + params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n value += keyLength + \\\"34\\\" + confTel + numberLength + numberHex + nameLength + nameHex + '00'; //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 phoneNumber = params.ApprovedContacts[contact].Contact;\\r\\n if (phoneNumber.startsWith(\\\"+\\\")) {\\r\\n phoneNumber = \\\"00\\\" + phoneNumber.substring(1);\\r\\n }\\r\\n numberHex = ascii_to_hexa(phoneNumber).toUpperCase();\\r\\n numberLength = ('00' + decimalToHex(phoneNumber.length)).slice(-2).toUpperCase();\\r\\n nameHex = ascii_to_hexa(params.ApprovedContacts[contact].Name).toUpperCase();\\r\\n nameLength = ('00' + decimalToHex(params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n keyLength = ('00' + decimalToHex(5 + phoneNumber.length + params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n value += keyLength + \\\"34\\\" + confTel + numberLength + numberHex + nameLength + nameHex + '00'; //no photo\\r\\n //value += keyLength + \\\"30\\\" + confTel + numberHex; //no photo \\r\\n }\\r\\n count++;\\r\\n}\\r\\ncounter = count; // to check how many contacts are in the lists\\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 += \\\"0534\\\" + confTel + '000000'; //no number, no name, no photo\\r\\n}\\r\\n// watch settings section\\r\\n// lenght and key\\r\\nvar messageBody = '1136';\\r\\n// step count/heart value display\\r\\n// Watch setting related FACE ID\\r\\nmessageBody += '00'; // Default FACE ID 0 \\r\\n// Future\\r\\n//if (params.WatchFace.SetWatchFace) {\\r\\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \\r\\n//} else {\\r\\n// messageBody += '00'; // Analog Face Default FACE ID 0 \\r\\n//}\\r\\n// Watch Display setting related to Step and heart rate settings\\r\\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '081B0000'; //both displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += (counter > 1) ? 'E' : '6';\\r\\n //messageBody += '6'; //menu 1 and 2 \\r\\n //messageBody += 'E'; //menu 1 and 2 and contact (menu 3) \\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '080B0000'; // step display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '4'; //menu 2 \\r\\n //messageBody += 'C'; // menu 2 and contact (menu 3) \\r\\n messageBody += (counter > 1) ? 'C' : '4';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '08130000'; // heart display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '2'; //menu 1 no contact (menu 3) \\r\\n //messageBody += 'A'; //menu 1 and contact (menu 3) \\r\\n messageBody += (counter > 1) ? 'A' : '2';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '08030000'; // no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '0000000'; // no menu , //08 only contact\\r\\n //messageBody += '8'; // //08 only contact\\r\\n messageBody += (counter > 1) ? '8' : '0';\\r\\n messageBody += '000000'; // other settings\\r\\n} else {\\r\\n messageBody += '08030000'; //no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '0000000'; // no menu..\\r\\n}\\r\\n// from autohome page to the end\\r\\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\\r\\nvalue += messageBody; //add watchsetting hex to contact hex in value var \\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\":2,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1765219303},{"Type":1,"NewValue":"{\"Id\":5819,\"Name\":\"setAuthorisedNumbersAndWatchSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"// Combinated version setAuthorisedNumber with Watch Settings for EV06\\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// AB 10 22 00 32 FA 00 00 02 11 36 00 00 00 00 00 00 00 00 00 14 00 00 00 00 0A 00 0E 34 80 09 31 32 33 34 35 36 37 38 39 00 00\\r\\n// [Length]:11 [Key]:36 [Value]:00 00 00 00 00 00 00 00 00 14 00 00 00 00 0A 00\\r\\n//{\\\"watch\\\":{\\\"status18\\\":0,\\\"status17\\\":0,\\\"status19\\\":0,\\\"status10\\\":0,\\\"flagValue\\\":0,\\\"status12\\\":0,\\\"faceId\\\":0,\\\"status11\\\":0,\\\"status14\\\":0,\\\"status13\\\":0,\\\"status16\\\":0,\\\"status15\\\":0,\\\"status0\\\":0,\\\"status1\\\":0,\\\"menu8\\\":0,\\\"menu7\\\":0,\\\"menu6\\\":0,\\\"menu5\\\":0,\\\"menu4\\\":0,\\\"menu3\\\":0,\\\"menu2\\\":0,\\\"menu1\\\":0,\\\"autoTime\\\":20,\\\"brightNess\\\":0,\\\"logoIndex\\\":0,\\\"status20\\\":0,\\\"status8\\\":0,\\\"status9\\\":0,\\\"status2\\\":0,\\\"status3\\\":0,\\\"brightTime\\\":10}}\\r\\n//[Length]:0E [Key]:34 [Value]:80 09 31 32 33 34 35 36 37 38 39 00 00\\r\\n//{\\\"numberNamePhoto\\\":{\\\"call\\\":0,\\\"noCard\\\":0,\\\"number\\\":\\\"123456789\\\",\\\"enable\\\":1,\\\"sms\\\":0,\\\"name\\\":\\\"\\\",\\\"headURL\\\":\\\"\\\",\\\"index\\\":0}}\\r\\n// para pruebas en local Contact':\\r\\n//AB 10 12 00 94 ED 00 00 02 10 34 E0 09 31 32 33 34 35 36 37 38 39 02 79 6F 00\\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 phoneNumber = '';\\r\\nvar numberLength = '00';\\r\\nvar numberHex = '';\\r\\nvar nameLength = '00';\\r\\nvar nameHex = '';\\r\\nvar value = '02';\\r\\nvar keyLength = '00';\\r\\nvar confTel = '';\\r\\nvar count = 1; // approved contact will be from A2 to A9 - index 1 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 += \\\"0534\\\" + 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 phoneNumber = params.ApprovedContacts[contact].Contact;\\r\\n if (phoneNumber.startsWith(\\\"+\\\")) {\\r\\n phoneNumber = \\\"00\\\" + phoneNumber.substring(1);\\r\\n }\\r\\n numberHex = ascii_to_hexa(phoneNumber).toUpperCase();\\r\\n numberLength = ('00' + decimalToHex(phoneNumber.length)).slice(-2).toUpperCase();\\r\\n nameHex = ascii_to_hexa(params.ApprovedContacts[contact].Name).toUpperCase();\\r\\n nameLength = ('00' + decimalToHex(params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n keyLength = ('00' + decimalToHex(5 + phoneNumber.length + params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n value += keyLength + \\\"34\\\" + confTel + numberLength + numberHex + nameLength + nameHex + '00'; //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 phoneNumber = params.ApprovedContacts[contact].Contact;\\r\\n if (phoneNumber.startsWith(\\\"+\\\")) {\\r\\n phoneNumber = \\\"00\\\" + phoneNumber.substring(1);\\r\\n }\\r\\n numberHex = ascii_to_hexa(phoneNumber).toUpperCase();\\r\\n numberLength = ('00' + decimalToHex(phoneNumber.length)).slice(-2).toUpperCase();\\r\\n nameHex = ascii_to_hexa(params.ApprovedContacts[contact].Name).toUpperCase();\\r\\n nameLength = ('00' + decimalToHex(params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n keyLength = ('00' + decimalToHex(5 + phoneNumber.length + params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n value += keyLength + \\\"34\\\" + confTel + numberLength + numberHex + nameLength + nameHex + '00'; //no photo\\r\\n //value += keyLength + \\\"30\\\" + confTel + numberHex; //no photo \\r\\n }\\r\\n count++;\\r\\n}\\r\\ncounter = count; // to check how many contacts are in the lists\\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 += \\\"0534\\\" + confTel + '000000'; //no number, no name, no photo\\r\\n}\\r\\n// watch settings section\\r\\n// lenght and key\\r\\nvar messageBody = '1136';\\r\\n// step count/heart value display\\r\\n// Watch setting related FACE ID\\r\\nmessageBody += '00'; // Default FACE ID 0 \\r\\n// Future\\r\\n//if (params.WatchFace.SetWatchFace) {\\r\\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \\r\\n//} else {\\r\\n// messageBody += '00'; // Analog Face Default FACE ID 0 \\r\\n//}\\r\\n// Watch Display setting related to Step and heart rate settings\\r\\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '081B0000'; //both displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += (counter > 2) ? 'E' : '6';\\r\\n //messageBody += '6'; //menu 1 and 2 \\r\\n //messageBody += 'E'; //menu 1 and 2 and contact (menu 3) \\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '080B0000'; // step display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '4'; //menu 2 \\r\\n //messageBody += 'C'; // menu 2 and contact (menu 3) \\r\\n messageBody += (counter > 2) ? 'C' : '4';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '08130000'; // heart display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '2'; //menu 1 no contact (menu 3) \\r\\n //messageBody += 'A'; //menu 1 and contact (menu 3) \\r\\n messageBody += (counter > 2) ? 'A' : '2';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '08030000'; // no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '0000000'; // no menu , //08 only contact\\r\\n //messageBody += '8'; // //08 only contact\\r\\n messageBody += (counter > 2) ? '8' : '0';\\r\\n messageBody += '000000'; // other settings\\r\\n} else {\\r\\n messageBody += '08030000'; //no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '0000000'; // no menu..\\r\\n}\\r\\n// from autohome page to the end\\r\\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\\r\\nvalue += messageBody; //add watchsetting hex to contact hex in value var \\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\":2,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1765219826},{"Type":1,"NewValue":"{\"Id\":5819,\"Name\":\"setAuthorisedNumbersAndWatchSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"// Combinated version setAuthorisedNumber with Watch Settings for EV06\\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// AB 10 22 00 32 FA 00 00 02 11 36 00 00 00 00 00 00 00 00 00 14 00 00 00 00 0A 00 0E 34 80 09 31 32 33 34 35 36 37 38 39 00 00\\r\\n// [Length]:11 [Key]:36 [Value]:00 00 00 00 00 00 00 00 00 14 00 00 00 00 0A 00\\r\\n//{\\\"watch\\\":{\\\"status18\\\":0,\\\"status17\\\":0,\\\"status19\\\":0,\\\"status10\\\":0,\\\"flagValue\\\":0,\\\"status12\\\":0,\\\"faceId\\\":0,\\\"status11\\\":0,\\\"status14\\\":0,\\\"status13\\\":0,\\\"status16\\\":0,\\\"status15\\\":0,\\\"status0\\\":0,\\\"status1\\\":0,\\\"menu8\\\":0,\\\"menu7\\\":0,\\\"menu6\\\":0,\\\"menu5\\\":0,\\\"menu4\\\":0,\\\"menu3\\\":0,\\\"menu2\\\":0,\\\"menu1\\\":0,\\\"autoTime\\\":20,\\\"brightNess\\\":0,\\\"logoIndex\\\":0,\\\"status20\\\":0,\\\"status8\\\":0,\\\"status9\\\":0,\\\"status2\\\":0,\\\"status3\\\":0,\\\"brightTime\\\":10}}\\r\\n//[Length]:0E [Key]:34 [Value]:80 09 31 32 33 34 35 36 37 38 39 00 00\\r\\n//{\\\"numberNamePhoto\\\":{\\\"call\\\":0,\\\"noCard\\\":0,\\\"number\\\":\\\"123456789\\\",\\\"enable\\\":1,\\\"sms\\\":0,\\\"name\\\":\\\"\\\",\\\"headURL\\\":\\\"\\\",\\\"index\\\":0}}\\r\\n// para pruebas en local Contact':\\r\\n//AB 10 12 00 94 ED 00 00 02 10 34 E0 09 31 32 33 34 35 36 37 38 39 02 79 6F 00\\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 phoneNumber = '';\\r\\nvar numberLength = '00';\\r\\nvar numberHex = '';\\r\\nvar nameLength = '00';\\r\\nvar nameHex = '';\\r\\nvar value = '02';\\r\\nvar keyLength = '00';\\r\\nvar confTel = '';\\r\\nvar count = 1; // approved contact will be from A2 to A9 - index 1 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\\ncounter = 0; // to check how many contacts are in the lists\\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 += \\\"0534\\\" + 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 phoneNumber = params.ApprovedContacts[contact].Contact;\\r\\n if (phoneNumber.startsWith(\\\"+\\\")) {\\r\\n phoneNumber = \\\"00\\\" + phoneNumber.substring(1);\\r\\n }\\r\\n numberHex = ascii_to_hexa(phoneNumber).toUpperCase();\\r\\n numberLength = ('00' + decimalToHex(phoneNumber.length)).slice(-2).toUpperCase();\\r\\n nameHex = ascii_to_hexa(params.ApprovedContacts[contact].Name).toUpperCase();\\r\\n nameLength = ('00' + decimalToHex(params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n keyLength = ('00' + decimalToHex(5 + phoneNumber.length + params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n value += keyLength + \\\"34\\\" + confTel + numberLength + numberHex + nameLength + nameHex + '00'; //no photo\\r\\n //value += keyLength + \\\"30\\\" + confTel + numberHex; //no photo \\r\\n counter++;\\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 phoneNumber = params.ApprovedContacts[contact].Contact;\\r\\n if (phoneNumber.startsWith(\\\"+\\\")) {\\r\\n phoneNumber = \\\"00\\\" + phoneNumber.substring(1);\\r\\n }\\r\\n numberHex = ascii_to_hexa(phoneNumber).toUpperCase();\\r\\n numberLength = ('00' + decimalToHex(phoneNumber.length)).slice(-2).toUpperCase();\\r\\n nameHex = ascii_to_hexa(params.ApprovedContacts[contact].Name).toUpperCase();\\r\\n nameLength = ('00' + decimalToHex(params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n keyLength = ('00' + decimalToHex(5 + phoneNumber.length + params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n value += keyLength + \\\"34\\\" + confTel + numberLength + numberHex + nameLength + nameHex + '00'; //no photo\\r\\n //value += keyLength + \\\"30\\\" + confTel + numberHex; //no photo \\r\\n counter++;\\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 += \\\"0534\\\" + confTel + '000000'; //no number, no name, no photo\\r\\n}\\r\\n// watch settings section\\r\\n// lenght and key\\r\\nvar messageBody = '1136';\\r\\n// step count/heart value display\\r\\n// Watch setting related FACE ID\\r\\nmessageBody += '00'; // Default FACE ID 0 \\r\\n// Future\\r\\n//if (params.WatchFace.SetWatchFace) {\\r\\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \\r\\n//} else {\\r\\n// messageBody += '00'; // Analog Face Default FACE ID 0 \\r\\n//}\\r\\n// Watch Display setting related to Step and heart rate settings\\r\\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '081B0000'; //both displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += (counter > 0) ? 'E' : '6';\\r\\n //messageBody += '6'; //menu 1 and 2 \\r\\n //messageBody += 'E'; //menu 1 and 2 and contact (menu 3) \\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '080B0000'; // step display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '4'; //menu 2 \\r\\n //messageBody += 'C'; // menu 2 and contact (menu 3) \\r\\n messageBody += (counter > 0) ? 'C' : '4';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '08130000'; // heart display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '2'; //menu 1 no contact (menu 3) \\r\\n //messageBody += 'A'; //menu 1 and contact (menu 3) \\r\\n messageBody += (counter > 0) ? 'A' : '2';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '08030000'; // no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '0000000'; // no menu , //08 only contact\\r\\n //messageBody += '8'; // //08 only contact\\r\\n messageBody += (counter > 0) ? '8' : '0';\\r\\n messageBody += '000000'; // other settings\\r\\n} else {\\r\\n messageBody += '08030000'; //no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '0000000'; // no menu..\\r\\n}\\r\\n// from autohome page to the end\\r\\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\\r\\nvalue += messageBody; //add watchsetting hex to contact hex in value var \\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\":2,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1765220298}],"Tags":[]}],"Operations":[{"Id":437,"Name":"Access TEC Care Watch","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 // Watch protocol - please see variables and typical values in order below\n // Watch-CYC;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;SIGNAL=<>;WM=<>;GENERAL=<>\n // Watch-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\",\n //\n // Author: Juanmi Navarro\n // Created: 01/01/0000\n // Last modified: 20/05/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', 'Watch');\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 = (`Watch-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 //<>,<>,<> \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 //<>,<>,<> \n if (mac2) {\n AddValue(codeValues, 'beacon_mac', mac2);\n var simpleQuery2 = [{\n 'code': 'Mac',\n 'value': mac2,\n }];\n var simpleQueryLabel2 = {\n 'table': 'beacons',\n 'select': 'Name',\n 'query': simpleQuery2\n };\n var labels2 = [];\n labels2.push(JSON.stringify(simpleQueryLabel2));\n AddValue(codeValues, 'oysta_labels', JSON.stringify(labels2));\n }\n if (params.beacon_major) {\n AddValue(codeValues, 'beacon_major', params.beacon_major);\n } else {\n AddValue(codeValues, 'beacon_major', 0);\n }\n if (params.beacon_minor) {\n AddValue(codeValues, 'beacon_minor', params.beacon_minor);\n } else {\n AddValue(codeValues, 'beacon_minor', 0);\n }\n //AddValue(codeValues,'oysta_labels', label);\n //AddValue(codeValues,'oysta_value', mac);\n if (location_time) {\n AddValue(codeValues, 'location_time', location_time);\n }\n }\n /* meter mas tarde... \n if (params.smart_data !== 'undefined') {\n var gen_location = params.smart_data.split(',')\n var latitude = gen_location[0]\n var longitude = gen_location[1]\n var location_accuracy = gen_location[2]\n var altitude = gen_location[3]\n AddValue(codeValues,'latitude', latitude);\n AddValue(codeValues,'longitude', longitude);\n AddValue(codeValues,'altitude', altitude);\n AddValue(codeValues,'location_accuracy', location_accuracy);\n }\n */\n /*else if ((params.event_time) && (params.event_time == '')) {\n var event_time = moment.utc().unix();\n AddValue(codeValues,'event_time', event_time);\n } revisar mas adelante*/\n // to parse SMS info from the device\n switch (messageTypeLocalCode) {\n case 'COMM-SMS': // SMS message sent in\n if (params.data.startsWith('Device location request')) {\n configsToAck.push(configIds.Controls.RealTimeLocate);\n } else if (params.data.startsWith('Set IP ok')) {\n configsToAck.push(configIds.Controls.GetCurrentConfig);\n } else if (params.data.startsWith('IMEI:')) {\n configsToAck.push(configIds.Controls.GetFirmwareVersion);\n } else if (params.data.startsWith('Set IP ok')) {\n configsToAck.push(configIds.Controls.ClearBufferedMessages);\n } else if (params.data.startsWith('flush ok')) {\n configsToAck.push(configIds.Controls.GetCurrentConfig);\n } else if (params.data.startsWith('Set Watch-')) {\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 = (`Watch-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 = (`Watch;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 = (`Watch;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 = (`Watch-RTL;${params.imei};${location_time};${location_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\n sendMessageToLocalhostNoWait(messageForReceiver);\n break;\n }\n if (!params.event_time && !event_time) { // if params.event_time undefined - set it to now. \n var event_time = moment.utc().unix();\n AddValue(codeValues, 'event_time', event_time);\n }\n // if (!params.location_time && !location_time) { // if params.location_time undefined - set it to now. \n // var location_time = moment.utc().unix();\n // AddValue(codeValues, 'location_time', location_time);\n //}\n }\n // send data msg to kibana\n const data = buildDataToReceiver(codeValues, configsToAck, configsToUpdate, configsToSend);\n console.log(data);\n return data\n // end of main operation\n // define functions used in operation\n // decode global msg\n function decoder(str) { // decode rawdata\n // CARE Decoder\n AddValue(codeValues, 'Message : ', str);\n var message = str;\n // need to check if checksum is correct for possible msg corruption 10/03/23\n var checksum = message.substring(8, 12);\n var messageBody = message.substring(16, message.length);\n debug('message =' + message);\n debug('checksum =' + checksum);\n debug('calculateCheckSum =' + calculateCheckSum(messageBody));\n if (calculateCheckSum(messageBody) == checksum) { // payload is valid\n debug(\"message has valid checksum\");\n var messageBody = command; // update value for the ACK\n debug('command =' + command);\n if (command == '01') {\n while (index < total_length + 16) {\n // gen_location = '0'; //cambiado 30/09\n var keyLengthHex = message.substring(index, index = index + 2);\n var keyLength = 2 * hexToDecimal(keyLengthHex);\n var key = message.substring(index, index = index + 2);\n var value = message.substring(index, index = index + keyLength - 2);\n debug('key = ' + key);\n debug('value = ' + value);\n switch (key) {\n //Device ID\n case '01':\n var imei = hexToAscii(value);\n break;\n //Alarm code\n case '02':\n var alarm = 'CYC';\n var alarmCode = value.substring(0, 8);\n alarmCode = changeEndianness(alarmCode);\n var timestampHex = value.substring(8, 16);\n timestampHex = changeEndianness(timestampHex);\n timestamp = hexToDecimal(timestampHex);\n event_time = timestamp;\n var alarmCodeInt = hexToDecimal(alarmCode);\n var alarmCodeExt = value.substring(16, 24);\n alarmCodeExt = changeEndianness(alarmCodeExt);\n var alarmCodeExtInt = hexToDecimal(alarmCodeExt);\n //Extended Alerts\n // Fall off\n if ((alarmCodeExtInt & 1) == 1) {\n var alarm = 'ALF-C';\n }\n // Welfare Check-out\n else if ((alarmCodeExtInt & 2) == 2) {\n var alarm = 'ALA-C';\n }\n // Standard Alerts\n //Battery low\n else if ((alarmCodeInt & 1) == 1) {\n var alarm = 'BATL';\n }\n //Overspeed\n else if ((alarmCodeInt & 2) == 2) {\n var alarm = 'ALSP';\n }\n //Fall\n else if ((alarmCodeInt & 4) == 4) {\n var alarm = 'ALF';\n }\n //Tilt\n else if ((alarmCodeInt & 8) == 8) {\n var alarm = 'Tilt';\n } else if ((alarmCodeInt & 16) == 16) {\n if ((alarmCodeInt & 16777216) == 16777216) {\n var alarm = 'Geo1-IN';\n } else {\n var alarm = 'Geo1-OUT';\n }\n } else if ((alarmCodeInt & 32) == 32) {\n if ((alarmCodeInt & 33554432) == 33554432) {\n var alarm = 'Geo2-IN';\n } else {\n var alarm = 'Geo2-OUT';\n }\n } else if ((alarmCodeInt & 64) == 64) {\n if ((alarmCodeInt & 67108864) == 67108864) {\n var alarm = 'Geo3-IN';\n } else {\n var alarm = 'Geo3-OUT';\n }\n } else if ((alarmCodeInt & 128) == 128) {\n if ((alarmCodeInt & 134217728) == 134217728) {\n var alarm = 'Geo4-IN';\n } else {\n var alarm = 'Geo4-OUT';\n }\n }\n //Power Off\n else if ((alarmCodeInt & 256) == 256) {\n var alarm = 'PWRF';\n }\n //Power On\n else if ((alarmCodeInt & 512) == 512) {\n var alarm = 'PWRN';\n }\n //Motion\n else if ((alarmCodeInt & 1024) == 1024) {\n var alarm = 'ALMOV';\n }\n //No Motion\n else if ((alarmCodeInt & 2048) == 2048) {\n var alarm = 'ALNM';\n }\n //SOS\n else if ((alarmCodeInt & 4096) == 4096) {\n var alarm = 'ALSOS';\n } else if ((alarmCodeInt & 8192) == 8192) {\n var alarm = 'Side1';\n } else if ((alarmCodeInt & 16384) == 16384) {\n var alarm = 'Side2';\n }\n //Battery charging\n else if ((alarmCodeInt & 32768) == 32768) {\n var alarm = 'BATCN';\n }\n //Battery no charging\n else if ((alarmCodeInt & 65536) == 65536) {\n var alarm = 'BATCF';\n }\n //SOS Ending\n // Temporary Commented until we know exactly how it works. 22/09/2022\n else if ((alarmCodeInt & 131072) == 131072) {\n var alarm = 'SOSEnding';\n info = 'Alarm Finished';\n }\n //Amber Alert EC03 only\n else if ((alarmCodeInt & 262144) == 262144) {\n var alarm = 'ALAO';\n }\n // welfare Alert check-in ALA-O\n else if ((alarmCodeInt & 524288) == 524288) {\n var alarm = 'ALA-O';\n }\n // Amber alert Ending ALA-C\n else if ((alarmCodeInt & 1048576) == 1048576) {\n var alarm = 'ALA-C';\n }\n // Amber alert Ending ALA-C\n //else if ((alarmCodeInt & 1048576) == 1048576) {\n // var alarm = 'ALA-C';\n //}\n // Fall-Down Alert ending\n else if ((alarmCodeInt & 2097152) == 2097152) {\n var alarm = 'ALF-C';\n }\n // welfare Alert Ending ALA\n else if ((alarmCodeInt & 4194304) == 4194304) {\n var alarm = 'ALA';\n }\n // Beacon absent Alert 11/10/22. Need to be added in msg types\n //else if ((alarmCodeInt & 16777216) == 16777216) {\n // var alarm = 'BEA';\n //}\n general += 'alarm:' + alarm + ',';\n break;\n //Custom ID\n case '03':\n // in value is customID.... '06' for Watch Care\n // if ((imei != '860470063029395') && (imei != '860470063035947')) {\n //update customID to check if belongs to this type of device\n //value = hexToAscii(value);\n customID = value;\n if (value != '3036') {\n AddValue(codeValues, \"error\", \"customID not belongs to this protocol\");\n //AddValue(codeValues, \"rawFromBytes\", rawFromBytes);\n AddValue(codeValues, \"customID\", value);\n // exit decoder\n // const data = buildDataToReceiver(codeValues, configsToAck, configsToUpdate, configsToSend);\n // console.log(data);\n return // data\n } else {\n if (serverParams.Imei === undefined || serverParams.Imei === null) {\n sendMessageToLocalhostNoWait(\"Eview-ASSOCIATE;\" + imei + \";\" + serverParams.Guid + \";\");\n //return;\n }\n AddValue(codeValues, \"customID\", value);\n general += 'customID:' + value + ',';\n break;\n }\n //Historical Data Completed\n case '10': // indica q se han terminado de enviar todos los datos historicos.\n var histData = true;\n break;\n //GPS location\n case '20':\n location_type = 'GPS';\n var latitudeHex = value.substring(0, 8);\n var longitudeHex = value.substring(8, 16);\n var speedHex = value.substring(16, 20);\n var directionHex = value.substring(20, 24);\n var altitudeHex = value.substring(24, 28);\n var location_accuracyHex = value.substring(28, 32);\n var mileageHex = value.substring(32, 40);\n var satellitesHex = value.substring(40, 42);\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\n speed = ((hexToDecimal(changeEndianness(speedHex))) / 3.6).toFixed(2); //date 14-02-2023 in m/s\n var direction = hexToDecimal(changeEndianness(directionHex));\n var altitude = hexToDecimal(changeEndianness(altitudeHex)); // in meters\n //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\n // Range: 0.5 to 99.9 \n location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\n //var mileage = hexToDecimal(changeEndianness(mileageHex)) this is in km/h we need m/s\n var mileage = hexToDecimal(changeEndianness(mileageHex)); // in meters date 14-02-2023\n var satellites = hexToDecimal(satellitesHex);\n // location_time = timestamp;\n //<>,<>,<>,<>,<>\n gps_data = `${latitude},${longitude},${location_accuracy},${speed},${direction},${altitude},${satellites},${mileage}`;\n general += 'gps location (lat):' + latitude + ', (long):' + longitude + ',';\n break;\n //WIFI Towers\n case '22':\n location_type = 'WIFI';\n var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\n //location_time = timestamp;\n var wifiTowers = value;\n general += 'wifiTowers:';\n var indexWifi = 0;\n var bssid_array = [];\n wifi_data = '';\n for (let i = 0; i < numWifi; i++) {\n wifi_data += hexToDecimalSigned(wifiTowers.substring(indexWifi, indexWifi + 2)) + ',' + wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\n indexWifi += 14;\n }\n wifi_data = wifi_data.slice(0, -1);\n general += wifi_data;\n break;\n //BLE Location Added 10/10/22\n case '23':\n location_type = 'BLE';\n var mac = value.substring(0, 12);\n var latitudeHex = value.substring(12, 20);\n var longitudeHex = value.substring(20, 28);\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\n var address = hexToAscii(value.substring(28, value.length));\n var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\n // add : format in MAC\n mac = mac.match(/.{1,2}/g).join(':');\n // location_time = timestamp;\n ble_data = `${latitude},${longitude},${mac},${address}`;\n general += 'BLE location (lat):' + latitude + ', (long):' + longitude + ',';\n break;\n //General Data , status_data\n case '24':\n //var general = 'true'\n //if (cu != '06') {\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 = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\n sendMessageToLocalhostNoWait(messageForReceiver);\n alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\n }\n //else {\n // messageForReceiver = (`CareWatch-CYC;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};`);\n //}\n // reset variables\n //alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\n var timestampHex = value.substring(0, 8);\n timestampHex = changeEndianness(timestampHex);\n timestamp = hexToDecimal(timestampHex);\n location_time = timestamp;\n event_time = timestamp;\n // HardCode to fix possible issue in protocol\n //event_time = moment.utc().unix();\n // end of hard code\n var statusHex = changeEndianness(value.substring(8, 16));\n var statusInt = hexToDecimal(statusHex);\n var statusDevice = '';\n if ((statusInt & 1) == 1) {\n statusDevice += 'GPS,';\n }\n if ((statusInt & 2) == 2) {\n statusDevice += 'WIFISource,';\n }\n if ((statusInt & 4) == 4) {\n statusDevice += 'CellTower,';\n }\n if ((statusInt & 8) == 8) {\n statusDevice += 'BLELocation,';\n }\n //params.BatteryStatus.BatteryStatus = '1';\n if ((statusInt & 16) == 16) {\n statusDevice += 'Charging,';\n // var alarm = 'BATCN';\n //configs.BatteryStatus.BatteryStatus = '1';\n /* if (configs.BatteryStatus.BatteryStatus !== '1') {\n hasConfigs = true;\n var batteryStatus = '1';\n var alarm = 'BATCN';\n let configsToUpdate = [];\n configsToUpdate.push({\n 'code': configIds.BatteryStatus.BatteryStatus,\n 'value': batteryStatus\n });\n }*/\n }\n if ((statusInt & 32) == 32) {\n statusDevice += 'FUllyCharged,';\n //var alarm = 'BATF';\n // configs.BatteryStatus.BatteryStatus = '3';\n /* if (configs.BatteryStatus.BatteryStatus !== '3') {\n hasConfigs = true;\n var batteryStatus = '3';\n var alarm = 'BATF';\n let configsToUpdate = [];\n configsToUpdate.push({\n 'code': configIds.BatteryStatus.BatteryStatus,\n 'value': batteryStatus\n });\n }*/\n }\n /* if (!((statusInt & 32) == 32) & !((statusInt & 16) == 16)) {\n statusDevice += 'Not Charging,';\n var alarm = 'BATCF';\n //configs.BatteryStatus.BatteryStatus = '2';\n if (configs.BatteryStatus.BatteryStatus !== '2') {\n var batteryStatus = '2';\n var alarm = 'BATCF';\n let configsToUpdate = [];\n configsToUpdate.push({\n 'code': configIds.BatteryStatus.BatteryStatus,\n 'value': batteryStatus\n });\n }\n }*/\n if ((statusInt & 64) == 64) {\n statusDevice += 'Reboot,';\n }\n if ((statusInt & 128) == 128) {\n statusDevice += 'HistoricalData,';\n }\n if ((statusInt & 256) == 256) {\n statusDevice += 'AGPSDataValid,';\n }\n if ((statusInt & 512) == 512) {\n statusDevice += 'Motion,';\n }\n if ((statusInt & 1024) == 1024) {\n statusDevice += 'SmartLocating,';\n }\n if ((statusInt & 2048) == 2048) { //isHome\n statusDevice += 'BeaconLocation,';\n }\n if ((statusInt & 4096) == 4096) {\n statusDevice += 'BLEConnected,';\n }\n if ((statusInt & 16384) == 16384) {\n statusDevice += 'HomeWiFi,';\n }\n statusDevice = statusDevice.slice(0, -1);\n status_data = statusDevice; //to oysta template\n //statusHex = (statusHex);\n statusHex = hexToBin(statusHex);\n statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\n battery_percentage = parseInt(statusHex.substring(0, 8), 2);\n cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\n workMode = parseInt(statusHex.substring(13, 16), 2);\n general += 'statusDevice:' + statusDevice + ',';\n if (battery_percentage) {\n general += 'battery:' + battery_percentage + ',';\n }\n if (cellNetworkSignal) {\n general += 'cellNetworkSignal:' + cellNetworkSignal + ',';\n }\n if (workMode) {\n general += 'workMode:' + workMode + ',';\n }\n //messageForReceiver = (`CareWatch-CYC;${imei};${i};${event_time};${battery_percentage}`);\n break;\n //Call Records\n case '25':\n //Needed?\n break;\n //BLE Location 2\n case '26':\n //I don't understand\n //messageBody = messageBody + keyLengthHex + key + value;\n break;\n //Smart Location\n case '27':\n location_type = 'SMART';\n var latitudeHex = value.substring(0, 8);\n var longitudeHex = value.substring(8, 16);\n var location_accuracyHex = value.substring(16, 20);\n var altitudeHex = value.substring(20, 24);\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\n var altitude = hexToDecimal(changeEndianness(altitudeHex));\n //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\n //04/08/2022 se quita el multiplicador por 5 pq ya viene el valor en metros\n location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\n //location_time = timestamp;\n smart_data = `${latitude},${longitude},${location_accuracy},${altitude}`;\n general += 'smart location (lat):' + latitude + ', (long):' + longitude + ',';\n break;\n //Beacon Location Added 11/10/22\n case '28':\n location_type = 'BEACON';\n // var alarm = 'EBZI';\n var latitudeHex = '00';\n var longitudeHex = '00';\n var descr = 'empty';\n var flag = hexToDecimal(value.substring(0, 1));\n var beacId = hexToDecimal(value.substring(1, 2));\n // msg includes descrip\n if ((flag & 4) == 4) {\n descr = hexToAscii(value.substring(18, value.length));\n }\n // msg includes lat/lon\n if ((flag & 8) == 8) {\n latitudeHex = value.substring(18, 26);\n longitudeHex = value.substring(26, 34);\n }\n // msg includes lat/lon and description\n if ((flag & 12) == 12) {\n latitudeHex = value.substring(18, 26);\n longitudeHex = value.substring(26, 34);\n descr = hexToAscii(value.substring(34, value.length));\n }\n var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\n // add : format in MAC\n mac = mac.match(/.{1,2}/g).join(':');\n var rssiHex = value.substring(14, 16);\n var rssi1Hex = value.substring(16, 18);\n rssi = hexToDecimalSigned(changeEndianness(rssiHex));\n rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\n // var latitudeHex = value.substring(18, 26);\n // var longitudeHex = value.substring(26, 34);\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\n //location_time = timestamp;\n beacon_data = `${latitude},${longitude},${mac},${descr}`;\n general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (listIndex):' + beacId + ',';\n break;\n // Beacon V2\n case '2C':\n location_type = 'BEACON';\n // var alarm = 'EBZI';\n var latitudeHex = '00';\n var longitudeHex = '00';\n var descr = 'empty';\n var flag = hexToDecimal(value.substring(0, 1));\n var beacId = hexToDecimal(value.substring(1, 2));\n // msg includes descrip\n if ((flag & 4) == 4) {\n let desc_leng = hexToDecimal(value.substring(20, 22));\n descr = hexToAscii(value.substring(22, 22 + (2 * desc_leng)));\n //descr = hexToAscii(value.substring(18, value.length));\n }\n // msg includes lat/lon\n if ((flag & 8) == 8) {\n latitudeHex = value.substring(18, 26);\n longitudeHex = value.substring(26, 34);\n }\n // msg includes lat/lon and description\n if ((flag & 12) == 12) {\n latitudeHex = value.substring(20, 28);\n longitudeHex = value.substring(28, 36);\n let desc_leng = hexToDecimal(value.substring(36, 38));\n descr = hexToAscii(value.substring(38, 38 + (2 * desc_leng)));\n }\n var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\n // add : format in MAC\n mac = mac.match(/.{1,2}/g).join(':');\n var rssiHex = value.substring(14, 16);\n var rssi1Hex = value.substring(16, 18);\n rssi = hexToDecimalSigned(changeEndianness(rssiHex));\n rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\n var battery_beacon = hexToDecimal(value.substring(18, 20));\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\n //location_time = timestamp;\n beacon_data = `${latitude},${longitude},${mac},${descr}`;\n general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (battery):' + battery_beacon + ', (listIndex):' + beacId + ',';\n break;\n //Cell Towers Note\n case '29':\n location_type = 'LBS';\n lbs_data = '';\n var mccHex = changeEndianness(value.substring(0, 4));\n var mncHex = value.substring(4, 6);\n var mcc = hexToDecimal(mccHex);\n lbs_data += mcc + ',';\n var mnc = hexToDecimal(mncHex);\n lbs_data += mnc + ',';\n var indexLbs = 6;\n var numTowers = (hexToDecimal(keyLengthHex) - 4) / 7;\n for (let i = 0; i < numTowers; i++) {\n var rxlHex = changeEndianness(value.substring(indexLbs, indexLbs + 2));\n var rxl = hexToDecimal(rxlHex);\n var lacHex = changeEndianness(value.substring(indexLbs + 2, indexLbs + 6));\n var lac = hexToDecimal(lacHex);\n var cellTowers = hexToDecimal(changeEndianness(value.substring(indexLbs + 6, indexLbs + 14)));\n lbs_data += rxl + ',' + lac + ',' + cellTowers + ',';\n indexLbs += 14;\n }\n lbs_data = lbs_data.slice(0, -1);\n general += lbs_data;\n break;\n case '30':\n //G-sensor.\n //value = hexToAscii(value);\n //if (value != '06') {\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 = (`Watch-${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 //value = hexToAscii(value);\n //if (value != '06') {\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 = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\n sendMessageToLocalhostNoWait(messageForReceiver);\n }\n break;\n //BLE Connected . For Flic button\n case '62':\n location_type = 'BLE';\n //var alarm = 'EBZI'; \n //var latitudeHex = '00';\n //var longitudeHex = '00';\n //var descr = 'empty';\n var flag = hexToDecimal(value.substring(0, 2)); // 0= Disconnected, 1= Connected\n var mac = value.substring(2, 14); // No hace falta darle la vuelta\n // add : format in MAC\n mac = mac.match(/.{1,2}/g).join(':');\n var batLevel = hexToDecimal(value.substring(14, 16)); // 0-100\n //location_time = timestamp;\n ble_data = `${flag},${batLevel},${mac}`;\n general += 'BLE location (State):' + flag + ', (bat):' + batLevel + ', (mac):' + mac + ',';\n break;\n }\n }\n if (alarmCode) {\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};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 = (`Watch;ACK-FIRM;${imei};`);\n sendMessageToLocalhostNoWait(messageForReceiver);\n AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\n //AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\n configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\n //configsToAck.push(configIds.OnDevice.LastDateTimeRead);\n //messageBody = messageBody + keyLengthHex + key + value;\n break;\n case '1A':\n //no ACK need\n var fwVersion = hexToAscii(value);\n imei = serverParams.Imei;\n AddValue(codeValues, \"imei\", imei);\n AddValue(codeValues, \"fwVersion\", fwVersion);\n messageForReceiver = (`Watch;ACK-FIRM;${imei};`);\n sendMessageToLocalhostNoWait(messageForReceiver);\n AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\n //AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\n configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\n //configsToAck.push(configIds.OnDevice.LastDateTimeRead);\n break;\n //IMEI\n case '03':\n var imei = hexToDecimal(value);\n // harcode to avoid conflicts with Rio protocol\n //if ((imei != '860470063029395') && (imei != '860470063035947')) {\n // AddValue(codeValues, \"error\", \"device imei is not in this protocol\");\n // AddValue(codeValues, \"rawFromBytes\", rawFromBytes);\n //AddValue(codeValues, \"IMEI\", imei);\n // return\n //}\n if (serverParams.Imei === undefined || serverParams.Imei === null) {\n sendMessageToLocalhostNoWait(\"Eview-ASSOCIATE;\" + imei + \";\" + serverParams.Guid + \";\");\n //return;\n }\n messageBody = messageBody + keyLengthHex + key + value;\n break;\n //ICCID\n case '04':\n var iccid = hexToDecimal(value);\n messageBody = messageBody + keyLengthHex + key + value;\n break;\n //BLE-MAC\n case '05':\n var bleMac = hexToDecimal(value);\n messageBody = messageBody + keyLengthHex + key + value;\n break;\n //Run Time\n case '07':\n var runTime = hexToDecimal(value);\n messageBody = messageBody + keyLengthHex + key + value;\n break;\n case '10': // Ringer Volume\n var volume = hexToDecimal(value);\n imei = serverParams.Imei;\n messageForReceiver = (`Watch;ACK-VOL;${imei};`);\n sendMessageToLocalhostNoWait(messageForReceiver);\n AddValue(codeValues, \"Volume\", volume);\n AddValue(configsToUpdate, configIds.ReadSystemSettings.Volume, volume);\n configsToAck.push(configIds.ReadSystemSettings.Volume);\n break;\n case '0A': //Performance mode\n //var workMode = hexToDecimal(value);\n //messageBody = messageBody + keyLengthHex + key + value;\n //AddValue(codeValues, \"WorkMode\", workMode);\n //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\n //configsToAck.push(configIds.ReadPerformance`Settings.Mode);\n //var workMode = hexToAscii(value.substring(0, value.length));\n //var workMode = hexToDecimal(value);\n //var workMode = hexToAscii(value.substring(0, value.length));\n var workMode = 1234; // + value + \"end\";\n //var workModeVal = 9;\n //workMode = 'test10';\n imei = serverParams.Imei;\n messageForReceiver = (`Watch;ACK-MODE;${imei};`);\n AddValue(codeValues, \"Mode\", workMode);\n AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\n configsToAck.push(configIds.ReadPerformanceSettings.Mode);\n sendMessageToLocalhostNoWait(messageForReceiver);\n //AddValue(codeValues, \"performanceMode\", performanceMode);\n //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, performanceMode);\n // configsToAck.push(configIds.ReadPerformanceSettings.Mode);\n break;\n case '1B':\n //Decimal o ascii?\n var gsmModule = hexToDecimal(value);\n messageBody = messageBody + keyLengthHex + key + value;\n break;\n case '1F':\n //System Language\n var systemLanguage = hexToAscii(value.substring(0, value.length));\n imei = serverParams.Imei;\n //messageBody = messageBody + keyLengthHex + key + value;\n messageForReceiver = (`Watch;ACK-LANG;${imei};`);\n sendMessageToLocalhostNoWait(messageForReceiver);\n AddValue(codeValues, \"SystemLanguage\", systemLanguage);\n AddValue(configsToUpdate, configIds.ReadSystemSettings.SystemLanguage, systemLanguage);\n configsToAck.push(configIds.ReadSystemSettings.SystemLanguage);\n break;\n case '33': // phone option\n // [Value]:83 0B 00 00 {\"phoneOption\":{\"flag_value\":2947,\"s3\":1,\"s4\":0,\"s5\":1,\"s6\":0,\"callIncoming\":0,\"rings\":3,\"s7\":0,\"toneID\":0,\"s1\":1,\"s2\":1}}\n var statusPhone = hexToBin(value.substring(0, 2)); // To find autoanswer setup\n if (statusPhone.substring(0, 1) == '1') { // 1 Enable\n var auto = 'true';\n } else var auto = 'false';\n statusPhone = hexToBin(value.substring(2, 4)); // To find allow list setup\n if (statusPhone.substring(7, 8) == '1') { // 1 Enable\n allow = 'true';\n } else var allow = 'false';\n //statusPhone = hexToBin(value.substring(0, 2)) + hexToBin(value.substring(2, 4));\n //AddValue(configsToUpdate, configIds.ReadSystemSettings.Statusphone, statusPhone);\n AddValue(configsToUpdate, configIds.ReadSystemSettings.AllowList, allow);\n AddValue(configsToUpdate, configIds.ReadSystemSettings.AutoAnswer, auto);\n //configsToAck.push(configIds.ReadSystemSettings.Statusphone);\n configsToAck.push(configIds.ReadSystemSettings.AllowList);\n configsToAck.push(configIds.ReadSystemSettings.AutoAnswer);\n break;\n case '34': //ContactList with name\n var contactNumber = value.substring(1, 2);\n var telLength = hexToDecimal(value.substring(2, 4));\n var tel = '';\n switch (contactNumber) {\n // Emergency Number\n case '0':\n tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\n AddValue(codeValues, \"EmergencyNumber\", tel);\n AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\n configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\n break;\n // Speed Dial Number\n //case '1':\n // tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\n // AddValue(codeValues, \"SpeedDialNumber\", tel);\n // AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.SpeedDialNumber, tel);\n // configsToAck.push(configIds.ReadSpeedDialSettings.SpeedDialNumber);\n // break;\n // Gateway Number\n case '9': //00447781482635,Esendex UK 0034627177148,Esendex Spain 00447507288240,Esendex UK Acceptance\n tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\n if (tel.includes('447781482635') || tel.includes('00447781482635')) {\n tel = 'Esendex UK'\n } else if (tel.includes('34627177148') || tel.includes('0034627177148')) {\n tel = 'Esendex Spain'\n } else if (tel.includes('447507288240') || tel.includes('00447507288240')) {\n tel = 'Esendex UK Acceptance'\n } else {\n tel = 'Default'\n }\n AddValue(codeValues, \"SMSGateway\", tel);\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\n configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\n break;\n default:\n tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\n if (tel.length < 6) {\n contacts += '';\n AddValue(codeValues, \"ApprovedContacts\", contacts);\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\n break;\n }\n //contacts += 'A' + (contactNumber - 1) + ': ' + tel + ', ';\n contacts += tel + ', ';\n AddValue(codeValues, \"ApprovedContacts\", contacts);\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\n break;\n }\n break;\n case '40': // APN\n //no ACK need\n AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'));\n configsToAck.push(configIds.OnDevice.LastDateTimeRead);\n var apn = hexToAscii(value.substring(0, value.length));\n imei = serverParams.Imei;\n break;\n case '41': // APN Username\n //no ACK need\n //apn = apn + ',' + hexToAscii(value.substring(0, value.length));\n break;\n case '42': // APN Password\n //no ACK need\n //apn = apn + ',' + hexToAscii(value.substring(0, value.length));\n messageForReceiver = (`Watch;ACK-GDATA;${imei};`);\n sendMessageToLocalhostNoWait(messageForReceiver);\n AddValue(codeValues, \"apn\", apn);\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.APN, apn);\n configsToAck.push(configIds.ReadCommunicationSettings.APN);\n break;\n case '43': //Server Details\n //52.232.85.255,5678 production 52.174.17.77,5678 acceptance\n var serverDetails = hexToAscii(value.substring(6, value.length)) + ':' + hexToDecimal(value.substring(4, 6) + value.substring(2, 4));\n if (serverDetails.includes('52.232.85.255:5678')) {\n serverDetails = 'Production'\n } else if (serverDetails.includes('52.174.17.77:5678')) {\n serverDetails = 'Acceptance'\n } else if (serverDetails.includes('52.174.17.77:5778')) {\n serverDetails = 'Protocol-Import'\n } else if (serverDetails.includes('52.174.17.77:5878')) {\n serverDetails = 'Protocol-Dev'\n } else {\n serverDetails = 'Default'\n }\n AddValue(codeValues, \"server\", serverDetails);\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.Server, serverDetails);\n configsToAck.push(configIds.ReadCommunicationSettings.Server);\n break;\n case '44': //time interval - work mode intervals\n imei = serverParams.Imei;\n messageForReceiver = (`Watch;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 = (`Watch;ACK-CUSTID;${imei};`);\n sendMessageToLocalhostNoWait(messageForReceiver);\n AddValue(codeValues, \"customeid\", value);\n AddValue(configsToUpdate, configIds.ReadState.CustomId, hexToAscii(value)); //now it comes \"3036\"\n configsToAck.push(configIds.ReadState.CustomId);\n break;\n case '53': // Non motion alert\n //2B020080\n var status = hexToBin(value.substring(6, 8));\n var alertSetting = '';\n var enableDisable = '';\n if (status.substring(0, 1) == '1') {\n alertSetting = 'Enable, '\n enableDisable = '1';\n } else {\n alertSetting = 'Disable, '\n };\n //if (status.substring(5, 6) == '1') {\n // alertSetting += 'Dial, '\n //} else {\n // alertSetting += 'No Dial, '\n //};\n var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\n alertSetting += time;\n imei = serverParams.Imei;\n messageForReceiver = (`Watch;ACK-NOMOTION;${imei};`);\n sendMessageToLocalhostNoWait(messageForReceiver);\n AddValue(codeValues, \"nomotion\", alertSetting);\n //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings, enableDisable);\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\n //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\n configsToAck.push(configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings);\n configsToAck.push(configIds.ReadNonMovementSettings.Time);\n break;\n case '56': //Fall down sensibility\n // '00001100'\n var fallStatus = hexToBin(value.substring(0, 2));\n var enalbleDisable = '';\n //if (fallStatus.substring(4, 5) == '1') {\n if (fallStatus.substring(0, 1) == '1') {\n var sensibility = 'Enable, '\n enalbleDisable = '1'\n } else {\n var sensibility = 'Disable, '\n };\n if (fallStatus.substring(5, 6) == '1') {\n sensibility += 'Dial, '\n } else {\n sensibility += 'No Dial, '\n };\n var imei = serverParams.Imei;\n messageForReceiver = (`Watch;ACK-FALLALERT;${imei};`);\n sendMessageToLocalhostNoWait(messageForReceiver);\n var sesibityOptionValue = hexToDecimal(value.substring(1, 2));\n sensibility += sesibityOptionValue;\n AddValue(codeValues, \"sensibility\", sensibility);\n //AddValue(configsToUpdate, configIds.ReadAlertSettings.FallSettings, sensibility);\n AddValue(configsToUpdate, configIds.ReadFallSettings.EnableDisableFallSettings, enalbleDisable);\n AddValue(configsToUpdate, configIds.ReadFallSettings.Sensitivity, sesibityOptionValue);\n //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\n configsToAck.push(configIds.ReadFallSettings.EnableDisableFallSettings);\n configsToAck.push(configIds.ReadFallSettings.Sensitivity);\n break;\n case '73': //BeaconList\n var beaconNumber = hexToDecimal(value.substring(1, 2));\n var beaconStatus = hexToBin(value.substring(0, 1));\n beaconStatus = hexToAscii(value.substring(30, value.length));\n //beaconStatus = changeEndianness(value.substring(30, value.length));\n //homeBeacon += 'B' + (beaconNumber + 1) + ': ' + beaconStatus + ', ';\n homeBeacon += beaconStatus + ', ';\n AddValue(codeValues, \"homeBeacon\", homeBeacon);\n messageForReceiver = (`Watch;ACK-GDATA;${imei};`);\n sendMessageToLocalhostNoWait(messageForReceiver);\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\n configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\n break;\n case '4A': //Wifi Network List\n var wifiSSIDLenght = hexToDecimal(value.substring(2, 4));\n var wifiPasswordLenght = hexToDecimal(value.substring(4, 6));\n var wifiIndex = hexToDecimal(value.substring(1, 2));\n //var wifiStatus = hexToDecimal(value.substring(0, 1));\n var wifiStatus = value.substring(0, 1);\n /*var enalbleDisable = wifiSSID = wifiPassword = homeWifi = '';\n /var homeWifi = '';\n if (wifiIndex == '0') { // Only first Wifi of the list\n if (wifiStatus == '8') {\n homeWifi += ' Enable, '\n enalbleDisable = '1';\n } else {\n homeWifi += ' Disable, '\n //enalbleDisable = '0';\n };*/\n if ((wifiStatus == '8') || (wifiStatus == 'C')) { // 8 == ON OR C== ON and Connected\n var wifiSSID = hexToAscii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\n var wifiPassword = hexToAscii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\n var imei = serverParams.Imei;\n messageForReceiver = (`Watch;ACK-WIFI;${imei};`);\n sendMessageToLocalhostNoWait(messageForReceiver);\n //homeWiFi += 'W' + (wifiIndex + 1) + ': ' + wifiSSID + ', ' + wifiPassword + ';';\n homeWiFi += wifiSSID + ', ' + wifiPassword + ';';\n AddValue(codeValues, \"wifi\", homeWiFi);\n AddValue(configsToUpdate, configIds.ReadWiFiList.WiFiList, homeWiFi);\n configsToAck.push(configIds.ReadWiFiList.WiFiList);\n }\n //AddValue(configsToUpdate, configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings, enalbleDisable);\n //AddValue(configsToUpdate, configIds.ReadWiFiSettings.SSID, wifiSSID);\n //AddValue(configsToUpdate, configIds.ReadWiFiSettings.Password, wifiPassword);\n //configsToAck.push(configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings);\n //configsToAck.push(configIds.ReadWiFiSettings.SSID);\n //configsToAck.push(configIds.ReadWiFiSettings.Password);\n break;\n case '21': // Speed Dial Settings\n // [Value]:53 84 {\"call1Button\":{\"mode\":0,\"feedBack\":3,\"task\":2,\"time\":20,\"status\":1}}\n var status = hexToBin(value.substring(2, 4)); //always pass 2 HEXs to this function\n var alertSetting = '';\n var enalbleDisable = '';\n if (status.substring(0, 1) == '1') {\n alertSetting = 'Enable, '\n enalbleDisable = '1'\n } else {\n alertSetting = 'Disable, '\n //enableDisable = '0';\n };\n //var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\n //alertSetting += time;\n imei = serverParams.Imei;\n messageForReceiver = (`Watch;ACK-SPEED;${imei};`);\n sendMessageToLocalhostNoWait(messageForReceiver);\n AddValue(codeValues, \"speed\", alertSetting);\n //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\n AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\n //AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\n //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\n configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\n //configsToAck.push(configIds.ReadNonMovementSettings.Time);\n break;\n }\n }\n }\n if (command == '03') {\n while (index < total_length + 16) {\n var keyLengthHex = message.substring(index, index = index + 2);\n var keyLength = 2 * hexToDecimal(keyLengthHex);\n var key = message.substring(index, index = index + 2);\n var value = message.substring(index, index = index + keyLength - 2);\n debug('key = ' + key);\n debug('value = ' + value);\n switch (key) {\n case '01': // Device ID\n var imei = hexToAscii(value);\n if (serverParams.Imei === undefined || serverParams.Imei === null) {\n sendMessageToLocalhostNoWait(\"Eview-ASSOCIATE;\" + imei + \";\" + serverParams.Guid + \";\");\n //return;\n }\n break;\n //CustomID is not provided so far with command type 03.. commented in the mean time\n /* case '03':\n //update customID to check if belongs to this type of device\n customID = value;\n if (value != '04') {\n AddValue(codeValues, \"error\", \"customID not belongs to this protocol\");\n AddValue(codeValues, \"rawFromBytes\", rawFromBytes);\n AddValue(codeValues, \"customID\", value);\n return\n } else {\n if (serverParams.Imei === undefined || serverParams.Imei === null) {\n sendMessageToLocalhostNoWait(\"Eview-ASSOCIATE;\" + imei + \";\" + serverParams.Guid + \";\");\n }\n AddValue(codeValues, \"customID\", value);\n general += 'customID:' + value + ',';\n break;\n }\n break; */\n case '10': // Heartbeat\n var heartbeat = hexToAscii(value);\n event_time = moment.utc().unix();\n if (index < total_length + 16) {\n var keyLengthHex = message.substring(index, index = index + 2);\n keyLength = 2 * hexToDecimal(keyLengthHex);\n key = message.substring(index, index = index + 2);\n if (key == '24') {\n // debug('key: ' + key) //comment those out\n value = message.substring(index, index = index + keyLength - 2);\n // debug(value)\n var timestampHex = value.substring(0, 8);\n // debug('timestampt hex: ' + timestampHex)\n timestampHex = changeEndianness(timestampHex);\n timestamp = hexToDecimal(timestampHex);\n event_time = timestamp;\n // debug(event_time)\n var statusHex = changeEndianness(value.substring(8, 16));\n // debug(statusHex)\n var statusInt = hexToDecimal(statusHex);\n var statusDevice = '';\n if ((statusInt & 1) == 1) {\n statusDevice += 'GPS,';\n }\n if ((statusInt & 2) == 2) {\n statusDevice += 'WIFISource,';\n }\n if ((statusInt & 4) == 4) {\n statusDevice += 'CellTower,';\n }\n if ((statusInt & 8) == 8) {\n statusDevice += 'BLELocation,';\n }\n if ((statusInt & 16) == 16) {\n statusDevice += 'Charging,';\n }\n if ((statusInt & 32) == 32) {\n statusDevice += 'FUllyCharged,';\n }\n if ((statusInt & 64) == 64) {\n statusDevice += 'Reboot,';\n }\n if ((statusInt & 128) == 128) {\n statusDevice += 'HistoricalData,';\n }\n if ((statusInt & 256) == 256) {\n statusDevice += 'AGPSDataValid,';\n }\n if ((statusInt & 512) == 512) {\n statusDevice += 'Motion,';\n }\n if ((statusInt & 1024) == 1024) {\n statusDevice += 'SmartLocating,';\n }\n if ((statusInt & 2048) == 2048) {\n statusDevice += 'BeaconLocation,';\n }\n if ((statusInt & 4096) == 4096) {\n statusDevice += 'BLEConnected,';\n }\n statusDevice = statusDevice.slice(0, -1);\n // debug('statusHex:' + statusHex)\n statusHex = (statusHex);\n statusHex = hexToBin(statusHex);\n statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\n // debug(statusHex)\n battery_percentage = parseInt(statusHex.substring(0, 8), 2);\n // debug(battery_percentage)\n // debug(battery_percentage)\n // debug(statusHex.substring(8, 13))\n cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\n // debug(cellNetworkSignal)\n workMode = parseInt(statusHex.substring(13, 16), 2);\n // debug(workMode)\n general += 'statusDevice:' + statusDevice + ';';\n if (battery_percentage) {\n general += 'battery:' + battery_percentage + ';';\n }\n if (cellNetworkSignal) {\n general += 'cellNetworkSignal:' + cellNetworkSignal + ';';\n }\n if (workMode) {\n general += 'workMode:' + workMode + ';';\n }\n }\n }\n // revisar\n var gen_location = '0';\n //CustomID is not provided so far with command type 03.. commented in the mean time\n /*if (customID != '04') {\n AddValue(codeValues, \"error\", \"customID not belongs to this protocol\");\n //AddValue(codeValues, \"rawFromBytes\", rawFromBytes);\n AddValue(codeValues, \"customID\", value);\n return\n }*/\n //messageForReceiver = (`Eview-HTB;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};SIGNAL=${cellNetworkSignal};WM=${workMode};SL=${systemLanguage};GENERAL=${general}`);\n messageForReceiver = (`Watch-HTB;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\n sendMessageToLocalhostNoWait(messageForReceiver);\n //messageBody = messageBody + keyLengthHex + key + value;\n break;\n case '12': // Device requesting timestamp\n timestamp = moment.utc().unix();\n timestampHex = decimalToHex(timestamp);\n timestampHex = changeEndianness(timestampHex);\n keyLengthHex = ('00' + decimalToHex(1 + (timestampHex.length) / 2)).slice(-2);\n // respond to device with the timestamp of the server\n messageBody = messageBody + keyLengthHex + key + timestampHex;\n messageForReceiver = `Eview;${imei};${sequenceID};Get timestamp`;\n sendMessageToLocalhostNoWait(messageForReceiver);\n break;\n case '21': //Cell Towers\n var mccHex = value.substring(0, 2);\n var mncHex = value.substring(2, 3);\n var mcc = hexToDecimal(mccHex);\n var mnc = hexToDecimal(mncHex);\n var numTowers = (keyLength - 4) / 5;\n var cellTowers = hexToAscii(value);\n messageBody = messageBody + keyLengthHex + key + value;\n break;\n case '22': // WIFI locations \n location_type = 'WIFI';\n var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\n //location_time = timestamp;\n var wifiTowers = value;\n general += 'wifiTowers:';\n var indexWifi = 0;\n var bssid_array = [];\n gen_location = '';\n for (let i = 0; i < numWifi; i++) {\n gen_location += wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\n indexWifi += 14;\n }\n gen_location = gen_location.slice(0, -1);\n general += gen_location;\n //CustomID is not provided so far with command type 03\n /*if (customID != '04') {\n AddValue(codeValues, \"error\", \"customID not belongs to this protocol\");\n //AddValue(codeValues, \"rawFromBytes\", rawFromBytes);\n AddValue(codeValues, \"customID\", value);\n return\n }*/\n if (alarmCode) {\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};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 = (`Watch-ACK;${imei};${message}`); // ${sequenceID}; add ${sequenceID}; 19-07\n sendMessageToLocalhostNoWait(messageForReceiver);\n var value = message.substring(index, index = index + keyLength - 2);\n if (typeof configIds !== 'undefined' && configIds && configIds.ConfigureDevice && configIds.ConfigureDevice.LastConfigured) { // when is defined\n AddValue(configsToUpdate, configIds.ConfigureDevice.LastConfigured, moment().format('YYYY/MM/DD, HH:mm:ss'));\n configsToAck.push(configIds.ConfigureDevice.LastConfigured);\n }\n //}\n }\n if (command == 'FE') {\n while (index < total_length + 16) {\n var keyLength = message.substring(index, index = index + 2);\n keyLength = 2 * hexToDecimal(keyLength);\n var key = message.substring(index, index = index + 2);\n var value = message.substring(index, index = index + keyLength - 2);\n }\n }\n // prepare the ACK msg and change config if it is needed\n lengthAck = messageBody.length / 2;\n lengthAck = ('0000' + decimalToHex(lengthAck)).slice(-4);\n lengthAck = lengthAck.toString().substring(2, 4) + lengthAck.toString().substring(0, 2);\n ////////////checksum CRC 16\n var checksumAck = byteStringToByteArray(messageBody);\n checksumAck = crc16byte(checksumAck);\n checksumAck = decimalToHex(checksumAck);\n checksumAck = ('0000' + checksumAck).slice(-4);\n checksumAck = checksumAck.toString().substring(2, 4) + checksumAck.toString().substring(0, 2);\n prefix = prefix + lengthAck + checksumAck + sequenceID;\n // To send ACK to the device previous to internal msg with parts\n if (needsAck == true) {\n if (messageBody.length <= 2) {\n ack = 'AB00030008C7' + sequenceID + '7F0100'; // change AB10030008C7 to AB00030008C7\n } else {\n ack = prefix + messageBody;\n }\n AddValue(codeValues, 'imei', imei);\n AddValue(codeValues, 'ack', ack);\n }\n } else { // checksum was invalid - print out useful debug info and bet quess at imei \n AddValue(codeValues, \"error\", \"checksum failed for message\");\n AddValue(codeValues, \"rawFromBytes\", rawFromBytes);\n i = rawFromBytes.search('3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]');\n if (i >= 0) {\n imei = hexToAscii(rawFromBytes.substring(i, i + 30));\n AddValue(codeValues, \"imei\", imei);\n }\n }\n }\n // Auxiliary functions\n function buildDataToReceiver(codeValues, configsToAck = [], configsToUpdate = [], configsToSend = []) {\n const dataToReceiver = {\n values: codeValues\n };\n if (configsToAck.length > 0) {\n dataToReceiver.configsToAck = configsToAck;\n }\n if (configsToUpdate.length > 0) {\n dataToReceiver.configsToUpdate = configsToUpdate;\n }\n if (configsToSend.length > 0) {\n dataToReceiver.configsToSend = configsToSend;\n }\n return dataToReceiver;\n }\n\n function AddValue(codeValueArray, p1, p2) { // push code value pair into array\n var cvpair = {\n code: p1,\n value: p2\n };\n codeValueArray.push(cvpair);\n }\n // convert functions\n function asciiToHex(str) { // ascii to hex \n return [...str].map(char => char.charCodeAt(0).toString(16).padStart(2, '0')).join('');\n }\n\n function byteStringToByteArray(str) { // convierte una cadena hexadecimal en un array de bytes (number[])\n const bytes = [];\n for (let i = 0; i < str.length; i += 2) {\n const byte = parseInt(str.substring(i, i + 2), 16);\n if (!isNaN(byte) && byte >= 0 && byte <= 255) {\n bytes.push(byte);\n }\n }\n return bytes;\n }\n\n function decimalToHex(x) {\n return Number(x).toString(16).toUpperCase();\n }\n\n function hexToBin(hex) { // convierte un valor hexadecimal a su representación binaria, y asegura que tenga al menos 8 bits \n const bin = parseInt(hex, 16).toString(2);\n return bin.padStart(hex.length * 4, '0');\n }\n\n function hexToAscii(hex) {\n if (hex.length % 2 !== 0) {\n throw new Error(\"Hex string length must be even\");\n }\n let ascii = '';\n for (let i = 0; i < hex.length; i += 2) {\n const byte = hex.substr(i, 2);\n const charCode = parseInt(byte, 16);\n if (charCode !== 0) { // remove null character (\\u0000)\n ascii += String.fromCharCode(charCode);\n }\n }\n return ascii;\n //return hex.match(/.{2}/g).map(byte => String.fromCharCode(parseInt(byte, 16))).join('');\n }\n\n function hexToDecimalSigned(hex) { // hex to decimal\n if (hex.length % 2 !== 0) {\n hex = '0' + hex;\n }\n const num = parseInt(hex, 16);\n const bits = hex.length * 4;\n const maxVal = 2 ** bits;\n return num >= maxVal / 2 ? num - maxVal : num;\n }\n\n function hexToDecimal(hex) {\n return parseInt(hex, 16);\n }\n // CheckSum and debug functions\n function changeEndianness(hexString) { // changeEndianness\n if (hexString.length === 0) { //if string is empty or not defined\n return \"\";\n }\n if (hexString.length % 2 !== 0) {\n throw new Error(\"Hex string length must be even\");\n }\n return hexString.match(/.{2}/g) // divide in bytes (2 chars)\n .reverse() // reverse the order\n .join('');\n }\n\n function calculateCheckSum(payloadData) { // calcula el CRC16 sobre una cadena hexadecimal y devuelve el valor con el endianness invertido\n const bytes = byteStringToByteArray(payloadData);\n const crc = crc16byte(bytes);\n const hex = crc.toString(16).padStart(4, '0').toUpperCase();\n return changeEndianness(hex);\n }\n\n function crc16byte(byteArray) { // calcula el CRC-16 sobre un array de bytes usando una tabla precalculada (crcTable)\n let crc = 0x0000;\n for (const byte of byteArray) {\n if (byte < 0 || byte > 255 || !Number.isInteger(byte)) {\n throw new RangeError(\"Invalid byte value in input array\");\n }\n const index = (byte ^ (crc >> 8)) & 0xFF;\n crc = crcTable[index] ^ (crc << 8);\n }\n return crc & 0xFFFF;\n }\n\n function debug(...args) { // write debug info to console log, if localTesting\n if (localTesting) {\n console.debug('[DEBUG]', ...args);\n }\n }\n /*\n function sendMessageToLocalhostNoWait(str) { // sends message to system, closing connection after\n var server;\n if (localTesting) {\n console.log('local testing - sending to protocol-dev server the message ... '); // port 5878\n console.log(str);\n server = '52.174.17.77';\n } else {\n server = '127.0.0.1';\n }\n var c = net.createConnection(5878, server);\n c.on('error', function(error) {\n c = net.createConnection(5878, server);\n });\n c.write(`${str}`);\n c.end();\n }*/\n function sendMessageToLocalhostNoWait(message) {\n const server = localTesting ? '52.174.17.77' : '127.0.0.1';\n //const port = localTesting ? '5878' : ''; //Protocol-dev\n const port = '5678'; //acceptance-dev\n if (localTesting) {\n console.debug('[DEBUG] Sending message to test server:', message);\n }\n const client = net.createConnection(port, server, () => {\n client.write(message);\n client.end();\n });\n client.on('error', (err) => {\n console.error(`[ERROR] Failed to send message to ${server}:${port}:`, err.message);\n });\n client.on('end', () => {\n if (localTesting) {\n console.debug('[DEBUG] Connection closed');\n }\n });\n }\n}\n// params is not defined locally -> export as module\nif (typeof(params) === 'undefined') {\n module.exports = {\n execute_ops\n }\n} else { // on server use local defined vars\n let return_values = execute_ops(moment, msg, net, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\n // define global returns\n msg = return_values;\n}","Type":0,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":437,\"Name\":\"Access TEC Care Watch\",\"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 // Watch protocol - please see variables and typical values in order below\\n // Watch-CYC;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;SIGNAL=<>;WM=<>;GENERAL=<>\\n // Watch-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\n //\\n // Author: Juanmi Navarro\\n // Created: 01/01/0000\\n // Last modified: 20/05/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', 'Watch');\\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 = (`Watch-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 //<>,<>,<> \\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 //<>,<>,<> \\n if (mac2) {\\n AddValue(codeValues, 'beacon_mac', mac2);\\n var simpleQuery2 = [{\\n 'code': 'Mac',\\n 'value': mac2,\\n }];\\n var simpleQueryLabel2 = {\\n 'table': 'beacons',\\n 'select': 'Name',\\n 'query': simpleQuery2\\n };\\n var labels2 = [];\\n labels2.push(JSON.stringify(simpleQueryLabel2));\\n AddValue(codeValues, 'oysta_labels', JSON.stringify(labels2));\\n }\\n if (params.beacon_major) {\\n AddValue(codeValues, 'beacon_major', params.beacon_major);\\n } else {\\n AddValue(codeValues, 'beacon_major', 0);\\n }\\n if (params.beacon_minor) {\\n AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\n } else {\\n AddValue(codeValues, 'beacon_minor', 0);\\n }\\n //AddValue(codeValues,'oysta_labels', label);\\n //AddValue(codeValues,'oysta_value', mac);\\n if (location_time) {\\n AddValue(codeValues, 'location_time', location_time);\\n }\\n }\\n /* meter mas tarde... \\n if (params.smart_data !== 'undefined') {\\n var gen_location = params.smart_data.split(',')\\n var latitude = gen_location[0]\\n var longitude = gen_location[1]\\n var location_accuracy = gen_location[2]\\n var altitude = gen_location[3]\\n AddValue(codeValues,'latitude', latitude);\\n AddValue(codeValues,'longitude', longitude);\\n AddValue(codeValues,'altitude', altitude);\\n AddValue(codeValues,'location_accuracy', location_accuracy);\\n }\\n */\\n /*else if ((params.event_time) && (params.event_time == '')) {\\n var event_time = moment.utc().unix();\\n AddValue(codeValues,'event_time', event_time);\\n } revisar mas adelante*/\\n // to parse SMS info from the device\\n switch (messageTypeLocalCode) {\\n case 'COMM-SMS': // SMS message sent in\\n if (params.data.startsWith('Device location request')) {\\n configsToAck.push(configIds.Controls.RealTimeLocate);\\n } else if (params.data.startsWith('Set IP ok')) {\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\n } else if (params.data.startsWith('IMEI:')) {\\n configsToAck.push(configIds.Controls.GetFirmwareVersion);\\n } else if (params.data.startsWith('Set IP ok')) {\\n configsToAck.push(configIds.Controls.ClearBufferedMessages);\\n } else if (params.data.startsWith('flush ok')) {\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\n } else if (params.data.startsWith('Set Watch-')) {\\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 = (`Watch-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 = (`Watch;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 = (`Watch;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 = (`Watch-RTL;${params.imei};${location_time};${location_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n break;\\n }\\n if (!params.event_time && !event_time) { // if params.event_time undefined - set it to now. \\n var event_time = moment.utc().unix();\\n AddValue(codeValues, 'event_time', event_time);\\n }\\n // if (!params.location_time && !location_time) { // if params.location_time undefined - set it to now. \\n // var location_time = moment.utc().unix();\\n // AddValue(codeValues, 'location_time', location_time);\\n //}\\n }\\n // send data msg to kibana\\n const data = buildDataToReceiver(codeValues, configsToAck, configsToUpdate, configsToSend);\\n console.log(data);\\n return data\\n // end of main operation\\n // define functions used in operation\\n // decode global msg\\n function decoder(str) { // decode rawdata\\n // CARE Decoder\\n AddValue(codeValues, 'Message : ', str);\\n var message = str;\\n // need to check if checksum is correct for possible msg corruption 10/03/23\\n var checksum = message.substring(8, 12);\\n var messageBody = message.substring(16, message.length);\\n debug('message =' + message);\\n debug('checksum =' + checksum);\\n debug('calculateCheckSum =' + calculateCheckSum(messageBody));\\n if (calculateCheckSum(messageBody) == checksum) { // payload is valid\\n debug(\\\"message has valid checksum\\\");\\n var messageBody = command; // update value for the ACK\\n debug('command =' + command);\\n if (command == '01') {\\n while (index < total_length + 16) {\\n // gen_location = '0'; //cambiado 30/09\\n var keyLengthHex = message.substring(index, index = index + 2);\\n var keyLength = 2 * hexToDecimal(keyLengthHex);\\n var key = message.substring(index, index = index + 2);\\n var value = message.substring(index, index = index + keyLength - 2);\\n debug('key = ' + key);\\n debug('value = ' + value);\\n switch (key) {\\n //Device ID\\n case '01':\\n var imei = hexToAscii(value);\\n break;\\n //Alarm code\\n case '02':\\n var alarm = 'CYC';\\n var alarmCode = value.substring(0, 8);\\n alarmCode = changeEndianness(alarmCode);\\n var timestampHex = value.substring(8, 16);\\n timestampHex = changeEndianness(timestampHex);\\n timestamp = hexToDecimal(timestampHex);\\n event_time = timestamp;\\n var alarmCodeInt = hexToDecimal(alarmCode);\\n var alarmCodeExt = value.substring(16, 24);\\n alarmCodeExt = changeEndianness(alarmCodeExt);\\n var alarmCodeExtInt = hexToDecimal(alarmCodeExt);\\n //Extended Alerts\\n // Fall off\\n if ((alarmCodeExtInt & 1) == 1) {\\n var alarm = 'ALF-C';\\n }\\n // Welfare Check-out\\n else if ((alarmCodeExtInt & 2) == 2) {\\n var alarm = 'ALA-C';\\n }\\n // Standard Alerts\\n //Battery low\\n else if ((alarmCodeInt & 1) == 1) {\\n var alarm = 'BATL';\\n }\\n //Overspeed\\n else if ((alarmCodeInt & 2) == 2) {\\n var alarm = 'ALSP';\\n }\\n //Fall\\n else if ((alarmCodeInt & 4) == 4) {\\n var alarm = 'ALF';\\n }\\n //Tilt\\n else if ((alarmCodeInt & 8) == 8) {\\n var alarm = 'Tilt';\\n } else if ((alarmCodeInt & 16) == 16) {\\n if ((alarmCodeInt & 16777216) == 16777216) {\\n var alarm = 'Geo1-IN';\\n } else {\\n var alarm = 'Geo1-OUT';\\n }\\n } else if ((alarmCodeInt & 32) == 32) {\\n if ((alarmCodeInt & 33554432) == 33554432) {\\n var alarm = 'Geo2-IN';\\n } else {\\n var alarm = 'Geo2-OUT';\\n }\\n } else if ((alarmCodeInt & 64) == 64) {\\n if ((alarmCodeInt & 67108864) == 67108864) {\\n var alarm = 'Geo3-IN';\\n } else {\\n var alarm = 'Geo3-OUT';\\n }\\n } else if ((alarmCodeInt & 128) == 128) {\\n if ((alarmCodeInt & 134217728) == 134217728) {\\n var alarm = 'Geo4-IN';\\n } else {\\n var alarm = 'Geo4-OUT';\\n }\\n }\\n //Power Off\\n else if ((alarmCodeInt & 256) == 256) {\\n var alarm = 'PWRF';\\n }\\n //Power On\\n else if ((alarmCodeInt & 512) == 512) {\\n var alarm = 'PWRN';\\n }\\n //Motion\\n else if ((alarmCodeInt & 1024) == 1024) {\\n var alarm = 'ALMOV';\\n }\\n //No Motion\\n else if ((alarmCodeInt & 2048) == 2048) {\\n var alarm = 'ALNM';\\n }\\n //SOS\\n else if ((alarmCodeInt & 4096) == 4096) {\\n var alarm = 'ALSOS';\\n } else if ((alarmCodeInt & 8192) == 8192) {\\n var alarm = 'Side1';\\n } else if ((alarmCodeInt & 16384) == 16384) {\\n var alarm = 'Side2';\\n }\\n //Battery charging\\n else if ((alarmCodeInt & 32768) == 32768) {\\n var alarm = 'BATCN';\\n }\\n //Battery no charging\\n else if ((alarmCodeInt & 65536) == 65536) {\\n var alarm = 'BATCF';\\n }\\n //SOS Ending\\n // Temporary Commented until we know exactly how it works. 22/09/2022\\n else if ((alarmCodeInt & 131072) == 131072) {\\n var alarm = 'SOSEnding';\\n info = 'Alarm Finished';\\n }\\n //Amber Alert EC03 only\\n else if ((alarmCodeInt & 262144) == 262144) {\\n var alarm = 'ALAO';\\n }\\n // welfare Alert check-in ALA-O\\n else if ((alarmCodeInt & 524288) == 524288) {\\n var alarm = 'ALA-O';\\n }\\n // Amber alert Ending ALA-C\\n else if ((alarmCodeInt & 1048576) == 1048576) {\\n var alarm = 'ALA-C';\\n }\\n // Amber alert Ending ALA-C\\n //else if ((alarmCodeInt & 1048576) == 1048576) {\\n // var alarm = 'ALA-C';\\n //}\\n // Fall-Down Alert ending\\n else if ((alarmCodeInt & 2097152) == 2097152) {\\n var alarm = 'ALF-C';\\n }\\n // welfare Alert Ending ALA\\n else if ((alarmCodeInt & 4194304) == 4194304) {\\n var alarm = 'ALA';\\n }\\n // Beacon absent Alert 11/10/22. Need to be added in msg types\\n //else if ((alarmCodeInt & 16777216) == 16777216) {\\n // var alarm = 'BEA';\\n //}\\n general += 'alarm:' + alarm + ',';\\n break;\\n //Custom ID\\n case '03':\\n // in value is customID.... '06' for Watch Care\\n // if ((imei != '860470063029395') && (imei != '860470063035947')) {\\n //update customID to check if belongs to this type of device\\n //value = hexToAscii(value);\\n customID = value;\\n if (value != '3036') {\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n AddValue(codeValues, \\\"customID\\\", value);\\n // exit decoder\\n // const data = buildDataToReceiver(codeValues, configsToAck, configsToUpdate, configsToSend);\\n // console.log(data);\\n return // data\\n } else {\\n if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\n //return;\\n }\\n AddValue(codeValues, \\\"customID\\\", value);\\n general += 'customID:' + value + ',';\\n break;\\n }\\n //Historical Data Completed\\n case '10': // indica q se han terminado de enviar todos los datos historicos.\\n var histData = true;\\n break;\\n //GPS location\\n case '20':\\n location_type = 'GPS';\\n var latitudeHex = value.substring(0, 8);\\n var longitudeHex = value.substring(8, 16);\\n var speedHex = value.substring(16, 20);\\n var directionHex = value.substring(20, 24);\\n var altitudeHex = value.substring(24, 28);\\n var location_accuracyHex = value.substring(28, 32);\\n var mileageHex = value.substring(32, 40);\\n var satellitesHex = value.substring(40, 42);\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n speed = ((hexToDecimal(changeEndianness(speedHex))) / 3.6).toFixed(2); //date 14-02-2023 in m/s\\n var direction = hexToDecimal(changeEndianness(directionHex));\\n var altitude = hexToDecimal(changeEndianness(altitudeHex)); // in meters\\n //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\n // Range: 0.5 to 99.9 \\n location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\n //var mileage = hexToDecimal(changeEndianness(mileageHex)) this is in km/h we need m/s\\n var mileage = hexToDecimal(changeEndianness(mileageHex)); // in meters date 14-02-2023\\n var satellites = hexToDecimal(satellitesHex);\\n // location_time = timestamp;\\n //<>,<>,<>,<>,<>\\n gps_data = `${latitude},${longitude},${location_accuracy},${speed},${direction},${altitude},${satellites},${mileage}`;\\n general += 'gps location (lat):' + latitude + ', (long):' + longitude + ',';\\n break;\\n //WIFI Towers\\n case '22':\\n location_type = 'WIFI';\\n var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\n //location_time = timestamp;\\n var wifiTowers = value;\\n general += 'wifiTowers:';\\n var indexWifi = 0;\\n var bssid_array = [];\\n wifi_data = '';\\n for (let i = 0; i < numWifi; i++) {\\n wifi_data += hexToDecimalSigned(wifiTowers.substring(indexWifi, indexWifi + 2)) + ',' + wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\n indexWifi += 14;\\n }\\n wifi_data = wifi_data.slice(0, -1);\\n general += wifi_data;\\n break;\\n //BLE Location Added 10/10/22\\n case '23':\\n location_type = 'BLE';\\n var mac = value.substring(0, 12);\\n var latitudeHex = value.substring(12, 20);\\n var longitudeHex = value.substring(20, 28);\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n var address = hexToAscii(value.substring(28, value.length));\\n var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\n // add : format in MAC\\n mac = mac.match(/.{1,2}/g).join(':');\\n // location_time = timestamp;\\n ble_data = `${latitude},${longitude},${mac},${address}`;\\n general += 'BLE location (lat):' + latitude + ', (long):' + longitude + ',';\\n break;\\n //General Data , status_data\\n case '24':\\n //var general = 'true'\\n if (customID != '3036') {\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n AddValue(codeValues, \\\"customID\\\", customID);\\n return\\n }\\n if (alarmCode) {\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\n }\\n //else {\\n // messageForReceiver = (`CareWatch-CYC;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};`);\\n //}\\n // reset variables\\n //alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\n var timestampHex = value.substring(0, 8);\\n timestampHex = changeEndianness(timestampHex);\\n timestamp = hexToDecimal(timestampHex);\\n location_time = timestamp;\\n event_time = timestamp;\\n // HardCode to fix possible issue in protocol\\n //event_time = moment.utc().unix();\\n // end of hard code\\n var statusHex = changeEndianness(value.substring(8, 16));\\n var statusInt = hexToDecimal(statusHex);\\n var statusDevice = '';\\n if ((statusInt & 1) == 1) {\\n statusDevice += 'GPS,';\\n }\\n if ((statusInt & 2) == 2) {\\n statusDevice += 'WIFISource,';\\n }\\n if ((statusInt & 4) == 4) {\\n statusDevice += 'CellTower,';\\n }\\n if ((statusInt & 8) == 8) {\\n statusDevice += 'BLELocation,';\\n }\\n //params.BatteryStatus.BatteryStatus = '1';\\n if ((statusInt & 16) == 16) {\\n statusDevice += 'Charging,';\\n // var alarm = 'BATCN';\\n //configs.BatteryStatus.BatteryStatus = '1';\\n /* if (configs.BatteryStatus.BatteryStatus !== '1') {\\n hasConfigs = true;\\n var batteryStatus = '1';\\n var alarm = 'BATCN';\\n let configsToUpdate = [];\\n configsToUpdate.push({\\n 'code': configIds.BatteryStatus.BatteryStatus,\\n 'value': batteryStatus\\n });\\n }*/\\n }\\n if ((statusInt & 32) == 32) {\\n statusDevice += 'FUllyCharged,';\\n //var alarm = 'BATF';\\n // configs.BatteryStatus.BatteryStatus = '3';\\n /* if (configs.BatteryStatus.BatteryStatus !== '3') {\\n hasConfigs = true;\\n var batteryStatus = '3';\\n var alarm = 'BATF';\\n let configsToUpdate = [];\\n configsToUpdate.push({\\n 'code': configIds.BatteryStatus.BatteryStatus,\\n 'value': batteryStatus\\n });\\n }*/\\n }\\n /* if (!((statusInt & 32) == 32) & !((statusInt & 16) == 16)) {\\n statusDevice += 'Not Charging,';\\n var alarm = 'BATCF';\\n //configs.BatteryStatus.BatteryStatus = '2';\\n if (configs.BatteryStatus.BatteryStatus !== '2') {\\n var batteryStatus = '2';\\n var alarm = 'BATCF';\\n let configsToUpdate = [];\\n configsToUpdate.push({\\n 'code': configIds.BatteryStatus.BatteryStatus,\\n 'value': batteryStatus\\n });\\n }\\n }*/\\n if ((statusInt & 64) == 64) {\\n statusDevice += 'Reboot,';\\n }\\n if ((statusInt & 128) == 128) {\\n statusDevice += 'HistoricalData,';\\n }\\n if ((statusInt & 256) == 256) {\\n statusDevice += 'AGPSDataValid,';\\n }\\n if ((statusInt & 512) == 512) {\\n statusDevice += 'Motion,';\\n }\\n if ((statusInt & 1024) == 1024) {\\n statusDevice += 'SmartLocating,';\\n }\\n if ((statusInt & 2048) == 2048) { //isHome\\n statusDevice += 'BeaconLocation,';\\n }\\n if ((statusInt & 4096) == 4096) {\\n statusDevice += 'BLEConnected,';\\n }\\n if ((statusInt & 16384) == 16384) {\\n statusDevice += 'HomeWiFi,';\\n }\\n statusDevice = statusDevice.slice(0, -1);\\n status_data = statusDevice; //to oysta template\\n //statusHex = (statusHex);\\n statusHex = hexToBin(statusHex);\\n statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\n battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\n cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\n workMode = parseInt(statusHex.substring(13, 16), 2);\\n general += 'statusDevice:' + statusDevice + ',';\\n if (battery_percentage) {\\n general += 'battery:' + battery_percentage + ',';\\n }\\n if (cellNetworkSignal) {\\n general += 'cellNetworkSignal:' + cellNetworkSignal + ',';\\n }\\n if (workMode) {\\n general += 'workMode:' + workMode + ',';\\n }\\n //messageForReceiver = (`CareWatch-CYC;${imei};${i};${event_time};${battery_percentage}`);\\n break;\\n //Call Records\\n case '25':\\n //Needed?\\n break;\\n //BLE Location 2\\n case '26':\\n //I don't understand\\n //messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n //Smart Location\\n case '27':\\n location_type = 'SMART';\\n var latitudeHex = value.substring(0, 8);\\n var longitudeHex = value.substring(8, 16);\\n var location_accuracyHex = value.substring(16, 20);\\n var altitudeHex = value.substring(20, 24);\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n var altitude = hexToDecimal(changeEndianness(altitudeHex));\\n //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\n //04/08/2022 se quita el multiplicador por 5 pq ya viene el valor en metros\\n location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\n //location_time = timestamp;\\n smart_data = `${latitude},${longitude},${location_accuracy},${altitude}`;\\n general += 'smart location (lat):' + latitude + ', (long):' + longitude + ',';\\n break;\\n //Beacon Location Added 11/10/22\\n case '28':\\n location_type = 'BEACON';\\n // var alarm = 'EBZI';\\n var latitudeHex = '00';\\n var longitudeHex = '00';\\n var descr = 'empty';\\n var flag = hexToDecimal(value.substring(0, 1));\\n var beacId = hexToDecimal(value.substring(1, 2));\\n // msg includes descrip\\n if ((flag & 4) == 4) {\\n descr = hexToAscii(value.substring(18, value.length));\\n }\\n // msg includes lat/lon\\n if ((flag & 8) == 8) {\\n latitudeHex = value.substring(18, 26);\\n longitudeHex = value.substring(26, 34);\\n }\\n // msg includes lat/lon and description\\n if ((flag & 12) == 12) {\\n latitudeHex = value.substring(18, 26);\\n longitudeHex = value.substring(26, 34);\\n descr = hexToAscii(value.substring(34, value.length));\\n }\\n var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\n // add : format in MAC\\n mac = mac.match(/.{1,2}/g).join(':');\\n var rssiHex = value.substring(14, 16);\\n var rssi1Hex = value.substring(16, 18);\\n rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\n rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\n // var latitudeHex = value.substring(18, 26);\\n // var longitudeHex = value.substring(26, 34);\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n //location_time = timestamp;\\n beacon_data = `${latitude},${longitude},${mac},${descr}`;\\n general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (listIndex):' + beacId + ',';\\n break;\\n // Beacon V2\\n case '2C':\\n location_type = 'BEACON';\\n // var alarm = 'EBZI';\\n var latitudeHex = '00';\\n var longitudeHex = '00';\\n var descr = 'empty';\\n var flag = hexToDecimal(value.substring(0, 1));\\n var beacId = hexToDecimal(value.substring(1, 2));\\n // msg includes descrip\\n if ((flag & 4) == 4) {\\n let desc_leng = hexToDecimal(value.substring(20, 22));\\n descr = hexToAscii(value.substring(22, 22 + (2 * desc_leng)));\\n //descr = hexToAscii(value.substring(18, value.length));\\n }\\n // msg includes lat/lon\\n if ((flag & 8) == 8) {\\n latitudeHex = value.substring(18, 26);\\n longitudeHex = value.substring(26, 34);\\n }\\n // msg includes lat/lon and description\\n if ((flag & 12) == 12) {\\n latitudeHex = value.substring(20, 28);\\n longitudeHex = value.substring(28, 36);\\n let desc_leng = hexToDecimal(value.substring(36, 38));\\n descr = hexToAscii(value.substring(38, 38 + (2 * desc_leng)));\\n }\\n var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\n // add : format in MAC\\n mac = mac.match(/.{1,2}/g).join(':');\\n var rssiHex = value.substring(14, 16);\\n var rssi1Hex = value.substring(16, 18);\\n rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\n rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\n var battery_beacon = hexToDecimal(value.substring(18, 20));\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n //location_time = timestamp;\\n beacon_data = `${latitude},${longitude},${mac},${descr}`;\\n general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (battery):' + battery_beacon + ', (listIndex):' + beacId + ',';\\n break;\\n //Cell Towers Note\\n case '29':\\n location_type = 'LBS';\\n lbs_data = '';\\n var mccHex = changeEndianness(value.substring(0, 4));\\n var mncHex = value.substring(4, 6);\\n var mcc = hexToDecimal(mccHex);\\n lbs_data += mcc + ',';\\n var mnc = hexToDecimal(mncHex);\\n lbs_data += mnc + ',';\\n var indexLbs = 6;\\n var numTowers = (hexToDecimal(keyLengthHex) - 4) / 7;\\n for (let i = 0; i < numTowers; i++) {\\n var rxlHex = changeEndianness(value.substring(indexLbs, indexLbs + 2));\\n var rxl = hexToDecimal(rxlHex);\\n var lacHex = changeEndianness(value.substring(indexLbs + 2, indexLbs + 6));\\n var lac = hexToDecimal(lacHex);\\n var cellTowers = hexToDecimal(changeEndianness(value.substring(indexLbs + 6, indexLbs + 14)));\\n lbs_data += rxl + ',' + lac + ',' + cellTowers + ',';\\n indexLbs += 14;\\n }\\n lbs_data = lbs_data.slice(0, -1);\\n general += lbs_data;\\n break;\\n case '30':\\n //G-sensor.\\n //value = hexToAscii(value);\\n //if (value != '06') {\\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 = (`Watch-${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 //value = hexToAscii(value);\\n //if (value != '06') {\\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 = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n }\\n break;\\n //BLE Connected . For Flic button\\n case '62':\\n location_type = 'BLE';\\n //var alarm = 'EBZI'; \\n //var latitudeHex = '00';\\n //var longitudeHex = '00';\\n //var descr = 'empty';\\n var flag = hexToDecimal(value.substring(0, 2)); // 0= Disconnected, 1= Connected\\n var mac = value.substring(2, 14); // No hace falta darle la vuelta\\n // add : format in MAC\\n mac = mac.match(/.{1,2}/g).join(':');\\n var batLevel = hexToDecimal(value.substring(14, 16)); // 0-100\\n //location_time = timestamp;\\n ble_data = `${flag},${batLevel},${mac}`;\\n general += 'BLE location (State):' + flag + ', (bat):' + batLevel + ', (mac):' + mac + ',';\\n break;\\n }\\n }\\n if (alarmCode) {\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};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 = (`Watch;ACK-FIRM;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\n //AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\n configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\n //configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\n //messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n case '1A':\\n //no ACK need\\n var fwVersion = hexToAscii(value);\\n imei = serverParams.Imei;\\n AddValue(codeValues, \\\"imei\\\", imei);\\n AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\n messageForReceiver = (`Watch;ACK-FIRM;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\n //AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\n configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\n //configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\n break;\\n //IMEI\\n case '03':\\n var imei = hexToDecimal(value);\\n // harcode to avoid conflicts with Rio protocol\\n //if ((imei != '860470063029395') && (imei != '860470063035947')) {\\n // AddValue(codeValues, \\\"error\\\", \\\"device imei is not in this protocol\\\");\\n // AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n //AddValue(codeValues, \\\"IMEI\\\", imei);\\n // return\\n //}\\n if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\n //return;\\n }\\n messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n //ICCID\\n case '04':\\n var iccid = hexToDecimal(value);\\n messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n //BLE-MAC\\n case '05':\\n var bleMac = hexToDecimal(value);\\n messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n //Run Time\\n case '07':\\n var runTime = hexToDecimal(value);\\n messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n case '10': // Ringer Volume\\n var volume = hexToDecimal(value);\\n imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-VOL;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"Volume\\\", volume);\\n AddValue(configsToUpdate, configIds.ReadSystemSettings.Volume, volume);\\n configsToAck.push(configIds.ReadSystemSettings.Volume);\\n break;\\n case '0A': //Performance mode\\n //var workMode = hexToDecimal(value);\\n //messageBody = messageBody + keyLengthHex + key + value;\\n //AddValue(codeValues, \\\"WorkMode\\\", workMode);\\n //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\n //configsToAck.push(configIds.ReadPerformance`Settings.Mode);\\n //var workMode = hexToAscii(value.substring(0, value.length));\\n //var workMode = hexToDecimal(value);\\n //var workMode = hexToAscii(value.substring(0, value.length));\\n var workMode = 1234; // + value + \\\"end\\\";\\n //var workModeVal = 9;\\n //workMode = 'test10';\\n imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-MODE;${imei};`);\\n AddValue(codeValues, \\\"Mode\\\", workMode);\\n AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\n configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n //AddValue(codeValues, \\\"performanceMode\\\", performanceMode);\\n //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, performanceMode);\\n // configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\n break;\\n case '1B':\\n //Decimal o ascii?\\n var gsmModule = hexToDecimal(value);\\n messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n case '1F':\\n //System Language\\n var systemLanguage = hexToAscii(value.substring(0, value.length));\\n imei = serverParams.Imei;\\n //messageBody = messageBody + keyLengthHex + key + value;\\n messageForReceiver = (`Watch;ACK-LANG;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"SystemLanguage\\\", systemLanguage);\\n AddValue(configsToUpdate, configIds.ReadSystemSettings.SystemLanguage, systemLanguage);\\n configsToAck.push(configIds.ReadSystemSettings.SystemLanguage);\\n break;\\n case '33': // phone option\\n // [Value]:83 0B 00 00 {\\\"phoneOption\\\":{\\\"flag_value\\\":2947,\\\"s3\\\":1,\\\"s4\\\":0,\\\"s5\\\":1,\\\"s6\\\":0,\\\"callIncoming\\\":0,\\\"rings\\\":3,\\\"s7\\\":0,\\\"toneID\\\":0,\\\"s1\\\":1,\\\"s2\\\":1}}\\n var statusPhone = hexToBin(value.substring(0, 2)); // To find autoanswer setup\\n if (statusPhone.substring(0, 1) == '1') { // 1 Enable\\n var auto = 'true';\\n } else var auto = 'false';\\n statusPhone = hexToBin(value.substring(2, 4)); // To find allow list setup\\n if (statusPhone.substring(7, 8) == '1') { // 1 Enable\\n allow = 'true';\\n } else var allow = 'false';\\n //statusPhone = hexToBin(value.substring(0, 2)) + hexToBin(value.substring(2, 4));\\n //AddValue(configsToUpdate, configIds.ReadSystemSettings.Statusphone, statusPhone);\\n AddValue(configsToUpdate, configIds.ReadSystemSettings.AllowList, allow);\\n AddValue(configsToUpdate, configIds.ReadSystemSettings.AutoAnswer, auto);\\n //configsToAck.push(configIds.ReadSystemSettings.Statusphone);\\n configsToAck.push(configIds.ReadSystemSettings.AllowList);\\n configsToAck.push(configIds.ReadSystemSettings.AutoAnswer);\\n break;\\n case '34': //ContactList with name\\n var contactNumber = value.substring(1, 2);\\n var telLength = hexToDecimal(value.substring(2, 4));\\n var tel = '';\\n switch (contactNumber) {\\n // Emergency Number\\n case '0':\\n tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\n AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\n AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\n configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\n break;\\n // Speed Dial Number\\n //case '1':\\n // tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\n // AddValue(codeValues, \\\"SpeedDialNumber\\\", tel);\\n // AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.SpeedDialNumber, tel);\\n // configsToAck.push(configIds.ReadSpeedDialSettings.SpeedDialNumber);\\n // break;\\n // Gateway Number\\n case '9': //00447781482635,Esendex UK 0034627177148,Esendex Spain 00447507288240,Esendex UK Acceptance\\n tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\n if (tel.includes('447781482635') || tel.includes('00447781482635')) {\\n tel = 'Esendex UK'\\n } else if (tel.includes('34627177148') || tel.includes('0034627177148')) {\\n tel = 'Esendex Spain'\\n } else if (tel.includes('447507288240') || tel.includes('00447507288240')) {\\n tel = 'Esendex UK Acceptance'\\n } else {\\n tel = 'Default'\\n }\\n AddValue(codeValues, \\\"SMSGateway\\\", tel);\\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\n configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\n break;\\n default:\\n tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\n if (tel.length < 6) {\\n contacts += '';\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\n break;\\n }\\n //contacts += 'A' + (contactNumber - 1) + ': ' + tel + ', ';\\n contacts += tel + ', ';\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\n break;\\n }\\n break;\\n case '40': // APN\\n //no ACK need\\n AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'));\\n configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\n var apn = hexToAscii(value.substring(0, value.length));\\n imei = serverParams.Imei;\\n break;\\n case '41': // APN Username\\n //no ACK need\\n //apn = apn + ',' + hexToAscii(value.substring(0, value.length));\\n break;\\n case '42': // APN Password\\n //no ACK need\\n //apn = apn + ',' + hexToAscii(value.substring(0, value.length));\\n messageForReceiver = (`Watch;ACK-GDATA;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"apn\\\", apn);\\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.APN, apn);\\n configsToAck.push(configIds.ReadCommunicationSettings.APN);\\n break;\\n case '43': //Server Details\\n //52.232.85.255,5678 production 52.174.17.77,5678 acceptance\\n var serverDetails = hexToAscii(value.substring(6, value.length)) + ':' + hexToDecimal(value.substring(4, 6) + value.substring(2, 4));\\n if (serverDetails.includes('52.232.85.255:5678')) {\\n serverDetails = 'Production'\\n } else if (serverDetails.includes('52.174.17.77:5678')) {\\n serverDetails = 'Acceptance'\\n } else if (serverDetails.includes('52.174.17.77:5778')) {\\n serverDetails = 'Protocol-Import'\\n } else if (serverDetails.includes('52.174.17.77:5878')) {\\n serverDetails = 'Protocol-Dev'\\n } else {\\n serverDetails = 'Default'\\n }\\n AddValue(codeValues, \\\"server\\\", serverDetails);\\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.Server, serverDetails);\\n configsToAck.push(configIds.ReadCommunicationSettings.Server);\\n break;\\n case '44': //time interval - work mode intervals\\n imei = serverParams.Imei;\\n messageForReceiver = (`Watch;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 = (`Watch;ACK-CUSTID;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"customeid\\\", value);\\n AddValue(configsToUpdate, configIds.ReadState.CustomId, hexToAscii(value)); //now it comes \\\"3036\\\"\\n configsToAck.push(configIds.ReadState.CustomId);\\n break;\\n case '53': // Non motion alert\\n //2B020080\\n var status = hexToBin(value.substring(6, 8));\\n var alertSetting = '';\\n var enableDisable = '';\\n if (status.substring(0, 1) == '1') {\\n alertSetting = 'Enable, '\\n enableDisable = '1';\\n } else {\\n alertSetting = 'Disable, '\\n };\\n //if (status.substring(5, 6) == '1') {\\n // alertSetting += 'Dial, '\\n //} else {\\n // alertSetting += 'No Dial, '\\n //};\\n var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\n alertSetting += time;\\n imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-NOMOTION;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"nomotion\\\", alertSetting);\\n //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings, enableDisable);\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\n //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\n configsToAck.push(configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings);\\n configsToAck.push(configIds.ReadNonMovementSettings.Time);\\n break;\\n case '56': //Fall down sensibility\\n // '00001100'\\n var fallStatus = hexToBin(value.substring(0, 2));\\n var enalbleDisable = '';\\n //if (fallStatus.substring(4, 5) == '1') {\\n if (fallStatus.substring(0, 1) == '1') {\\n var sensibility = 'Enable, '\\n enalbleDisable = '1'\\n } else {\\n var sensibility = 'Disable, '\\n };\\n if (fallStatus.substring(5, 6) == '1') {\\n sensibility += 'Dial, '\\n } else {\\n sensibility += 'No Dial, '\\n };\\n var imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-FALLALERT;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n var sesibityOptionValue = hexToDecimal(value.substring(1, 2));\\n sensibility += sesibityOptionValue;\\n AddValue(codeValues, \\\"sensibility\\\", sensibility);\\n //AddValue(configsToUpdate, configIds.ReadAlertSettings.FallSettings, sensibility);\\n AddValue(configsToUpdate, configIds.ReadFallSettings.EnableDisableFallSettings, enalbleDisable);\\n AddValue(configsToUpdate, configIds.ReadFallSettings.Sensitivity, sesibityOptionValue);\\n //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\n configsToAck.push(configIds.ReadFallSettings.EnableDisableFallSettings);\\n configsToAck.push(configIds.ReadFallSettings.Sensitivity);\\n break;\\n case '73': //BeaconList\\n var beaconNumber = hexToDecimal(value.substring(1, 2));\\n var beaconStatus = hexToBin(value.substring(0, 1));\\n beaconStatus = hexToAscii(value.substring(30, value.length));\\n //beaconStatus = changeEndianness(value.substring(30, value.length));\\n //homeBeacon += 'B' + (beaconNumber + 1) + ': ' + beaconStatus + ', ';\\n homeBeacon += beaconStatus + ', ';\\n AddValue(codeValues, \\\"homeBeacon\\\", homeBeacon);\\n messageForReceiver = (`Watch;ACK-GDATA;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\n configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\n break;\\n case '4A': //Wifi Network List\\n var wifiSSIDLenght = hexToDecimal(value.substring(2, 4));\\n var wifiPasswordLenght = hexToDecimal(value.substring(4, 6));\\n var wifiIndex = hexToDecimal(value.substring(1, 2));\\n //var wifiStatus = hexToDecimal(value.substring(0, 1));\\n var wifiStatus = value.substring(0, 1);\\n /*var enalbleDisable = wifiSSID = wifiPassword = homeWifi = '';\\n /var homeWifi = '';\\n if (wifiIndex == '0') { // Only first Wifi of the list\\n if (wifiStatus == '8') {\\n homeWifi += ' Enable, '\\n enalbleDisable = '1';\\n } else {\\n homeWifi += ' Disable, '\\n //enalbleDisable = '0';\\n };*/\\n if ((wifiStatus == '8') || (wifiStatus == 'C')) { // 8 == ON OR C== ON and Connected\\n var wifiSSID = hexToAscii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\n var wifiPassword = hexToAscii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\n var imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-WIFI;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n //homeWiFi += 'W' + (wifiIndex + 1) + ': ' + wifiSSID + ', ' + wifiPassword + ';';\\n homeWiFi += wifiSSID + ', ' + wifiPassword + ';';\\n AddValue(codeValues, \\\"wifi\\\", homeWiFi);\\n AddValue(configsToUpdate, configIds.ReadWiFiList.WiFiList, homeWiFi);\\n configsToAck.push(configIds.ReadWiFiList.WiFiList);\\n }\\n //AddValue(configsToUpdate, configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings, enalbleDisable);\\n //AddValue(configsToUpdate, configIds.ReadWiFiSettings.SSID, wifiSSID);\\n //AddValue(configsToUpdate, configIds.ReadWiFiSettings.Password, wifiPassword);\\n //configsToAck.push(configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings);\\n //configsToAck.push(configIds.ReadWiFiSettings.SSID);\\n //configsToAck.push(configIds.ReadWiFiSettings.Password);\\n break;\\n case '21': // Speed Dial Settings\\n // [Value]:53 84 {\\\"call1Button\\\":{\\\"mode\\\":0,\\\"feedBack\\\":3,\\\"task\\\":2,\\\"time\\\":20,\\\"status\\\":1}}\\n var status = hexToBin(value.substring(2, 4)); //always pass 2 HEXs to this function\\n var alertSetting = '';\\n var enalbleDisable = '';\\n if (status.substring(0, 1) == '1') {\\n alertSetting = 'Enable, '\\n enalbleDisable = '1'\\n } else {\\n alertSetting = 'Disable, '\\n //enableDisable = '0';\\n };\\n //var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\n //alertSetting += time;\\n imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-SPEED;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"speed\\\", alertSetting);\\n //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\n AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\n //AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\n //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\n configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\n //configsToAck.push(configIds.ReadNonMovementSettings.Time);\\n break;\\n }\\n }\\n }\\n if (command == '03') {\\n while (index < total_length + 16) {\\n var keyLengthHex = message.substring(index, index = index + 2);\\n var keyLength = 2 * hexToDecimal(keyLengthHex);\\n var key = message.substring(index, index = index + 2);\\n var value = message.substring(index, index = index + keyLength - 2);\\n debug('key = ' + key);\\n debug('value = ' + value);\\n switch (key) {\\n case '01': // Device ID\\n var imei = hexToAscii(value);\\n if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\n //return;\\n }\\n break;\\n //CustomID is not provided so far with command type 03.. commented in the mean time\\n /* case '03':\\n //update customID to check if belongs to this type of device\\n customID = value;\\n if (value != '04') {\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n AddValue(codeValues, \\\"customID\\\", value);\\n return\\n } else {\\n if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\n }\\n AddValue(codeValues, \\\"customID\\\", value);\\n general += 'customID:' + value + ',';\\n break;\\n }\\n break; */\\n case '10': // Heartbeat\\n var heartbeat = hexToAscii(value);\\n event_time = moment.utc().unix();\\n if (index < total_length + 16) {\\n var keyLengthHex = message.substring(index, index = index + 2);\\n keyLength = 2 * hexToDecimal(keyLengthHex);\\n key = message.substring(index, index = index + 2);\\n if (key == '24') {\\n // debug('key: ' + key) //comment those out\\n value = message.substring(index, index = index + keyLength - 2);\\n // debug(value)\\n var timestampHex = value.substring(0, 8);\\n // debug('timestampt hex: ' + timestampHex)\\n timestampHex = changeEndianness(timestampHex);\\n timestamp = hexToDecimal(timestampHex);\\n event_time = timestamp;\\n // debug(event_time)\\n var statusHex = changeEndianness(value.substring(8, 16));\\n // debug(statusHex)\\n var statusInt = hexToDecimal(statusHex);\\n var statusDevice = '';\\n if ((statusInt & 1) == 1) {\\n statusDevice += 'GPS,';\\n }\\n if ((statusInt & 2) == 2) {\\n statusDevice += 'WIFISource,';\\n }\\n if ((statusInt & 4) == 4) {\\n statusDevice += 'CellTower,';\\n }\\n if ((statusInt & 8) == 8) {\\n statusDevice += 'BLELocation,';\\n }\\n if ((statusInt & 16) == 16) {\\n statusDevice += 'Charging,';\\n }\\n if ((statusInt & 32) == 32) {\\n statusDevice += 'FUllyCharged,';\\n }\\n if ((statusInt & 64) == 64) {\\n statusDevice += 'Reboot,';\\n }\\n if ((statusInt & 128) == 128) {\\n statusDevice += 'HistoricalData,';\\n }\\n if ((statusInt & 256) == 256) {\\n statusDevice += 'AGPSDataValid,';\\n }\\n if ((statusInt & 512) == 512) {\\n statusDevice += 'Motion,';\\n }\\n if ((statusInt & 1024) == 1024) {\\n statusDevice += 'SmartLocating,';\\n }\\n if ((statusInt & 2048) == 2048) {\\n statusDevice += 'BeaconLocation,';\\n }\\n if ((statusInt & 4096) == 4096) {\\n statusDevice += 'BLEConnected,';\\n }\\n statusDevice = statusDevice.slice(0, -1);\\n // debug('statusHex:' + statusHex)\\n statusHex = (statusHex);\\n statusHex = hexToBin(statusHex);\\n statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\n // debug(statusHex)\\n battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\n // debug(battery_percentage)\\n // debug(battery_percentage)\\n // debug(statusHex.substring(8, 13))\\n cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\n // debug(cellNetworkSignal)\\n workMode = parseInt(statusHex.substring(13, 16), 2);\\n // debug(workMode)\\n general += 'statusDevice:' + statusDevice + ';';\\n if (battery_percentage) {\\n general += 'battery:' + battery_percentage + ';';\\n }\\n if (cellNetworkSignal) {\\n general += 'cellNetworkSignal:' + cellNetworkSignal + ';';\\n }\\n if (workMode) {\\n general += 'workMode:' + workMode + ';';\\n }\\n }\\n }\\n // revisar\\n var gen_location = '0';\\n //CustomID is not provided so far with command type 03.. commented in the mean time\\n /*if (customID != '04') {\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n AddValue(codeValues, \\\"customID\\\", value);\\n return\\n }*/\\n //messageForReceiver = (`Eview-HTB;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};SIGNAL=${cellNetworkSignal};WM=${workMode};SL=${systemLanguage};GENERAL=${general}`);\\n messageForReceiver = (`Watch-HTB;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n //messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n case '12': // Device requesting timestamp\\n timestamp = moment.utc().unix();\\n timestampHex = decimalToHex(timestamp);\\n timestampHex = changeEndianness(timestampHex);\\n keyLengthHex = ('00' + decimalToHex(1 + (timestampHex.length) / 2)).slice(-2);\\n // respond to device with the timestamp of the server\\n messageBody = messageBody + keyLengthHex + key + timestampHex;\\n messageForReceiver = `Eview;${imei};${sequenceID};Get timestamp`;\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n break;\\n case '21': //Cell Towers\\n var mccHex = value.substring(0, 2);\\n var mncHex = value.substring(2, 3);\\n var mcc = hexToDecimal(mccHex);\\n var mnc = hexToDecimal(mncHex);\\n var numTowers = (keyLength - 4) / 5;\\n var cellTowers = hexToAscii(value);\\n messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n case '22': // WIFI locations \\n location_type = 'WIFI';\\n var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\n //location_time = timestamp;\\n var wifiTowers = value;\\n general += 'wifiTowers:';\\n var indexWifi = 0;\\n var bssid_array = [];\\n gen_location = '';\\n for (let i = 0; i < numWifi; i++) {\\n gen_location += wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\n indexWifi += 14;\\n }\\n gen_location = gen_location.slice(0, -1);\\n general += gen_location;\\n //CustomID is not provided so far with command type 03\\n /*if (customID != '04') {\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n AddValue(codeValues, \\\"customID\\\", value);\\n return\\n }*/\\n if (alarmCode) {\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};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 = (`Watch-ACK;${imei};${message}`); // ${sequenceID}; add ${sequenceID}; 19-07\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n var value = message.substring(index, index = index + keyLength - 2);\\n if (typeof configIds !== 'undefined' && configIds && configIds.ConfigureDevice && configIds.ConfigureDevice.LastConfigured) { // when is defined\\n AddValue(configsToUpdate, configIds.ConfigureDevice.LastConfigured, moment().format('YYYY/MM/DD, HH:mm:ss'));\\n configsToAck.push(configIds.ConfigureDevice.LastConfigured);\\n }\\n //}\\n }\\n if (command == 'FE') {\\n while (index < total_length + 16) {\\n var keyLength = message.substring(index, index = index + 2);\\n keyLength = 2 * hexToDecimal(keyLength);\\n var key = message.substring(index, index = index + 2);\\n var value = message.substring(index, index = index + keyLength - 2);\\n }\\n }\\n // prepare the ACK msg and change config if it is needed\\n lengthAck = messageBody.length / 2;\\n lengthAck = ('0000' + decimalToHex(lengthAck)).slice(-4);\\n lengthAck = lengthAck.toString().substring(2, 4) + lengthAck.toString().substring(0, 2);\\n ////////////checksum CRC 16\\n var checksumAck = byteStringToByteArray(messageBody);\\n checksumAck = crc16byte(checksumAck);\\n checksumAck = decimalToHex(checksumAck);\\n checksumAck = ('0000' + checksumAck).slice(-4);\\n checksumAck = checksumAck.toString().substring(2, 4) + checksumAck.toString().substring(0, 2);\\n prefix = prefix + lengthAck + checksumAck + sequenceID;\\n // To send ACK to the device previous to internal msg with parts\\n if (needsAck == true) {\\n if (messageBody.length <= 2) {\\n ack = 'AB00030008C7' + sequenceID + '7F0100'; // change AB10030008C7 to AB00030008C7\\n } else {\\n ack = prefix + messageBody;\\n }\\n AddValue(codeValues, 'imei', imei);\\n AddValue(codeValues, 'ack', ack);\\n }\\n } else { // checksum was invalid - print out useful debug info and bet quess at imei \\n AddValue(codeValues, \\\"error\\\", \\\"checksum failed for message\\\");\\n AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n i = rawFromBytes.search('3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]');\\n if (i >= 0) {\\n imei = hexToAscii(rawFromBytes.substring(i, i + 30));\\n AddValue(codeValues, \\\"imei\\\", imei);\\n }\\n }\\n }\\n // Auxiliary functions\\n function buildDataToReceiver(codeValues, configsToAck = [], configsToUpdate = [], configsToSend = []) {\\n const dataToReceiver = {\\n values: codeValues\\n };\\n if (configsToAck.length > 0) {\\n dataToReceiver.configsToAck = configsToAck;\\n }\\n if (configsToUpdate.length > 0) {\\n dataToReceiver.configsToUpdate = configsToUpdate;\\n }\\n if (configsToSend.length > 0) {\\n dataToReceiver.configsToSend = configsToSend;\\n }\\n return dataToReceiver;\\n }\\n\\n function AddValue(codeValueArray, p1, p2) { // push code value pair into array\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n codeValueArray.push(cvpair);\\n }\\n // convert functions\\n function asciiToHex(str) { // ascii to hex \\n return [...str].map(char => char.charCodeAt(0).toString(16).padStart(2, '0')).join('');\\n }\\n\\n function byteStringToByteArray(str) { // convierte una cadena hexadecimal en un array de bytes (number[])\\n const bytes = [];\\n for (let i = 0; i < str.length; i += 2) {\\n const byte = parseInt(str.substring(i, i + 2), 16);\\n if (!isNaN(byte) && byte >= 0 && byte <= 255) {\\n bytes.push(byte);\\n }\\n }\\n return bytes;\\n }\\n\\n function decimalToHex(x) {\\n return Number(x).toString(16).toUpperCase();\\n }\\n\\n function hexToBin(hex) { // convierte un valor hexadecimal a su representación binaria, y asegura que tenga al menos 8 bits \\n const bin = parseInt(hex, 16).toString(2);\\n return bin.padStart(hex.length * 4, '0');\\n }\\n\\n function hexToAscii(hex) {\\n if (hex.length % 2 !== 0) {\\n throw new Error(\\\"Hex string length must be even\\\");\\n }\\n let ascii = '';\\n for (let i = 0; i < hex.length; i += 2) {\\n const byte = hex.substr(i, 2);\\n const charCode = parseInt(byte, 16);\\n if (charCode !== 0) { // remove null character (\\\\u0000)\\n ascii += String.fromCharCode(charCode);\\n }\\n }\\n return ascii;\\n //return hex.match(/.{2}/g).map(byte => String.fromCharCode(parseInt(byte, 16))).join('');\\n }\\n\\n function hexToDecimalSigned(hex) { // hex to decimal\\n if (hex.length % 2 !== 0) {\\n hex = '0' + hex;\\n }\\n const num = parseInt(hex, 16);\\n const bits = hex.length * 4;\\n const maxVal = 2 ** bits;\\n return num >= maxVal / 2 ? num - maxVal : num;\\n }\\n\\n function hexToDecimal(hex) {\\n return parseInt(hex, 16);\\n }\\n // CheckSum and debug functions\\n function changeEndianness(hexString) { // changeEndianness\\n if (hexString.length === 0) { //if string is empty or not defined\\n return \\\"\\\";\\n }\\n if (hexString.length % 2 !== 0) {\\n throw new Error(\\\"Hex string length must be even\\\");\\n }\\n return hexString.match(/.{2}/g) // divide in bytes (2 chars)\\n .reverse() // reverse the order\\n .join('');\\n }\\n\\n function calculateCheckSum(payloadData) { // calcula el CRC16 sobre una cadena hexadecimal y devuelve el valor con el endianness invertido\\n const bytes = byteStringToByteArray(payloadData);\\n const crc = crc16byte(bytes);\\n const hex = crc.toString(16).padStart(4, '0').toUpperCase();\\n return changeEndianness(hex);\\n }\\n\\n function crc16byte(byteArray) { // calcula el CRC-16 sobre un array de bytes usando una tabla precalculada (crcTable)\\n let crc = 0x0000;\\n for (const byte of byteArray) {\\n if (byte < 0 || byte > 255 || !Number.isInteger(byte)) {\\n throw new RangeError(\\\"Invalid byte value in input array\\\");\\n }\\n const index = (byte ^ (crc >> 8)) & 0xFF;\\n crc = crcTable[index] ^ (crc << 8);\\n }\\n return crc & 0xFFFF;\\n }\\n\\n function debug(...args) { // write debug info to console log, if localTesting\\n if (localTesting) {\\n console.debug('[DEBUG]', ...args);\\n }\\n }\\n /*\\n function sendMessageToLocalhostNoWait(str) { // sends message to system, closing connection after\\n var server;\\n if (localTesting) {\\n console.log('local testing - sending to protocol-dev server the message ... '); // port 5878\\n console.log(str);\\n server = '52.174.17.77';\\n } else {\\n server = '127.0.0.1';\\n }\\n var c = net.createConnection(5878, server);\\n c.on('error', function(error) {\\n c = net.createConnection(5878, server);\\n });\\n c.write(`${str}`);\\n c.end();\\n }*/\\n function sendMessageToLocalhostNoWait(message) {\\n const server = localTesting ? '52.174.17.77' : '127.0.0.1';\\n //const port = localTesting ? '5878' : ''; //Protocol-dev\\n const port = '5678'; //acceptance-dev\\n if (localTesting) {\\n console.debug('[DEBUG] Sending message to test server:', message);\\n }\\n const client = net.createConnection(port, server, () => {\\n client.write(message);\\n client.end();\\n });\\n client.on('error', (err) => {\\n console.error(`[ERROR] Failed to send message to ${server}:${port}:`, err.message);\\n });\\n client.on('end', () => {\\n if (localTesting) {\\n console.debug('[DEBUG] Connection closed');\\n }\\n });\\n }\\n}\\n// params is not defined locally -> export as module\\nif (typeof(params) === 'undefined') {\\n module.exports = {\\n execute_ops\\n }\\n} else { // on server use local defined vars\\n let return_values = execute_ops(moment, msg, net, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\n // define global returns\\n msg = return_values;\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1748968518},{"Type":1,"NewValue":"{\"Id\":437,\"Name\":\"Access TEC Care Watch\",\"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 // Watch protocol - please see variables and typical values in order below\\n // Watch-CYC;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;SIGNAL=<>;WM=<>;GENERAL=<>\\n // Watch-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\n //\\n // Author: Juanmi Navarro\\n // Created: 01/01/0000\\n // Last modified: 20/05/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', 'Watch');\\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 = (`Watch-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 //<>,<>,<> \\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 //<>,<>,<> \\n if (mac2) {\\n AddValue(codeValues, 'beacon_mac', mac2);\\n var simpleQuery2 = [{\\n 'code': 'Mac',\\n 'value': mac2,\\n }];\\n var simpleQueryLabel2 = {\\n 'table': 'beacons',\\n 'select': 'Name',\\n 'query': simpleQuery2\\n };\\n var labels2 = [];\\n labels2.push(JSON.stringify(simpleQueryLabel2));\\n AddValue(codeValues, 'oysta_labels', JSON.stringify(labels2));\\n }\\n if (params.beacon_major) {\\n AddValue(codeValues, 'beacon_major', params.beacon_major);\\n } else {\\n AddValue(codeValues, 'beacon_major', 0);\\n }\\n if (params.beacon_minor) {\\n AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\n } else {\\n AddValue(codeValues, 'beacon_minor', 0);\\n }\\n //AddValue(codeValues,'oysta_labels', label);\\n //AddValue(codeValues,'oysta_value', mac);\\n if (location_time) {\\n AddValue(codeValues, 'location_time', location_time);\\n }\\n }\\n /* meter mas tarde... \\n if (params.smart_data !== 'undefined') {\\n var gen_location = params.smart_data.split(',')\\n var latitude = gen_location[0]\\n var longitude = gen_location[1]\\n var location_accuracy = gen_location[2]\\n var altitude = gen_location[3]\\n AddValue(codeValues,'latitude', latitude);\\n AddValue(codeValues,'longitude', longitude);\\n AddValue(codeValues,'altitude', altitude);\\n AddValue(codeValues,'location_accuracy', location_accuracy);\\n }\\n */\\n /*else if ((params.event_time) && (params.event_time == '')) {\\n var event_time = moment.utc().unix();\\n AddValue(codeValues,'event_time', event_time);\\n } revisar mas adelante*/\\n // to parse SMS info from the device\\n switch (messageTypeLocalCode) {\\n case 'COMM-SMS': // SMS message sent in\\n if (params.data.startsWith('Device location request')) {\\n configsToAck.push(configIds.Controls.RealTimeLocate);\\n } else if (params.data.startsWith('Set IP ok')) {\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\n } else if (params.data.startsWith('IMEI:')) {\\n configsToAck.push(configIds.Controls.GetFirmwareVersion);\\n } else if (params.data.startsWith('Set IP ok')) {\\n configsToAck.push(configIds.Controls.ClearBufferedMessages);\\n } else if (params.data.startsWith('flush ok')) {\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\n } else if (params.data.startsWith('Set Watch-')) {\\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 = (`Watch-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 = (`Watch;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 = (`Watch;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 = (`Watch-RTL;${params.imei};${location_time};${location_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n break;\\n }\\n if (!params.event_time && !event_time) { // if params.event_time undefined - set it to now. \\n var event_time = moment.utc().unix();\\n AddValue(codeValues, 'event_time', event_time);\\n }\\n // if (!params.location_time && !location_time) { // if params.location_time undefined - set it to now. \\n // var location_time = moment.utc().unix();\\n // AddValue(codeValues, 'location_time', location_time);\\n //}\\n }\\n // send data msg to kibana\\n const data = buildDataToReceiver(codeValues, configsToAck, configsToUpdate, configsToSend);\\n console.log(data);\\n return data\\n // end of main operation\\n // define functions used in operation\\n // decode global msg\\n function decoder(str) { // decode rawdata\\n // CARE Decoder\\n AddValue(codeValues, 'Message : ', str);\\n var message = str;\\n // need to check if checksum is correct for possible msg corruption 10/03/23\\n var checksum = message.substring(8, 12);\\n var messageBody = message.substring(16, message.length);\\n debug('message =' + message);\\n debug('checksum =' + checksum);\\n debug('calculateCheckSum =' + calculateCheckSum(messageBody));\\n if (calculateCheckSum(messageBody) == checksum) { // payload is valid\\n debug(\\\"message has valid checksum\\\");\\n var messageBody = command; // update value for the ACK\\n debug('command =' + command);\\n if (command == '01') {\\n while (index < total_length + 16) {\\n // gen_location = '0'; //cambiado 30/09\\n var keyLengthHex = message.substring(index, index = index + 2);\\n var keyLength = 2 * hexToDecimal(keyLengthHex);\\n var key = message.substring(index, index = index + 2);\\n var value = message.substring(index, index = index + keyLength - 2);\\n debug('key = ' + key);\\n debug('value = ' + value);\\n switch (key) {\\n //Device ID\\n case '01':\\n var imei = hexToAscii(value);\\n // create long connection if it is needed\\n if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\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\\n if ((alarmCodeExtInt & 1) == 1) {\\n var alarm = 'ALF-C';\\n }\\n // Welfare Check-out\\n else if ((alarmCodeExtInt & 2) == 2) {\\n var alarm = 'ALA-C';\\n }\\n // Standard Alerts\\n //Battery low\\n else if ((alarmCodeInt & 1) == 1) {\\n var alarm = 'BATL';\\n }\\n //Overspeed\\n else if ((alarmCodeInt & 2) == 2) {\\n var alarm = 'ALSP';\\n }\\n //Fall\\n else if ((alarmCodeInt & 4) == 4) {\\n var alarm = 'ALF';\\n }\\n //Tilt\\n else if ((alarmCodeInt & 8) == 8) {\\n var alarm = 'Tilt';\\n } else if ((alarmCodeInt & 16) == 16) {\\n if ((alarmCodeInt & 16777216) == 16777216) {\\n var alarm = 'Geo1-IN';\\n } else {\\n var alarm = 'Geo1-OUT';\\n }\\n } else if ((alarmCodeInt & 32) == 32) {\\n if ((alarmCodeInt & 33554432) == 33554432) {\\n var alarm = 'Geo2-IN';\\n } else {\\n var alarm = 'Geo2-OUT';\\n }\\n } else if ((alarmCodeInt & 64) == 64) {\\n if ((alarmCodeInt & 67108864) == 67108864) {\\n var alarm = 'Geo3-IN';\\n } else {\\n var alarm = 'Geo3-OUT';\\n }\\n } else if ((alarmCodeInt & 128) == 128) {\\n if ((alarmCodeInt & 134217728) == 134217728) {\\n var alarm = 'Geo4-IN';\\n } else {\\n var alarm = 'Geo4-OUT';\\n }\\n }\\n //Power Off\\n else if ((alarmCodeInt & 256) == 256) {\\n var alarm = 'PWRF';\\n }\\n //Power On\\n else if ((alarmCodeInt & 512) == 512) {\\n var alarm = 'PWRN';\\n }\\n //Motion\\n else if ((alarmCodeInt & 1024) == 1024) {\\n var alarm = 'ALMOV';\\n }\\n //No Motion\\n else if ((alarmCodeInt & 2048) == 2048) {\\n var alarm = 'ALNM';\\n }\\n //SOS\\n else if ((alarmCodeInt & 4096) == 4096) {\\n var alarm = 'ALSOS';\\n } else if ((alarmCodeInt & 8192) == 8192) {\\n var alarm = 'Side1';\\n } else if ((alarmCodeInt & 16384) == 16384) {\\n var alarm = 'Side2';\\n }\\n //Battery charging\\n else if ((alarmCodeInt & 32768) == 32768) {\\n var alarm = 'BATCN';\\n }\\n //Battery no charging\\n else if ((alarmCodeInt & 65536) == 65536) {\\n var alarm = 'BATCF';\\n }\\n //SOS Ending\\n // Temporary Commented until we know exactly how it works. 22/09/2022\\n else if ((alarmCodeInt & 131072) == 131072) {\\n var alarm = 'SOSEnding';\\n info = 'Alarm Finished';\\n }\\n //Amber Alert EC03 only\\n else if ((alarmCodeInt & 262144) == 262144) {\\n var alarm = 'ALAO';\\n }\\n // welfare Alert check-in ALA-O\\n else if ((alarmCodeInt & 524288) == 524288) {\\n var alarm = 'ALA-O';\\n }\\n // Amber alert Ending ALA-C\\n else if ((alarmCodeInt & 1048576) == 1048576) {\\n var alarm = 'ALA-C';\\n }\\n // Amber alert Ending ALA-C\\n //else if ((alarmCodeInt & 1048576) == 1048576) {\\n // var alarm = 'ALA-C';\\n //}\\n // Fall-Down Alert ending\\n else if ((alarmCodeInt & 2097152) == 2097152) {\\n var alarm = 'ALF-C';\\n }\\n // welfare Alert Ending ALA\\n else if ((alarmCodeInt & 4194304) == 4194304) {\\n var alarm = 'ALA';\\n }\\n // Beacon absent Alert 11/10/22. Need to be added in msg types\\n //else if ((alarmCodeInt & 16777216) == 16777216) {\\n // var alarm = 'BEA';\\n //}\\n general += 'alarm:' + alarm + ',';\\n break;\\n //Custom ID\\n case '03':\\n // in value is customID.... '06' for Watch Care\\n // if ((imei != '860470063029395') && (imei != '860470063035947')) {\\n //update customID to check if belongs to this type of device\\n //value = hexToAscii(value);\\n customID = value;\\n if (value != '3036') {\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n AddValue(codeValues, \\\"customID\\\", value);\\n // exit decoder\\n // const data = buildDataToReceiver(codeValues, configsToAck, configsToUpdate, configsToSend);\\n // console.log(data);\\n return // data\\n } else {\\n if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\n //return;\\n }\\n AddValue(codeValues, \\\"customID\\\", value);\\n general += 'customID:' + value + ',';\\n break;\\n }\\n //Historical Data Completed\\n case '10': // indica q se han terminado de enviar todos los datos historicos.\\n var histData = true;\\n break;\\n //GPS location\\n case '20':\\n location_type = 'GPS';\\n var latitudeHex = value.substring(0, 8);\\n var longitudeHex = value.substring(8, 16);\\n var speedHex = value.substring(16, 20);\\n var directionHex = value.substring(20, 24);\\n var altitudeHex = value.substring(24, 28);\\n var location_accuracyHex = value.substring(28, 32);\\n var mileageHex = value.substring(32, 40);\\n var satellitesHex = value.substring(40, 42);\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n speed = ((hexToDecimal(changeEndianness(speedHex))) / 3.6).toFixed(2); //date 14-02-2023 in m/s\\n var direction = hexToDecimal(changeEndianness(directionHex));\\n var altitude = hexToDecimal(changeEndianness(altitudeHex)); // in meters\\n //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\n // Range: 0.5 to 99.9 \\n location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\n //var mileage = hexToDecimal(changeEndianness(mileageHex)) this is in km/h we need m/s\\n var mileage = hexToDecimal(changeEndianness(mileageHex)); // in meters date 14-02-2023\\n var satellites = hexToDecimal(satellitesHex);\\n // location_time = timestamp;\\n //<>,<>,<>,<>,<>\\n gps_data = `${latitude},${longitude},${location_accuracy},${speed},${direction},${altitude},${satellites},${mileage}`;\\n general += 'gps location (lat):' + latitude + ', (long):' + longitude + ',';\\n break;\\n //WIFI Towers\\n case '22':\\n location_type = 'WIFI';\\n var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\n //location_time = timestamp;\\n var wifiTowers = value;\\n general += 'wifiTowers:';\\n var indexWifi = 0;\\n var bssid_array = [];\\n wifi_data = '';\\n for (let i = 0; i < numWifi; i++) {\\n wifi_data += hexToDecimalSigned(wifiTowers.substring(indexWifi, indexWifi + 2)) + ',' + wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\n indexWifi += 14;\\n }\\n wifi_data = wifi_data.slice(0, -1);\\n general += wifi_data;\\n break;\\n //BLE Location Added 10/10/22\\n case '23':\\n location_type = 'BLE';\\n var mac = value.substring(0, 12);\\n var latitudeHex = value.substring(12, 20);\\n var longitudeHex = value.substring(20, 28);\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n var address = hexToAscii(value.substring(28, value.length));\\n var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\n // add : format in MAC\\n mac = mac.match(/.{1,2}/g).join(':');\\n // location_time = timestamp;\\n ble_data = `${latitude},${longitude},${mac},${address}`;\\n general += 'BLE location (lat):' + latitude + ', (long):' + longitude + ',';\\n break;\\n //General Data , status_data\\n case '24':\\n //var general = 'true'\\n if (customID != '3036') {\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n AddValue(codeValues, \\\"customID\\\", customID);\\n return\\n }\\n if (alarmCode) {\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\n }\\n //else {\\n // messageForReceiver = (`CareWatch-CYC;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};`);\\n //}\\n // reset variables\\n //alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\n var timestampHex = value.substring(0, 8);\\n timestampHex = changeEndianness(timestampHex);\\n timestamp = hexToDecimal(timestampHex);\\n location_time = timestamp;\\n event_time = timestamp;\\n // HardCode to fix possible issue in protocol\\n //event_time = moment.utc().unix();\\n // end of hard code\\n var statusHex = changeEndianness(value.substring(8, 16));\\n var statusInt = hexToDecimal(statusHex);\\n var statusDevice = '';\\n if ((statusInt & 1) == 1) {\\n statusDevice += 'GPS,';\\n }\\n if ((statusInt & 2) == 2) {\\n statusDevice += 'WIFISource,';\\n }\\n if ((statusInt & 4) == 4) {\\n statusDevice += 'CellTower,';\\n }\\n if ((statusInt & 8) == 8) {\\n statusDevice += 'BLELocation,';\\n }\\n //params.BatteryStatus.BatteryStatus = '1';\\n if ((statusInt & 16) == 16) {\\n statusDevice += 'Charging,';\\n // var alarm = 'BATCN';\\n //configs.BatteryStatus.BatteryStatus = '1';\\n /* if (configs.BatteryStatus.BatteryStatus !== '1') {\\n hasConfigs = true;\\n var batteryStatus = '1';\\n var alarm = 'BATCN';\\n let configsToUpdate = [];\\n configsToUpdate.push({\\n 'code': configIds.BatteryStatus.BatteryStatus,\\n 'value': batteryStatus\\n });\\n }*/\\n }\\n if ((statusInt & 32) == 32) {\\n statusDevice += 'FUllyCharged,';\\n //var alarm = 'BATF';\\n // configs.BatteryStatus.BatteryStatus = '3';\\n /* if (configs.BatteryStatus.BatteryStatus !== '3') {\\n hasConfigs = true;\\n var batteryStatus = '3';\\n var alarm = 'BATF';\\n let configsToUpdate = [];\\n configsToUpdate.push({\\n 'code': configIds.BatteryStatus.BatteryStatus,\\n 'value': batteryStatus\\n });\\n }*/\\n }\\n /* if (!((statusInt & 32) == 32) & !((statusInt & 16) == 16)) {\\n statusDevice += 'Not Charging,';\\n var alarm = 'BATCF';\\n //configs.BatteryStatus.BatteryStatus = '2';\\n if (configs.BatteryStatus.BatteryStatus !== '2') {\\n var batteryStatus = '2';\\n var alarm = 'BATCF';\\n let configsToUpdate = [];\\n configsToUpdate.push({\\n 'code': configIds.BatteryStatus.BatteryStatus,\\n 'value': batteryStatus\\n });\\n }\\n }*/\\n if ((statusInt & 64) == 64) {\\n statusDevice += 'Reboot,';\\n }\\n if ((statusInt & 128) == 128) {\\n statusDevice += 'HistoricalData,';\\n }\\n if ((statusInt & 256) == 256) {\\n statusDevice += 'AGPSDataValid,';\\n }\\n if ((statusInt & 512) == 512) {\\n statusDevice += 'Motion,';\\n }\\n if ((statusInt & 1024) == 1024) {\\n statusDevice += 'SmartLocating,';\\n }\\n if ((statusInt & 2048) == 2048) { //isHome\\n statusDevice += 'BeaconLocation,';\\n }\\n if ((statusInt & 4096) == 4096) {\\n statusDevice += 'BLEConnected,';\\n }\\n if ((statusInt & 16384) == 16384) {\\n statusDevice += 'HomeWiFi,';\\n }\\n statusDevice = statusDevice.slice(0, -1);\\n status_data = statusDevice; //to oysta template\\n //statusHex = (statusHex);\\n statusHex = hexToBin(statusHex);\\n statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\n battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\n cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\n workMode = parseInt(statusHex.substring(13, 16), 2);\\n general += 'statusDevice:' + statusDevice + ',';\\n if (battery_percentage) {\\n general += 'battery:' + battery_percentage + ',';\\n }\\n if (cellNetworkSignal) {\\n general += 'cellNetworkSignal:' + cellNetworkSignal + ',';\\n }\\n if (workMode) {\\n general += 'workMode:' + workMode + ',';\\n }\\n //messageForReceiver = (`CareWatch-CYC;${imei};${i};${event_time};${battery_percentage}`);\\n break;\\n //Call Records\\n case '25':\\n //Needed?\\n break;\\n //BLE Location 2\\n case '26':\\n //I don't understand\\n //messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n //Smart Location\\n case '27':\\n location_type = 'SMART';\\n var latitudeHex = value.substring(0, 8);\\n var longitudeHex = value.substring(8, 16);\\n var location_accuracyHex = value.substring(16, 20);\\n var altitudeHex = value.substring(20, 24);\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n var altitude = hexToDecimal(changeEndianness(altitudeHex));\\n //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\n //04/08/2022 se quita el multiplicador por 5 pq ya viene el valor en metros\\n location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\n //location_time = timestamp;\\n smart_data = `${latitude},${longitude},${location_accuracy},${altitude}`;\\n general += 'smart location (lat):' + latitude + ', (long):' + longitude + ',';\\n break;\\n //Beacon Location Added 11/10/22\\n case '28':\\n location_type = 'BEACON';\\n // var alarm = 'EBZI';\\n var latitudeHex = '00';\\n var longitudeHex = '00';\\n var descr = 'empty';\\n var flag = hexToDecimal(value.substring(0, 1));\\n var beacId = hexToDecimal(value.substring(1, 2));\\n // msg includes descrip\\n if ((flag & 4) == 4) {\\n descr = hexToAscii(value.substring(18, value.length));\\n }\\n // msg includes lat/lon\\n if ((flag & 8) == 8) {\\n latitudeHex = value.substring(18, 26);\\n longitudeHex = value.substring(26, 34);\\n }\\n // msg includes lat/lon and description\\n if ((flag & 12) == 12) {\\n latitudeHex = value.substring(18, 26);\\n longitudeHex = value.substring(26, 34);\\n descr = hexToAscii(value.substring(34, value.length));\\n }\\n var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\n // add : format in MAC\\n mac = mac.match(/.{1,2}/g).join(':');\\n var rssiHex = value.substring(14, 16);\\n var rssi1Hex = value.substring(16, 18);\\n rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\n rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\n // var latitudeHex = value.substring(18, 26);\\n // var longitudeHex = value.substring(26, 34);\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n //location_time = timestamp;\\n beacon_data = `${latitude},${longitude},${mac},${descr}`;\\n general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (listIndex):' + beacId + ',';\\n break;\\n // Beacon V2\\n case '2C':\\n location_type = 'BEACON';\\n // var alarm = 'EBZI';\\n var latitudeHex = '00';\\n var longitudeHex = '00';\\n var descr = 'empty';\\n var flag = hexToDecimal(value.substring(0, 1));\\n var beacId = hexToDecimal(value.substring(1, 2));\\n // msg includes descrip\\n if ((flag & 4) == 4) {\\n let desc_leng = hexToDecimal(value.substring(20, 22));\\n descr = hexToAscii(value.substring(22, 22 + (2 * desc_leng)));\\n //descr = hexToAscii(value.substring(18, value.length));\\n }\\n // msg includes lat/lon\\n if ((flag & 8) == 8) {\\n latitudeHex = value.substring(18, 26);\\n longitudeHex = value.substring(26, 34);\\n }\\n // msg includes lat/lon and description\\n if ((flag & 12) == 12) {\\n latitudeHex = value.substring(20, 28);\\n longitudeHex = value.substring(28, 36);\\n let desc_leng = hexToDecimal(value.substring(36, 38));\\n descr = hexToAscii(value.substring(38, 38 + (2 * desc_leng)));\\n }\\n var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\n // add : format in MAC\\n mac = mac.match(/.{1,2}/g).join(':');\\n var rssiHex = value.substring(14, 16);\\n var rssi1Hex = value.substring(16, 18);\\n rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\n rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\n var battery_beacon = hexToDecimal(value.substring(18, 20));\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n //location_time = timestamp;\\n beacon_data = `${latitude},${longitude},${mac},${descr}`;\\n general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (battery):' + battery_beacon + ', (listIndex):' + beacId + ',';\\n break;\\n //Cell Towers Note\\n case '29':\\n location_type = 'LBS';\\n lbs_data = '';\\n var mccHex = changeEndianness(value.substring(0, 4));\\n var mncHex = value.substring(4, 6);\\n var mcc = hexToDecimal(mccHex);\\n lbs_data += mcc + ',';\\n var mnc = hexToDecimal(mncHex);\\n lbs_data += mnc + ',';\\n var indexLbs = 6;\\n var numTowers = (hexToDecimal(keyLengthHex) - 4) / 7;\\n for (let i = 0; i < numTowers; i++) {\\n var rxlHex = changeEndianness(value.substring(indexLbs, indexLbs + 2));\\n var rxl = hexToDecimal(rxlHex);\\n var lacHex = changeEndianness(value.substring(indexLbs + 2, indexLbs + 6));\\n var lac = hexToDecimal(lacHex);\\n var cellTowers = hexToDecimal(changeEndianness(value.substring(indexLbs + 6, indexLbs + 14)));\\n lbs_data += rxl + ',' + lac + ',' + cellTowers + ',';\\n indexLbs += 14;\\n }\\n lbs_data = lbs_data.slice(0, -1);\\n general += lbs_data;\\n break;\\n case '30':\\n //G-sensor.\\n //value = hexToAscii(value);\\n //if (value != '06') {\\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 = (`Watch-${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 //value = hexToAscii(value);\\n //if (value != '06') {\\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 = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n }\\n break;\\n //BLE Connected . For Flic button\\n case '62':\\n location_type = 'BLE';\\n //var alarm = 'EBZI'; \\n //var latitudeHex = '00';\\n //var longitudeHex = '00';\\n //var descr = 'empty';\\n var flag = hexToDecimal(value.substring(0, 2)); // 0= Disconnected, 1= Connected\\n var mac = value.substring(2, 14); // No hace falta darle la vuelta\\n // add : format in MAC\\n mac = mac.match(/.{1,2}/g).join(':');\\n var batLevel = hexToDecimal(value.substring(14, 16)); // 0-100\\n //location_time = timestamp;\\n ble_data = `${flag},${batLevel},${mac}`;\\n general += 'BLE location (State):' + flag + ', (bat):' + batLevel + ', (mac):' + mac + ',';\\n break;\\n }\\n }\\n if (alarmCode) {\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};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 = (`Watch;ACK-FIRM;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\n //AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\n configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\n //configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\n //messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n case '1A':\\n //no ACK need\\n var fwVersion = hexToAscii(value);\\n imei = serverParams.Imei;\\n AddValue(codeValues, \\\"imei\\\", imei);\\n AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\n messageForReceiver = (`Watch;ACK-FIRM;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\n //AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\n configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\n //configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\n break;\\n //IMEI\\n case '03':\\n var imei = hexToDecimal(value);\\n // harcode to avoid conflicts with Rio protocol\\n //if ((imei != '860470063029395') && (imei != '860470063035947')) {\\n // AddValue(codeValues, \\\"error\\\", \\\"device imei is not in this protocol\\\");\\n // AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n //AddValue(codeValues, \\\"IMEI\\\", imei);\\n // return\\n //}\\n if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\n //return;\\n }\\n messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n //ICCID\\n case '04':\\n var iccid = hexToDecimal(value);\\n messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n //BLE-MAC\\n case '05':\\n var bleMac = hexToDecimal(value);\\n messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n //Run Time\\n case '07':\\n var runTime = hexToDecimal(value);\\n messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n case '10': // Ringer Volume\\n var volume = hexToDecimal(value);\\n imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-VOL;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"Volume\\\", volume);\\n AddValue(configsToUpdate, configIds.ReadSystemSettings.Volume, volume);\\n configsToAck.push(configIds.ReadSystemSettings.Volume);\\n break;\\n case '0A': //Performance mode\\n //var workMode = hexToDecimal(value);\\n //messageBody = messageBody + keyLengthHex + key + value;\\n //AddValue(codeValues, \\\"WorkMode\\\", workMode);\\n //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\n //configsToAck.push(configIds.ReadPerformance`Settings.Mode);\\n //var workMode = hexToAscii(value.substring(0, value.length));\\n //var workMode = hexToDecimal(value);\\n //var workMode = hexToAscii(value.substring(0, value.length));\\n var workMode = 1234; // + value + \\\"end\\\";\\n //var workModeVal = 9;\\n //workMode = 'test10';\\n imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-MODE;${imei};`);\\n AddValue(codeValues, \\\"Mode\\\", workMode);\\n AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\n configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n //AddValue(codeValues, \\\"performanceMode\\\", performanceMode);\\n //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, performanceMode);\\n // configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\n break;\\n case '1B':\\n //Decimal o ascii?\\n var gsmModule = hexToDecimal(value);\\n messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n case '1F':\\n //System Language\\n var systemLanguage = hexToAscii(value.substring(0, value.length));\\n imei = serverParams.Imei;\\n //messageBody = messageBody + keyLengthHex + key + value;\\n messageForReceiver = (`Watch;ACK-LANG;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"SystemLanguage\\\", systemLanguage);\\n AddValue(configsToUpdate, configIds.ReadSystemSettings.SystemLanguage, systemLanguage);\\n configsToAck.push(configIds.ReadSystemSettings.SystemLanguage);\\n break;\\n case '33': // phone option\\n // [Value]:83 0B 00 00 {\\\"phoneOption\\\":{\\\"flag_value\\\":2947,\\\"s3\\\":1,\\\"s4\\\":0,\\\"s5\\\":1,\\\"s6\\\":0,\\\"callIncoming\\\":0,\\\"rings\\\":3,\\\"s7\\\":0,\\\"toneID\\\":0,\\\"s1\\\":1,\\\"s2\\\":1}}\\n var statusPhone = hexToBin(value.substring(0, 2)); // To find autoanswer setup\\n if (statusPhone.substring(0, 1) == '1') { // 1 Enable\\n var auto = 'true';\\n } else var auto = 'false';\\n statusPhone = hexToBin(value.substring(2, 4)); // To find allow list setup\\n if (statusPhone.substring(7, 8) == '1') { // 1 Enable\\n allow = 'true';\\n } else var allow = 'false';\\n //statusPhone = hexToBin(value.substring(0, 2)) + hexToBin(value.substring(2, 4));\\n //AddValue(configsToUpdate, configIds.ReadSystemSettings.Statusphone, statusPhone);\\n AddValue(configsToUpdate, configIds.ReadSystemSettings.AllowList, allow);\\n AddValue(configsToUpdate, configIds.ReadSystemSettings.AutoAnswer, auto);\\n //configsToAck.push(configIds.ReadSystemSettings.Statusphone);\\n configsToAck.push(configIds.ReadSystemSettings.AllowList);\\n configsToAck.push(configIds.ReadSystemSettings.AutoAnswer);\\n break;\\n case '34': //ContactList with name\\n var contactNumber = value.substring(1, 2);\\n var telLength = hexToDecimal(value.substring(2, 4));\\n var tel = '';\\n switch (contactNumber) {\\n // Emergency Number\\n case '0':\\n tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\n AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\n AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\n configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\n break;\\n // Speed Dial Number\\n //case '1':\\n // tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\n // AddValue(codeValues, \\\"SpeedDialNumber\\\", tel);\\n // AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.SpeedDialNumber, tel);\\n // configsToAck.push(configIds.ReadSpeedDialSettings.SpeedDialNumber);\\n // break;\\n // Gateway Number\\n case '9': //00447781482635,Esendex UK 0034627177148,Esendex Spain 00447507288240,Esendex UK Acceptance\\n tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\n if (tel.includes('447781482635') || tel.includes('00447781482635')) {\\n tel = 'Esendex UK'\\n } else if (tel.includes('34627177148') || tel.includes('0034627177148')) {\\n tel = 'Esendex Spain'\\n } else if (tel.includes('447507288240') || tel.includes('00447507288240')) {\\n tel = 'Esendex UK Acceptance'\\n } else {\\n tel = 'Default'\\n }\\n AddValue(codeValues, \\\"SMSGateway\\\", tel);\\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\n configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\n break;\\n default:\\n tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\n if (tel.length < 6) {\\n contacts += '';\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\n break;\\n }\\n //contacts += 'A' + (contactNumber - 1) + ': ' + tel + ', ';\\n contacts += tel + ', ';\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\n break;\\n }\\n break;\\n case '40': // APN\\n //no ACK need\\n AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'));\\n configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\n var apn = hexToAscii(value.substring(0, value.length));\\n imei = serverParams.Imei;\\n break;\\n case '41': // APN Username\\n //no ACK need\\n //apn = apn + ',' + hexToAscii(value.substring(0, value.length));\\n break;\\n case '42': // APN Password\\n //no ACK need\\n //apn = apn + ',' + hexToAscii(value.substring(0, value.length));\\n messageForReceiver = (`Watch;ACK-GDATA;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"apn\\\", apn);\\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.APN, apn);\\n configsToAck.push(configIds.ReadCommunicationSettings.APN);\\n break;\\n case '43': //Server Details\\n //52.232.85.255,5678 production 52.174.17.77,5678 acceptance\\n var serverDetails = hexToAscii(value.substring(6, value.length)) + ':' + hexToDecimal(value.substring(4, 6) + value.substring(2, 4));\\n if (serverDetails.includes('52.232.85.255:5678')) {\\n serverDetails = 'Production'\\n } else if (serverDetails.includes('52.174.17.77:5678')) {\\n serverDetails = 'Acceptance'\\n } else if (serverDetails.includes('52.174.17.77:5778')) {\\n serverDetails = 'Protocol-Import'\\n } else if (serverDetails.includes('52.174.17.77:5878')) {\\n serverDetails = 'Protocol-Dev'\\n } else {\\n serverDetails = 'Default'\\n }\\n AddValue(codeValues, \\\"server\\\", serverDetails);\\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.Server, serverDetails);\\n configsToAck.push(configIds.ReadCommunicationSettings.Server);\\n break;\\n case '44': //time interval - work mode intervals\\n imei = serverParams.Imei;\\n messageForReceiver = (`Watch;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 = (`Watch;ACK-CUSTID;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"customeid\\\", value);\\n AddValue(configsToUpdate, configIds.ReadState.CustomId, hexToAscii(value)); //now it comes \\\"3036\\\"\\n configsToAck.push(configIds.ReadState.CustomId);\\n break;\\n case '53': // Non motion alert\\n //2B020080\\n var status = hexToBin(value.substring(6, 8));\\n var alertSetting = '';\\n var enableDisable = '';\\n if (status.substring(0, 1) == '1') {\\n alertSetting = 'Enable, '\\n enableDisable = '1';\\n } else {\\n alertSetting = 'Disable, '\\n };\\n //if (status.substring(5, 6) == '1') {\\n // alertSetting += 'Dial, '\\n //} else {\\n // alertSetting += 'No Dial, '\\n //};\\n var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\n alertSetting += time;\\n imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-NOMOTION;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"nomotion\\\", alertSetting);\\n //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings, enableDisable);\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\n //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\n configsToAck.push(configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings);\\n configsToAck.push(configIds.ReadNonMovementSettings.Time);\\n break;\\n case '56': //Fall down sensibility\\n // '00001100'\\n var fallStatus = hexToBin(value.substring(0, 2));\\n var enalbleDisable = '';\\n //if (fallStatus.substring(4, 5) == '1') {\\n if (fallStatus.substring(0, 1) == '1') {\\n var sensibility = 'Enable, '\\n enalbleDisable = '1'\\n } else {\\n var sensibility = 'Disable, '\\n };\\n if (fallStatus.substring(5, 6) == '1') {\\n sensibility += 'Dial, '\\n } else {\\n sensibility += 'No Dial, '\\n };\\n var imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-FALLALERT;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n var sesibityOptionValue = hexToDecimal(value.substring(1, 2));\\n sensibility += sesibityOptionValue;\\n AddValue(codeValues, \\\"sensibility\\\", sensibility);\\n //AddValue(configsToUpdate, configIds.ReadAlertSettings.FallSettings, sensibility);\\n AddValue(configsToUpdate, configIds.ReadFallSettings.EnableDisableFallSettings, enalbleDisable);\\n AddValue(configsToUpdate, configIds.ReadFallSettings.Sensitivity, sesibityOptionValue);\\n //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\n configsToAck.push(configIds.ReadFallSettings.EnableDisableFallSettings);\\n configsToAck.push(configIds.ReadFallSettings.Sensitivity);\\n break;\\n case '73': //BeaconList\\n var beaconNumber = hexToDecimal(value.substring(1, 2));\\n var beaconStatus = hexToBin(value.substring(0, 1));\\n beaconStatus = hexToAscii(value.substring(30, value.length));\\n //beaconStatus = changeEndianness(value.substring(30, value.length));\\n //homeBeacon += 'B' + (beaconNumber + 1) + ': ' + beaconStatus + ', ';\\n homeBeacon += beaconStatus + ', ';\\n AddValue(codeValues, \\\"homeBeacon\\\", homeBeacon);\\n messageForReceiver = (`Watch;ACK-GDATA;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\n configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\n break;\\n case '4A': //Wifi Network List\\n var wifiSSIDLenght = hexToDecimal(value.substring(2, 4));\\n var wifiPasswordLenght = hexToDecimal(value.substring(4, 6));\\n var wifiIndex = hexToDecimal(value.substring(1, 2));\\n //var wifiStatus = hexToDecimal(value.substring(0, 1));\\n var wifiStatus = value.substring(0, 1);\\n /*var enalbleDisable = wifiSSID = wifiPassword = homeWifi = '';\\n /var homeWifi = '';\\n if (wifiIndex == '0') { // Only first Wifi of the list\\n if (wifiStatus == '8') {\\n homeWifi += ' Enable, '\\n enalbleDisable = '1';\\n } else {\\n homeWifi += ' Disable, '\\n //enalbleDisable = '0';\\n };*/\\n if ((wifiStatus == '8') || (wifiStatus == 'C')) { // 8 == ON OR C== ON and Connected\\n var wifiSSID = hexToAscii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\n var wifiPassword = hexToAscii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\n var imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-WIFI;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n //homeWiFi += 'W' + (wifiIndex + 1) + ': ' + wifiSSID + ', ' + wifiPassword + ';';\\n homeWiFi += wifiSSID + ', ' + wifiPassword + ';';\\n AddValue(codeValues, \\\"wifi\\\", homeWiFi);\\n AddValue(configsToUpdate, configIds.ReadWiFiList.WiFiList, homeWiFi);\\n configsToAck.push(configIds.ReadWiFiList.WiFiList);\\n }\\n //AddValue(configsToUpdate, configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings, enalbleDisable);\\n //AddValue(configsToUpdate, configIds.ReadWiFiSettings.SSID, wifiSSID);\\n //AddValue(configsToUpdate, configIds.ReadWiFiSettings.Password, wifiPassword);\\n //configsToAck.push(configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings);\\n //configsToAck.push(configIds.ReadWiFiSettings.SSID);\\n //configsToAck.push(configIds.ReadWiFiSettings.Password);\\n break;\\n case '21': // Speed Dial Settings\\n // [Value]:53 84 {\\\"call1Button\\\":{\\\"mode\\\":0,\\\"feedBack\\\":3,\\\"task\\\":2,\\\"time\\\":20,\\\"status\\\":1}}\\n var status = hexToBin(value.substring(2, 4)); //always pass 2 HEXs to this function\\n var alertSetting = '';\\n var enalbleDisable = '';\\n if (status.substring(0, 1) == '1') {\\n alertSetting = 'Enable, '\\n enalbleDisable = '1'\\n } else {\\n alertSetting = 'Disable, '\\n //enableDisable = '0';\\n };\\n //var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\n //alertSetting += time;\\n imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-SPEED;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"speed\\\", alertSetting);\\n //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\n AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\n //AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\n //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\n configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\n //configsToAck.push(configIds.ReadNonMovementSettings.Time);\\n break;\\n }\\n }\\n }\\n if (command == '03') {\\n while (index < total_length + 16) {\\n var keyLengthHex = message.substring(index, index = index + 2);\\n var keyLength = 2 * hexToDecimal(keyLengthHex);\\n var key = message.substring(index, index = index + 2);\\n var value = message.substring(index, index = index + keyLength - 2);\\n debug('key = ' + key);\\n debug('value = ' + value);\\n switch (key) {\\n case '01': // Device ID\\n var imei = hexToAscii(value);\\n // create long connection if it is needed\\n if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\n return;\\n }\\n break;\\n //CustomID is not provided so far with command type 03.. commented in the mean time\\n /* case '03':\\n //update customID to check if belongs to this type of device\\n customID = value;\\n if (value != '04') {\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n AddValue(codeValues, \\\"customID\\\", value);\\n return\\n } else {\\n if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\n }\\n AddValue(codeValues, \\\"customID\\\", value);\\n general += 'customID:' + value + ',';\\n break;\\n }\\n break; */\\n case '10': // Heartbeat\\n var heartbeat = hexToAscii(value);\\n event_time = moment.utc().unix();\\n if (index < total_length + 16) {\\n var keyLengthHex = message.substring(index, index = index + 2);\\n keyLength = 2 * hexToDecimal(keyLengthHex);\\n key = message.substring(index, index = index + 2);\\n if (key == '24') {\\n // debug('key: ' + key) //comment those out\\n value = message.substring(index, index = index + keyLength - 2);\\n // debug(value)\\n var timestampHex = value.substring(0, 8);\\n // debug('timestampt hex: ' + timestampHex)\\n timestampHex = changeEndianness(timestampHex);\\n timestamp = hexToDecimal(timestampHex);\\n event_time = timestamp;\\n // debug(event_time)\\n var statusHex = changeEndianness(value.substring(8, 16));\\n // debug(statusHex)\\n var statusInt = hexToDecimal(statusHex);\\n var statusDevice = '';\\n if ((statusInt & 1) == 1) {\\n statusDevice += 'GPS,';\\n }\\n if ((statusInt & 2) == 2) {\\n statusDevice += 'WIFISource,';\\n }\\n if ((statusInt & 4) == 4) {\\n statusDevice += 'CellTower,';\\n }\\n if ((statusInt & 8) == 8) {\\n statusDevice += 'BLELocation,';\\n }\\n if ((statusInt & 16) == 16) {\\n statusDevice += 'Charging,';\\n }\\n if ((statusInt & 32) == 32) {\\n statusDevice += 'FUllyCharged,';\\n }\\n if ((statusInt & 64) == 64) {\\n statusDevice += 'Reboot,';\\n }\\n if ((statusInt & 128) == 128) {\\n statusDevice += 'HistoricalData,';\\n }\\n if ((statusInt & 256) == 256) {\\n statusDevice += 'AGPSDataValid,';\\n }\\n if ((statusInt & 512) == 512) {\\n statusDevice += 'Motion,';\\n }\\n if ((statusInt & 1024) == 1024) {\\n statusDevice += 'SmartLocating,';\\n }\\n if ((statusInt & 2048) == 2048) {\\n statusDevice += 'BeaconLocation,';\\n }\\n if ((statusInt & 4096) == 4096) {\\n statusDevice += 'BLEConnected,';\\n }\\n statusDevice = statusDevice.slice(0, -1);\\n // debug('statusHex:' + statusHex)\\n statusHex = (statusHex);\\n statusHex = hexToBin(statusHex);\\n statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\n // debug(statusHex)\\n battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\n // debug(battery_percentage)\\n // debug(battery_percentage)\\n // debug(statusHex.substring(8, 13))\\n cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\n // debug(cellNetworkSignal)\\n workMode = parseInt(statusHex.substring(13, 16), 2);\\n // debug(workMode)\\n general += 'statusDevice:' + statusDevice + ';';\\n if (battery_percentage) {\\n general += 'battery:' + battery_percentage + ';';\\n }\\n if (cellNetworkSignal) {\\n general += 'cellNetworkSignal:' + cellNetworkSignal + ';';\\n }\\n if (workMode) {\\n general += 'workMode:' + workMode + ';';\\n }\\n }\\n }\\n // revisar\\n var gen_location = '0';\\n //CustomID is not provided so far with command type 03.. commented in the mean time\\n /*if (customID != '04') {\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n AddValue(codeValues, \\\"customID\\\", value);\\n return\\n }*/\\n //messageForReceiver = (`Eview-HTB;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};SIGNAL=${cellNetworkSignal};WM=${workMode};SL=${systemLanguage};GENERAL=${general}`);\\n messageForReceiver = (`Watch-HTB;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n //messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n case '12': // Device requesting timestamp\\n timestamp = moment.utc().unix();\\n timestampHex = decimalToHex(timestamp);\\n timestampHex = changeEndianness(timestampHex);\\n keyLengthHex = ('00' + decimalToHex(1 + (timestampHex.length) / 2)).slice(-2);\\n // respond to device with the timestamp of the server\\n messageBody = messageBody + keyLengthHex + key + timestampHex;\\n messageForReceiver = `Eview;${imei};${sequenceID};Get timestamp`;\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n break;\\n case '21': //Cell Towers\\n var mccHex = value.substring(0, 2);\\n var mncHex = value.substring(2, 3);\\n var mcc = hexToDecimal(mccHex);\\n var mnc = hexToDecimal(mncHex);\\n var numTowers = (keyLength - 4) / 5;\\n var cellTowers = hexToAscii(value);\\n messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n case '22': // WIFI locations \\n location_type = 'WIFI';\\n var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\n //location_time = timestamp;\\n var wifiTowers = value;\\n general += 'wifiTowers:';\\n var indexWifi = 0;\\n var bssid_array = [];\\n gen_location = '';\\n for (let i = 0; i < numWifi; i++) {\\n gen_location += wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\n indexWifi += 14;\\n }\\n gen_location = gen_location.slice(0, -1);\\n general += gen_location;\\n //CustomID is not provided so far with command type 03\\n /*if (customID != '04') {\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n AddValue(codeValues, \\\"customID\\\", value);\\n return\\n }*/\\n if (alarmCode) {\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};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 = (`Watch-ACK;${imei};${message}`); // ${sequenceID}; add ${sequenceID}; 19-07\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n var value = message.substring(index, index = index + keyLength - 2);\\n if (typeof configIds !== 'undefined' && configIds && configIds.ConfigureDevice && configIds.ConfigureDevice.LastConfigured) { // when is defined\\n AddValue(configsToUpdate, configIds.ConfigureDevice.LastConfigured, moment().format('YYYY/MM/DD, HH:mm:ss'));\\n configsToAck.push(configIds.ConfigureDevice.LastConfigured);\\n }\\n //}\\n }\\n if (command == 'FE') {\\n while (index < total_length + 16) {\\n var keyLength = message.substring(index, index = index + 2);\\n keyLength = 2 * hexToDecimal(keyLength);\\n var key = message.substring(index, index = index + 2);\\n var value = message.substring(index, index = index + keyLength - 2);\\n }\\n }\\n // prepare the ACK msg and change config if it is needed\\n lengthAck = messageBody.length / 2;\\n lengthAck = ('0000' + decimalToHex(lengthAck)).slice(-4);\\n lengthAck = lengthAck.toString().substring(2, 4) + lengthAck.toString().substring(0, 2);\\n ////////////checksum CRC 16\\n var checksumAck = byteStringToByteArray(messageBody);\\n checksumAck = crc16byte(checksumAck);\\n checksumAck = decimalToHex(checksumAck);\\n checksumAck = ('0000' + checksumAck).slice(-4);\\n checksumAck = checksumAck.toString().substring(2, 4) + checksumAck.toString().substring(0, 2);\\n prefix = prefix + lengthAck + checksumAck + sequenceID;\\n // To send ACK to the device previous to internal msg with parts\\n if (needsAck == true) {\\n if (messageBody.length <= 2) {\\n ack = 'AB00030008C7' + sequenceID + '7F0100'; // change AB10030008C7 to AB00030008C7\\n } else {\\n ack = prefix + messageBody;\\n }\\n AddValue(codeValues, 'imei', imei);\\n AddValue(codeValues, 'ack', ack);\\n }\\n } else { // checksum was invalid - print out useful debug info and bet quess at imei \\n AddValue(codeValues, \\\"error\\\", \\\"checksum failed for message\\\");\\n AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n i = rawFromBytes.search('3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]');\\n if (i >= 0) {\\n imei = hexToAscii(rawFromBytes.substring(i, i + 30));\\n AddValue(codeValues, \\\"imei\\\", imei);\\n }\\n }\\n }\\n // Auxiliary functions\\n function buildDataToReceiver(codeValues, configsToAck = [], configsToUpdate = [], configsToSend = []) {\\n const dataToReceiver = {\\n values: codeValues\\n };\\n if (configsToAck.length > 0) {\\n dataToReceiver.configsToAck = configsToAck;\\n }\\n if (configsToUpdate.length > 0) {\\n dataToReceiver.configsToUpdate = configsToUpdate;\\n }\\n if (configsToSend.length > 0) {\\n dataToReceiver.configsToSend = configsToSend;\\n }\\n return dataToReceiver;\\n }\\n\\n function AddValue(codeValueArray, p1, p2) { // push code value pair into array\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n codeValueArray.push(cvpair);\\n }\\n // convert functions\\n function asciiToHex(str) { // ascii to hex \\n return [...str].map(char => char.charCodeAt(0).toString(16).padStart(2, '0')).join('');\\n }\\n\\n function byteStringToByteArray(str) { // convierte una cadena hexadecimal en un array de bytes (number[])\\n const bytes = [];\\n for (let i = 0; i < str.length; i += 2) {\\n const byte = parseInt(str.substring(i, i + 2), 16);\\n if (!isNaN(byte) && byte >= 0 && byte <= 255) {\\n bytes.push(byte);\\n }\\n }\\n return bytes;\\n }\\n\\n function decimalToHex(x) {\\n return Number(x).toString(16).toUpperCase();\\n }\\n\\n function hexToBin(hex) { // convierte un valor hexadecimal a su representación binaria, y asegura que tenga al menos 8 bits \\n const bin = parseInt(hex, 16).toString(2);\\n return bin.padStart(hex.length * 4, '0');\\n }\\n\\n function hexToAscii(hex) {\\n if (hex.length % 2 !== 0) {\\n throw new Error(\\\"Hex string length must be even\\\");\\n }\\n let ascii = '';\\n for (let i = 0; i < hex.length; i += 2) {\\n const byte = hex.substr(i, 2);\\n const charCode = parseInt(byte, 16);\\n if (charCode !== 0) { // remove null character (\\\\u0000)\\n ascii += String.fromCharCode(charCode);\\n }\\n }\\n return ascii;\\n //return hex.match(/.{2}/g).map(byte => String.fromCharCode(parseInt(byte, 16))).join('');\\n }\\n\\n function hexToDecimalSigned(hex) { // hex to decimal\\n if (hex.length % 2 !== 0) {\\n hex = '0' + hex;\\n }\\n const num = parseInt(hex, 16);\\n const bits = hex.length * 4;\\n const maxVal = 2 ** bits;\\n return num >= maxVal / 2 ? num - maxVal : num;\\n }\\n\\n function hexToDecimal(hex) {\\n return parseInt(hex, 16);\\n }\\n // CheckSum and debug functions\\n function changeEndianness(hexString) { // changeEndianness\\n if (hexString.length === 0) { //if string is empty or not defined\\n return \\\"\\\";\\n }\\n if (hexString.length % 2 !== 0) {\\n throw new Error(\\\"Hex string length must be even\\\");\\n }\\n return hexString.match(/.{2}/g) // divide in bytes (2 chars)\\n .reverse() // reverse the order\\n .join('');\\n }\\n\\n function calculateCheckSum(payloadData) { // calcula el CRC16 sobre una cadena hexadecimal y devuelve el valor con el endianness invertido\\n const bytes = byteStringToByteArray(payloadData);\\n const crc = crc16byte(bytes);\\n const hex = crc.toString(16).padStart(4, '0').toUpperCase();\\n return changeEndianness(hex);\\n }\\n\\n function crc16byte(byteArray) { // calcula el CRC-16 sobre un array de bytes usando una tabla precalculada (crcTable)\\n let crc = 0x0000;\\n for (const byte of byteArray) {\\n if (byte < 0 || byte > 255 || !Number.isInteger(byte)) {\\n throw new RangeError(\\\"Invalid byte value in input array\\\");\\n }\\n const index = (byte ^ (crc >> 8)) & 0xFF;\\n crc = crcTable[index] ^ (crc << 8);\\n }\\n return crc & 0xFFFF;\\n }\\n\\n function debug(...args) { // write debug info to console log, if localTesting\\n if (localTesting) {\\n console.debug('[DEBUG]', ...args);\\n }\\n }\\n /*\\n function sendMessageToLocalhostNoWait(str) { // sends message to system, closing connection after\\n var server;\\n if (localTesting) {\\n console.log('local testing - sending to protocol-dev server the message ... '); // port 5878\\n console.log(str);\\n server = '52.174.17.77';\\n } else {\\n server = '127.0.0.1';\\n }\\n var c = net.createConnection(5878, server);\\n c.on('error', function(error) {\\n c = net.createConnection(5878, server);\\n });\\n c.write(`${str}`);\\n c.end();\\n }*/\\n function sendMessageToLocalhostNoWait(message) {\\n const server = localTesting ? '52.174.17.77' : '127.0.0.1';\\n //const port = localTesting ? '5878' : ''; //Protocol-dev\\n const port = '5678'; //acceptance-dev\\n if (localTesting) {\\n console.debug('[DEBUG] Sending message to test server:', message);\\n }\\n const client = net.createConnection(port, server, () => {\\n client.write(message);\\n client.end();\\n });\\n client.on('error', (err) => {\\n console.error(`[ERROR] Failed to send message to ${server}:${port}:`, err.message);\\n });\\n client.on('end', () => {\\n if (localTesting) {\\n console.debug('[DEBUG] Connection closed');\\n }\\n });\\n }\\n}\\n// params is not defined locally -> export as module\\nif (typeof(params) === 'undefined') {\\n module.exports = {\\n execute_ops\\n }\\n} else { // on server use local defined vars\\n let return_values = execute_ops(moment, msg, net, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\n // define global returns\\n msg = return_values;\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1749057260},{"Type":1,"NewValue":"{\"Id\":437,\"Name\":\"Access TEC Care Watch\",\"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 // Watch protocol - please see variables and typical values in order below\\n // Watch-CYC;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;SIGNAL=<>;WM=<>;GENERAL=<>\\n // Watch-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\n //\\n // Author: Juanmi Navarro\\n // Created: 01/01/0000\\n // Last modified: 20/05/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', 'Watch');\\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 = (`Watch-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 //<>,<>,<> \\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 //<>,<>,<> \\n if (mac2) {\\n AddValue(codeValues, 'beacon_mac', mac2);\\n var simpleQuery2 = [{\\n 'code': 'Mac',\\n 'value': mac2,\\n }];\\n var simpleQueryLabel2 = {\\n 'table': 'beacons',\\n 'select': 'Name',\\n 'query': simpleQuery2\\n };\\n var labels2 = [];\\n labels2.push(JSON.stringify(simpleQueryLabel2));\\n AddValue(codeValues, 'oysta_labels', JSON.stringify(labels2));\\n }\\n if (params.beacon_major) {\\n AddValue(codeValues, 'beacon_major', params.beacon_major);\\n } else {\\n AddValue(codeValues, 'beacon_major', 0);\\n }\\n if (params.beacon_minor) {\\n AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\n } else {\\n AddValue(codeValues, 'beacon_minor', 0);\\n }\\n //AddValue(codeValues,'oysta_labels', label);\\n //AddValue(codeValues,'oysta_value', mac);\\n if (location_time) {\\n AddValue(codeValues, 'location_time', location_time);\\n }\\n }\\n /* meter mas tarde... \\n if (params.smart_data !== 'undefined') {\\n var gen_location = params.smart_data.split(',')\\n var latitude = gen_location[0]\\n var longitude = gen_location[1]\\n var location_accuracy = gen_location[2]\\n var altitude = gen_location[3]\\n AddValue(codeValues,'latitude', latitude);\\n AddValue(codeValues,'longitude', longitude);\\n AddValue(codeValues,'altitude', altitude);\\n AddValue(codeValues,'location_accuracy', location_accuracy);\\n }\\n */\\n /*else if ((params.event_time) && (params.event_time == '')) {\\n var event_time = moment.utc().unix();\\n AddValue(codeValues,'event_time', event_time);\\n } revisar mas adelante*/\\n // to parse SMS info from the device\\n switch (messageTypeLocalCode) {\\n case 'COMM-SMS': // SMS message sent in\\n if (params.data.startsWith('Device location request')) {\\n configsToAck.push(configIds.Controls.RealTimeLocate);\\n } else if (params.data.startsWith('Set IP ok')) {\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\n } else if (params.data.startsWith('IMEI:')) {\\n configsToAck.push(configIds.Controls.GetFirmwareVersion);\\n } else if (params.data.startsWith('Set IP ok')) {\\n configsToAck.push(configIds.Controls.ClearBufferedMessages);\\n } else if (params.data.startsWith('flush ok')) {\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\n } else if (params.data.startsWith('Set Watch-')) {\\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 = (`Watch-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 = (`Watch;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 = (`Watch;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 = (`Watch-RTL;${params.imei};${location_time};${location_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n break;\\n }\\n if (!params.event_time && !event_time) { // if params.event_time undefined - set it to now. \\n var event_time = moment.utc().unix();\\n AddValue(codeValues, 'event_time', event_time);\\n }\\n // if (!params.location_time && !location_time) { // if params.location_time undefined - set it to now. \\n // var location_time = moment.utc().unix();\\n // AddValue(codeValues, 'location_time', location_time);\\n //}\\n }\\n // send data msg to kibana\\n const data = buildDataToReceiver(codeValues, configsToAck, configsToUpdate, configsToSend);\\n console.log(data);\\n return data\\n // end of main operation\\n // define functions used in operation\\n // decode global msg\\n function decoder(str) { // decode rawdata\\n // CARE Decoder\\n AddValue(codeValues, 'Message : ', str);\\n var message = str;\\n // need to check if checksum is correct for possible msg corruption 10/03/23\\n var checksum = message.substring(8, 12);\\n var messageBody = message.substring(16, message.length);\\n debug('message =' + message);\\n debug('checksum =' + checksum);\\n debug('calculateCheckSum =' + calculateCheckSum(messageBody));\\n if (calculateCheckSum(messageBody) == checksum) { // payload is valid\\n debug(\\\"message has valid checksum\\\");\\n var messageBody = command; // update value for the ACK\\n debug('command =' + command);\\n if (command == '01') {\\n while (index < total_length + 16) {\\n // gen_location = '0'; //cambiado 30/09\\n var keyLengthHex = message.substring(index, index = index + 2);\\n var keyLength = 2 * hexToDecimal(keyLengthHex);\\n var key = message.substring(index, index = index + 2);\\n var value = message.substring(index, index = index + keyLength - 2);\\n debug('key = ' + key);\\n debug('value = ' + value);\\n switch (key) {\\n //Device ID\\n case '01':\\n var imei = hexToAscii(value);\\n // create long connection if it is needed\\n if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\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\\n if ((alarmCodeExtInt & 1) == 1) {\\n var alarm = 'ALF-C';\\n }\\n // Welfare Check-out\\n else if ((alarmCodeExtInt & 2) == 2) {\\n var alarm = 'ALA-C';\\n }\\n // Standard Alerts\\n //Battery low\\n else if ((alarmCodeInt & 1) == 1) {\\n var alarm = 'BATL';\\n }\\n //Overspeed\\n else if ((alarmCodeInt & 2) == 2) {\\n var alarm = 'ALSP';\\n }\\n //Fall\\n else if ((alarmCodeInt & 4) == 4) {\\n var alarm = 'ALF';\\n }\\n //Tilt\\n else if ((alarmCodeInt & 8) == 8) {\\n var alarm = 'Tilt';\\n } else if ((alarmCodeInt & 16) == 16) {\\n if ((alarmCodeInt & 16777216) == 16777216) {\\n var alarm = 'Geo1-IN';\\n } else {\\n var alarm = 'Geo1-OUT';\\n }\\n } else if ((alarmCodeInt & 32) == 32) {\\n if ((alarmCodeInt & 33554432) == 33554432) {\\n var alarm = 'Geo2-IN';\\n } else {\\n var alarm = 'Geo2-OUT';\\n }\\n } else if ((alarmCodeInt & 64) == 64) {\\n if ((alarmCodeInt & 67108864) == 67108864) {\\n var alarm = 'Geo3-IN';\\n } else {\\n var alarm = 'Geo3-OUT';\\n }\\n } else if ((alarmCodeInt & 128) == 128) {\\n if ((alarmCodeInt & 134217728) == 134217728) {\\n var alarm = 'Geo4-IN';\\n } else {\\n var alarm = 'Geo4-OUT';\\n }\\n }\\n //Power Off\\n else if ((alarmCodeInt & 256) == 256) {\\n var alarm = 'PWRF';\\n }\\n //Power On\\n else if ((alarmCodeInt & 512) == 512) {\\n var alarm = 'PWRN';\\n }\\n //Motion\\n else if ((alarmCodeInt & 1024) == 1024) {\\n var alarm = 'ALMOV';\\n }\\n //No Motion\\n else if ((alarmCodeInt & 2048) == 2048) {\\n var alarm = 'ALNM';\\n }\\n //SOS\\n else if ((alarmCodeInt & 4096) == 4096) {\\n var alarm = 'ALSOS';\\n } else if ((alarmCodeInt & 8192) == 8192) {\\n var alarm = 'Side1';\\n } else if ((alarmCodeInt & 16384) == 16384) {\\n var alarm = 'Side2';\\n }\\n //Battery charging\\n else if ((alarmCodeInt & 32768) == 32768) {\\n var alarm = 'BATCN';\\n }\\n //Battery no charging\\n else if ((alarmCodeInt & 65536) == 65536) {\\n var alarm = 'BATCF';\\n }\\n //SOS Ending\\n // Temporary Commented until we know exactly how it works. 22/09/2022\\n else if ((alarmCodeInt & 131072) == 131072) {\\n var alarm = 'SOSEnding';\\n info = 'Alarm Finished';\\n }\\n //Amber Alert EC03 only\\n else if ((alarmCodeInt & 262144) == 262144) {\\n var alarm = 'ALAO';\\n }\\n // welfare Alert check-in ALA-O\\n else if ((alarmCodeInt & 524288) == 524288) {\\n var alarm = 'ALA-O';\\n }\\n // Amber alert Ending ALA-C\\n else if ((alarmCodeInt & 1048576) == 1048576) {\\n var alarm = 'ALA-C';\\n }\\n // Amber alert Ending ALA-C\\n //else if ((alarmCodeInt & 1048576) == 1048576) {\\n // var alarm = 'ALA-C';\\n //}\\n // Fall-Down Alert ending\\n else if ((alarmCodeInt & 2097152) == 2097152) {\\n var alarm = 'ALF-C';\\n }\\n // welfare Alert Ending ALA\\n else if ((alarmCodeInt & 4194304) == 4194304) {\\n var alarm = 'ALA';\\n }\\n // Beacon absent Alert 11/10/22. Need to be added in msg types\\n //else if ((alarmCodeInt & 16777216) == 16777216) {\\n // var alarm = 'BEA';\\n //}\\n general += 'alarm:' + alarm + ',';\\n break;\\n //Custom ID\\n case '03':\\n // in value is customID.... '06' for Watch Care\\n // if ((imei != '860470063029395') && (imei != '860470063035947')) {\\n //update customID to check if belongs to this type of device\\n //value = hexToAscii(value);\\n customID = value;\\n if (value != '3036') {\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n AddValue(codeValues, \\\"customID\\\", value);\\n // exit decoder\\n // const data = buildDataToReceiver(codeValues, configsToAck, configsToUpdate, configsToSend);\\n // console.log(data);\\n return // data\\n } else {\\n if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\n //return;\\n }\\n AddValue(codeValues, \\\"customID\\\", value);\\n general += 'customID:' + value + ',';\\n break;\\n }\\n //Historical Data Completed\\n case '10': // indica q se han terminado de enviar todos los datos historicos.\\n var histData = true;\\n break;\\n //GPS location\\n case '20':\\n location_type = 'GPS';\\n var latitudeHex = value.substring(0, 8);\\n var longitudeHex = value.substring(8, 16);\\n var speedHex = value.substring(16, 20);\\n var directionHex = value.substring(20, 24);\\n var altitudeHex = value.substring(24, 28);\\n var location_accuracyHex = value.substring(28, 32);\\n var mileageHex = value.substring(32, 40);\\n var satellitesHex = value.substring(40, 42);\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n speed = ((hexToDecimal(changeEndianness(speedHex))) / 3.6).toFixed(2); //date 14-02-2023 in m/s\\n var direction = hexToDecimal(changeEndianness(directionHex));\\n var altitude = hexToDecimal(changeEndianness(altitudeHex)); // in meters\\n //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\n // Range: 0.5 to 99.9 \\n location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\n //var mileage = hexToDecimal(changeEndianness(mileageHex)) this is in km/h we need m/s\\n var mileage = hexToDecimal(changeEndianness(mileageHex)); // in meters date 14-02-2023\\n var satellites = hexToDecimal(satellitesHex);\\n // location_time = timestamp;\\n //<>,<>,<>,<>,<>\\n gps_data = `${latitude},${longitude},${location_accuracy},${speed},${direction},${altitude},${satellites},${mileage}`;\\n general += 'gps location (lat):' + latitude + ', (long):' + longitude + ',';\\n break;\\n //WIFI Towers\\n case '22':\\n location_type = 'WIFI';\\n var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\n //location_time = timestamp;\\n var wifiTowers = value;\\n general += 'wifiTowers:';\\n var indexWifi = 0;\\n var bssid_array = [];\\n wifi_data = '';\\n for (let i = 0; i < numWifi; i++) {\\n wifi_data += hexToDecimalSigned(wifiTowers.substring(indexWifi, indexWifi + 2)) + ',' + wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\n indexWifi += 14;\\n }\\n wifi_data = wifi_data.slice(0, -1);\\n general += wifi_data;\\n break;\\n //BLE Location Added 10/10/22\\n case '23':\\n location_type = 'BLE';\\n var mac = value.substring(0, 12);\\n var latitudeHex = value.substring(12, 20);\\n var longitudeHex = value.substring(20, 28);\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n var address = hexToAscii(value.substring(28, value.length));\\n var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\n // add : format in MAC\\n mac = mac.match(/.{1,2}/g).join(':');\\n // location_time = timestamp;\\n ble_data = `${latitude},${longitude},${mac},${address}`;\\n general += 'BLE location (lat):' + latitude + ', (long):' + longitude + ',';\\n break;\\n //General Data , status_data\\n case '24':\\n //var general = 'true'\\n if (customID != '3036') {\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n AddValue(codeValues, \\\"customID\\\", customID);\\n return\\n }\\n if (alarmCode) {\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\n }\\n //else {\\n // messageForReceiver = (`CareWatch-CYC;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};`);\\n //}\\n // reset variables\\n //alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\n var timestampHex = value.substring(0, 8);\\n timestampHex = changeEndianness(timestampHex);\\n timestamp = hexToDecimal(timestampHex);\\n location_time = timestamp;\\n event_time = timestamp;\\n // HardCode to fix possible issue in protocol\\n //event_time = moment.utc().unix();\\n // end of hard code\\n var statusHex = changeEndianness(value.substring(8, 16));\\n var statusInt = hexToDecimal(statusHex);\\n var statusDevice = '';\\n if ((statusInt & 1) == 1) {\\n statusDevice += 'GPS,';\\n }\\n if ((statusInt & 2) == 2) {\\n statusDevice += 'WIFISource,';\\n }\\n if ((statusInt & 4) == 4) {\\n statusDevice += 'CellTower,';\\n }\\n if ((statusInt & 8) == 8) {\\n statusDevice += 'BLELocation,';\\n }\\n //params.BatteryStatus.BatteryStatus = '1';\\n if ((statusInt & 16) == 16) {\\n statusDevice += 'Charging,';\\n // var alarm = 'BATCN';\\n //configs.BatteryStatus.BatteryStatus = '1';\\n /* if (configs.BatteryStatus.BatteryStatus !== '1') {\\n hasConfigs = true;\\n var batteryStatus = '1';\\n var alarm = 'BATCN';\\n let configsToUpdate = [];\\n configsToUpdate.push({\\n 'code': configIds.BatteryStatus.BatteryStatus,\\n 'value': batteryStatus\\n });\\n }*/\\n }\\n if ((statusInt & 32) == 32) {\\n statusDevice += 'FUllyCharged,';\\n //var alarm = 'BATF';\\n // configs.BatteryStatus.BatteryStatus = '3';\\n /* if (configs.BatteryStatus.BatteryStatus !== '3') {\\n hasConfigs = true;\\n var batteryStatus = '3';\\n var alarm = 'BATF';\\n let configsToUpdate = [];\\n configsToUpdate.push({\\n 'code': configIds.BatteryStatus.BatteryStatus,\\n 'value': batteryStatus\\n });\\n }*/\\n }\\n /* if (!((statusInt & 32) == 32) & !((statusInt & 16) == 16)) {\\n statusDevice += 'Not Charging,';\\n var alarm = 'BATCF';\\n //configs.BatteryStatus.BatteryStatus = '2';\\n if (configs.BatteryStatus.BatteryStatus !== '2') {\\n var batteryStatus = '2';\\n var alarm = 'BATCF';\\n let configsToUpdate = [];\\n configsToUpdate.push({\\n 'code': configIds.BatteryStatus.BatteryStatus,\\n 'value': batteryStatus\\n });\\n }\\n }*/\\n if ((statusInt & 64) == 64) {\\n statusDevice += 'Reboot,';\\n }\\n if ((statusInt & 128) == 128) {\\n statusDevice += 'HistoricalData,';\\n }\\n if ((statusInt & 256) == 256) {\\n statusDevice += 'AGPSDataValid,';\\n }\\n if ((statusInt & 512) == 512) {\\n statusDevice += 'Motion,';\\n }\\n if ((statusInt & 1024) == 1024) {\\n statusDevice += 'SmartLocating,';\\n }\\n if ((statusInt & 2048) == 2048) { //isHome\\n statusDevice += 'BeaconLocation,';\\n }\\n if ((statusInt & 4096) == 4096) {\\n statusDevice += 'BLEConnected,';\\n }\\n if ((statusInt & 16384) == 16384) {\\n statusDevice += 'HomeWiFi,';\\n }\\n statusDevice = statusDevice.slice(0, -1);\\n status_data = statusDevice; //to oysta template\\n //statusHex = (statusHex);\\n statusHex = hexToBin(statusHex);\\n statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\n battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\n cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\n workMode = parseInt(statusHex.substring(13, 16), 2);\\n general += 'statusDevice:' + statusDevice + ',';\\n if (battery_percentage) {\\n general += 'battery:' + battery_percentage + ',';\\n }\\n if (cellNetworkSignal) {\\n general += 'cellNetworkSignal:' + cellNetworkSignal + ',';\\n }\\n if (workMode) {\\n general += 'workMode:' + workMode + ',';\\n }\\n //messageForReceiver = (`CareWatch-CYC;${imei};${i};${event_time};${battery_percentage}`);\\n break;\\n //Call Records\\n case '25':\\n //Needed?\\n break;\\n //BLE Location 2\\n case '26':\\n //I don't understand\\n //messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n //Smart Location\\n case '27':\\n location_type = 'SMART';\\n var latitudeHex = value.substring(0, 8);\\n var longitudeHex = value.substring(8, 16);\\n var location_accuracyHex = value.substring(16, 20);\\n var altitudeHex = value.substring(20, 24);\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n var altitude = hexToDecimal(changeEndianness(altitudeHex));\\n //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\n //04/08/2022 se quita el multiplicador por 5 pq ya viene el valor en metros\\n location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\n //location_time = timestamp;\\n smart_data = `${latitude},${longitude},${location_accuracy},${altitude}`;\\n general += 'smart location (lat):' + latitude + ', (long):' + longitude + ',';\\n break;\\n //Beacon Location Added 11/10/22\\n case '28':\\n location_type = 'BEACON';\\n // var alarm = 'EBZI';\\n var latitudeHex = '00';\\n var longitudeHex = '00';\\n var descr = 'empty';\\n var flag = hexToDecimal(value.substring(0, 1));\\n var beacId = hexToDecimal(value.substring(1, 2));\\n // msg includes descrip\\n if ((flag & 4) == 4) {\\n descr = hexToAscii(value.substring(18, value.length));\\n }\\n // msg includes lat/lon\\n if ((flag & 8) == 8) {\\n latitudeHex = value.substring(18, 26);\\n longitudeHex = value.substring(26, 34);\\n }\\n // msg includes lat/lon and description\\n if ((flag & 12) == 12) {\\n latitudeHex = value.substring(18, 26);\\n longitudeHex = value.substring(26, 34);\\n descr = hexToAscii(value.substring(34, value.length));\\n }\\n var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\n // add : format in MAC\\n mac = mac.match(/.{1,2}/g).join(':');\\n var rssiHex = value.substring(14, 16);\\n var rssi1Hex = value.substring(16, 18);\\n rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\n rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\n // var latitudeHex = value.substring(18, 26);\\n // var longitudeHex = value.substring(26, 34);\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n //location_time = timestamp;\\n beacon_data = `${latitude},${longitude},${mac},${descr}`;\\n general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (listIndex):' + beacId + ',';\\n break;\\n // Beacon V2\\n case '2C':\\n location_type = 'BEACON';\\n // var alarm = 'EBZI';\\n var latitudeHex = '00';\\n var longitudeHex = '00';\\n var descr = 'empty';\\n var flag = hexToDecimal(value.substring(0, 1));\\n var beacId = hexToDecimal(value.substring(1, 2));\\n // msg includes descrip\\n if ((flag & 4) == 4) {\\n let desc_leng = hexToDecimal(value.substring(20, 22));\\n descr = hexToAscii(value.substring(22, 22 + (2 * desc_leng)));\\n //descr = hexToAscii(value.substring(18, value.length));\\n }\\n // msg includes lat/lon\\n if ((flag & 8) == 8) {\\n latitudeHex = value.substring(18, 26);\\n longitudeHex = value.substring(26, 34);\\n }\\n // msg includes lat/lon and description\\n if ((flag & 12) == 12) {\\n latitudeHex = value.substring(20, 28);\\n longitudeHex = value.substring(28, 36);\\n let desc_leng = hexToDecimal(value.substring(36, 38));\\n descr = hexToAscii(value.substring(38, 38 + (2 * desc_leng)));\\n }\\n var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\n // add : format in MAC\\n mac = mac.match(/.{1,2}/g).join(':');\\n var rssiHex = value.substring(14, 16);\\n var rssi1Hex = value.substring(16, 18);\\n rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\n rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\n var battery_beacon = hexToDecimal(value.substring(18, 20));\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n //location_time = timestamp;\\n beacon_data = `${latitude},${longitude},${mac},${descr}`;\\n general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (battery):' + battery_beacon + ', (listIndex):' + beacId + ',';\\n break;\\n //Cell Towers Note\\n case '29':\\n location_type = 'LBS';\\n lbs_data = '';\\n var mccHex = changeEndianness(value.substring(0, 4));\\n var mncHex = value.substring(4, 6);\\n var mcc = hexToDecimal(mccHex);\\n lbs_data += mcc + ',';\\n var mnc = hexToDecimal(mncHex);\\n lbs_data += mnc + ',';\\n var indexLbs = 6;\\n var numTowers = (hexToDecimal(keyLengthHex) - 4) / 7;\\n for (let i = 0; i < numTowers; i++) {\\n var rxlHex = changeEndianness(value.substring(indexLbs, indexLbs + 2));\\n var rxl = hexToDecimal(rxlHex);\\n var lacHex = changeEndianness(value.substring(indexLbs + 2, indexLbs + 6));\\n var lac = hexToDecimal(lacHex);\\n var cellTowers = hexToDecimal(changeEndianness(value.substring(indexLbs + 6, indexLbs + 14)));\\n lbs_data += rxl + ',' + lac + ',' + cellTowers + ',';\\n indexLbs += 14;\\n }\\n lbs_data = lbs_data.slice(0, -1);\\n general += lbs_data;\\n break;\\n case '30':\\n //G-sensor.\\n //value = hexToAscii(value);\\n //if (value != '06') {\\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 = (`Watch-${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 //value = hexToAscii(value);\\n //if (value != '06') {\\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 = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n }\\n break;\\n //BLE Connected . For Flic button\\n case '62':\\n location_type = 'BLE';\\n //var alarm = 'EBZI'; \\n //var latitudeHex = '00';\\n //var longitudeHex = '00';\\n //var descr = 'empty';\\n var flag = hexToDecimal(value.substring(0, 2)); // 0= Disconnected, 1= Connected\\n var mac = value.substring(2, 14); // No hace falta darle la vuelta\\n // add : format in MAC\\n mac = mac.match(/.{1,2}/g).join(':');\\n var batLevel = hexToDecimal(value.substring(14, 16)); // 0-100\\n //location_time = timestamp;\\n ble_data = `${flag},${batLevel},${mac}`;\\n general += 'BLE location (State):' + flag + ', (bat):' + batLevel + ', (mac):' + mac + ',';\\n break;\\n }\\n }\\n if (alarmCode) {\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};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 = (`Watch;ACK-FIRM;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\n //AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\n configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\n //configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\n //messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n case '1A':\\n //no ACK need\\n var fwVersion = hexToAscii(value);\\n imei = serverParams.Imei;\\n AddValue(codeValues, \\\"imei\\\", imei);\\n AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\n messageForReceiver = (`Watch;ACK-FIRM;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\n //AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\n configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\n //configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\n break;\\n //IMEI\\n case '03':\\n var imei = hexToDecimal(value);\\n // harcode to avoid conflicts with Rio protocol\\n //if ((imei != '860470063029395') && (imei != '860470063035947')) {\\n // AddValue(codeValues, \\\"error\\\", \\\"device imei is not in this protocol\\\");\\n // AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n //AddValue(codeValues, \\\"IMEI\\\", imei);\\n // return\\n //}\\n if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\n //return;\\n }\\n messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n //ICCID\\n case '04':\\n var iccid = hexToDecimal(value);\\n messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n //BLE-MAC\\n case '05':\\n var bleMac = hexToDecimal(value);\\n messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n //Run Time\\n case '07':\\n var runTime = hexToDecimal(value);\\n messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n case '10': // Ringer Volume\\n var volume = hexToDecimal(value);\\n imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-VOL;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"Volume\\\", volume);\\n AddValue(configsToUpdate, configIds.ReadSystemSettings.Volume, volume);\\n configsToAck.push(configIds.ReadSystemSettings.Volume);\\n break;\\n case '0A': //Performance mode\\n //var workMode = hexToDecimal(value);\\n //messageBody = messageBody + keyLengthHex + key + value;\\n //AddValue(codeValues, \\\"WorkMode\\\", workMode);\\n //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\n //configsToAck.push(configIds.ReadPerformance`Settings.Mode);\\n //var workMode = hexToAscii(value.substring(0, value.length));\\n //var workMode = hexToDecimal(value);\\n //var workMode = hexToAscii(value.substring(0, value.length));\\n var workMode = 1234; // + value + \\\"end\\\";\\n //var workModeVal = 9;\\n //workMode = 'test10';\\n imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-MODE;${imei};`);\\n AddValue(codeValues, \\\"Mode\\\", workMode);\\n AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\n configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n //AddValue(codeValues, \\\"performanceMode\\\", performanceMode);\\n //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, performanceMode);\\n // configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\n break;\\n case '1B':\\n //Decimal o ascii?\\n var gsmModule = hexToDecimal(value);\\n messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n case '1F':\\n //System Language\\n var systemLanguage = hexToAscii(value.substring(0, value.length));\\n imei = serverParams.Imei;\\n //messageBody = messageBody + keyLengthHex + key + value;\\n messageForReceiver = (`Watch;ACK-LANG;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"SystemLanguage\\\", systemLanguage);\\n AddValue(configsToUpdate, configIds.ReadSystemSettings.SystemLanguage, systemLanguage);\\n configsToAck.push(configIds.ReadSystemSettings.SystemLanguage);\\n break;\\n case '33': // phone option\\n // [Value]:83 0B 00 00 {\\\"phoneOption\\\":{\\\"flag_value\\\":2947,\\\"s3\\\":1,\\\"s4\\\":0,\\\"s5\\\":1,\\\"s6\\\":0,\\\"callIncoming\\\":0,\\\"rings\\\":3,\\\"s7\\\":0,\\\"toneID\\\":0,\\\"s1\\\":1,\\\"s2\\\":1}}\\n var statusPhone = hexToBin(value.substring(0, 2)); // To find autoanswer setup\\n if (statusPhone.substring(0, 1) == '1') { // 1 Enable\\n var auto = 'true';\\n } else var auto = 'false';\\n statusPhone = hexToBin(value.substring(2, 4)); // To find allow list setup\\n if (statusPhone.substring(7, 8) == '1') { // 1 Enable\\n allow = 'true';\\n } else var allow = 'false';\\n //statusPhone = hexToBin(value.substring(0, 2)) + hexToBin(value.substring(2, 4));\\n //AddValue(configsToUpdate, configIds.ReadSystemSettings.Statusphone, statusPhone);\\n AddValue(configsToUpdate, configIds.ReadSystemSettings.AllowList, allow);\\n AddValue(configsToUpdate, configIds.ReadSystemSettings.AutoAnswer, auto);\\n //configsToAck.push(configIds.ReadSystemSettings.Statusphone);\\n configsToAck.push(configIds.ReadSystemSettings.AllowList);\\n configsToAck.push(configIds.ReadSystemSettings.AutoAnswer);\\n break;\\n case '34': //ContactList with name\\n var contactNumber = value.substring(1, 2);\\n var telLength = hexToDecimal(value.substring(2, 4));\\n var tel = '';\\n switch (contactNumber) {\\n // Emergency Number\\n case '0':\\n tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\n AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\n AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\n configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\n break;\\n // Speed Dial Number\\n //case '1':\\n // tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\n // AddValue(codeValues, \\\"SpeedDialNumber\\\", tel);\\n // AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.SpeedDialNumber, tel);\\n // configsToAck.push(configIds.ReadSpeedDialSettings.SpeedDialNumber);\\n // break;\\n // Gateway Number\\n case '9': //00447781482635,Esendex UK 0034627177148,Esendex Spain 00447507288240,Esendex UK Acceptance\\n tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\n if (tel.includes('447781482635') || tel.includes('00447781482635')) {\\n tel = 'Esendex UK'\\n } else if (tel.includes('34627177148') || tel.includes('0034627177148')) {\\n tel = 'Esendex Spain'\\n } else if (tel.includes('447507288240') || tel.includes('00447507288240')) {\\n tel = 'Esendex UK Acceptance'\\n } else {\\n tel = 'Default'\\n }\\n AddValue(codeValues, \\\"SMSGateway\\\", tel);\\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\n configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\n break;\\n default:\\n tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\n if (tel.length < 6) {\\n contacts += '';\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\n break;\\n }\\n //contacts += 'A' + (contactNumber - 1) + ': ' + tel + ', ';\\n contacts += tel + ', ';\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\n break;\\n }\\n break;\\n case '40': // APN\\n //no ACK need\\n AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'));\\n configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\n var apn = hexToAscii(value.substring(0, value.length));\\n imei = serverParams.Imei;\\n break;\\n case '41': // APN Username\\n //no ACK need\\n //apn = apn + ',' + hexToAscii(value.substring(0, value.length));\\n break;\\n case '42': // APN Password\\n //no ACK need\\n //apn = apn + ',' + hexToAscii(value.substring(0, value.length));\\n messageForReceiver = (`Watch;ACK-GDATA;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"apn\\\", apn);\\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.APN, apn);\\n configsToAck.push(configIds.ReadCommunicationSettings.APN);\\n break;\\n case '43': //Server Details\\n //52.232.85.255,5678 production 52.174.17.77,5678 acceptance\\n var serverDetails = hexToAscii(value.substring(6, value.length)) + ':' + hexToDecimal(value.substring(4, 6) + value.substring(2, 4));\\n if (serverDetails.includes('52.232.85.255:5678')) {\\n serverDetails = 'Production'\\n } else if (serverDetails.includes('52.174.17.77:5678')) {\\n serverDetails = 'Acceptance'\\n } else if (serverDetails.includes('52.174.17.77:5778')) {\\n serverDetails = 'Protocol-Import'\\n } else if (serverDetails.includes('52.174.17.77:5878')) {\\n serverDetails = 'Protocol-Dev'\\n } else {\\n serverDetails = 'Default'\\n }\\n AddValue(codeValues, \\\"server\\\", serverDetails);\\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.Server, serverDetails);\\n configsToAck.push(configIds.ReadCommunicationSettings.Server);\\n break;\\n case '44': //time interval - work mode intervals\\n imei = serverParams.Imei;\\n messageForReceiver = (`Watch;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 = (`Watch;ACK-CUSTID;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"customeid\\\", value);\\n AddValue(configsToUpdate, configIds.ReadState.CustomId, hexToAscii(value)); //now it comes \\\"3036\\\"\\n configsToAck.push(configIds.ReadState.CustomId);\\n break;\\n case '53': // Non motion alert\\n //2B020080\\n var status = hexToBin(value.substring(6, 8));\\n var alertSetting = '';\\n var enableDisable = '';\\n if (status.substring(0, 1) == '1') {\\n alertSetting = 'Enable, '\\n enableDisable = '1';\\n } else {\\n alertSetting = 'Disable, '\\n };\\n //if (status.substring(5, 6) == '1') {\\n // alertSetting += 'Dial, '\\n //} else {\\n // alertSetting += 'No Dial, '\\n //};\\n var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\n alertSetting += time;\\n imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-NOMOTION;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"nomotion\\\", alertSetting);\\n //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings, enableDisable);\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\n //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\n configsToAck.push(configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings);\\n configsToAck.push(configIds.ReadNonMovementSettings.Time);\\n break;\\n case '56': //Fall down sensibility\\n // '00001100'\\n var fallStatus = hexToBin(value.substring(0, 2));\\n var enalbleDisable = '';\\n //if (fallStatus.substring(4, 5) == '1') {\\n if (fallStatus.substring(0, 1) == '1') {\\n var sensibility = 'Enable, '\\n enalbleDisable = '1'\\n } else {\\n var sensibility = 'Disable, '\\n };\\n if (fallStatus.substring(5, 6) == '1') {\\n sensibility += 'Dial, '\\n } else {\\n sensibility += 'No Dial, '\\n };\\n var imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-FALLALERT;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n var sesibityOptionValue = hexToDecimal(value.substring(1, 2));\\n sensibility += sesibityOptionValue;\\n AddValue(codeValues, \\\"sensibility\\\", sensibility);\\n //AddValue(configsToUpdate, configIds.ReadAlertSettings.FallSettings, sensibility);\\n AddValue(configsToUpdate, configIds.ReadFallSettings.EnableDisableFallSettings, enalbleDisable);\\n AddValue(configsToUpdate, configIds.ReadFallSettings.Sensitivity, sesibityOptionValue);\\n //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\n configsToAck.push(configIds.ReadFallSettings.EnableDisableFallSettings);\\n configsToAck.push(configIds.ReadFallSettings.Sensitivity);\\n break;\\n case '73': //BeaconList\\n var beaconNumber = hexToDecimal(value.substring(1, 2));\\n var beaconStatus = hexToBin(value.substring(0, 1));\\n beaconStatus = hexToAscii(value.substring(30, value.length));\\n //beaconStatus = changeEndianness(value.substring(30, value.length));\\n //homeBeacon += 'B' + (beaconNumber + 1) + ': ' + beaconStatus + ', ';\\n homeBeacon += beaconStatus + ', ';\\n AddValue(codeValues, \\\"homeBeacon\\\", homeBeacon);\\n messageForReceiver = (`Watch;ACK-GDATA;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\n configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\n break;\\n case '4A': //Wifi Network List\\n var wifiSSIDLenght = hexToDecimal(value.substring(2, 4));\\n var wifiPasswordLenght = hexToDecimal(value.substring(4, 6));\\n var wifiIndex = hexToDecimal(value.substring(1, 2));\\n //var wifiStatus = hexToDecimal(value.substring(0, 1));\\n var wifiStatus = value.substring(0, 1);\\n /*var enalbleDisable = wifiSSID = wifiPassword = homeWifi = '';\\n /var homeWifi = '';\\n if (wifiIndex == '0') { // Only first Wifi of the list\\n if (wifiStatus == '8') {\\n homeWifi += ' Enable, '\\n enalbleDisable = '1';\\n } else {\\n homeWifi += ' Disable, '\\n //enalbleDisable = '0';\\n };*/\\n if ((wifiStatus == '8') || (wifiStatus == 'C')) { // 8 == ON OR C== ON and Connected\\n var wifiSSID = hexToAscii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\n var wifiPassword = hexToAscii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\n var imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-WIFI;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n //homeWiFi += 'W' + (wifiIndex + 1) + ': ' + wifiSSID + ', ' + wifiPassword + ';';\\n homeWiFi += wifiSSID + ', ' + wifiPassword + ';';\\n AddValue(codeValues, \\\"wifi\\\", homeWiFi);\\n AddValue(configsToUpdate, configIds.ReadWiFiList.WiFiList, homeWiFi);\\n configsToAck.push(configIds.ReadWiFiList.WiFiList);\\n }\\n //AddValue(configsToUpdate, configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings, enalbleDisable);\\n //AddValue(configsToUpdate, configIds.ReadWiFiSettings.SSID, wifiSSID);\\n //AddValue(configsToUpdate, configIds.ReadWiFiSettings.Password, wifiPassword);\\n //configsToAck.push(configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings);\\n //configsToAck.push(configIds.ReadWiFiSettings.SSID);\\n //configsToAck.push(configIds.ReadWiFiSettings.Password);\\n break;\\n case '21': // Speed Dial Settings\\n // [Value]:53 84 {\\\"call1Button\\\":{\\\"mode\\\":0,\\\"feedBack\\\":3,\\\"task\\\":2,\\\"time\\\":20,\\\"status\\\":1}}\\n var status = hexToBin(value.substring(2, 4)); //always pass 2 HEXs to this function\\n var alertSetting = '';\\n var enalbleDisable = '';\\n if (status.substring(0, 1) == '1') {\\n alertSetting = 'Enable, '\\n enalbleDisable = '1'\\n } else {\\n alertSetting = 'Disable, '\\n //enableDisable = '0';\\n };\\n //var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\n //alertSetting += time;\\n imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-SPEED;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"speed\\\", alertSetting);\\n //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\n AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\n //AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\n //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\n configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\n //configsToAck.push(configIds.ReadNonMovementSettings.Time);\\n break;\\n }\\n }\\n }\\n if (command == '03') {\\n while (index < total_length + 16) {\\n var keyLengthHex = message.substring(index, index = index + 2);\\n var keyLength = 2 * hexToDecimal(keyLengthHex);\\n var key = message.substring(index, index = index + 2);\\n var value = message.substring(index, index = index + keyLength - 2);\\n debug('key = ' + key);\\n debug('value = ' + value);\\n switch (key) {\\n case '01': // Device ID\\n var imei = hexToAscii(value);\\n // create long connection if it is needed\\n if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\n //return;\\n }\\n break;\\n //CustomID is not provided so far with command type 03.. commented in the mean time\\n /* case '03':\\n //update customID to check if belongs to this type of device\\n customID = value;\\n if (value != '04') {\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n AddValue(codeValues, \\\"customID\\\", value);\\n return\\n } else {\\n if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\n }\\n AddValue(codeValues, \\\"customID\\\", value);\\n general += 'customID:' + value + ',';\\n break;\\n }\\n break; */\\n case '10': // Heartbeat\\n var heartbeat = hexToAscii(value);\\n event_time = moment.utc().unix();\\n if (index < total_length + 16) {\\n var keyLengthHex = message.substring(index, index = index + 2);\\n keyLength = 2 * hexToDecimal(keyLengthHex);\\n key = message.substring(index, index = index + 2);\\n if (key == '24') {\\n // debug('key: ' + key) //comment those out\\n value = message.substring(index, index = index + keyLength - 2);\\n // debug(value)\\n var timestampHex = value.substring(0, 8);\\n // debug('timestampt hex: ' + timestampHex)\\n timestampHex = changeEndianness(timestampHex);\\n timestamp = hexToDecimal(timestampHex);\\n event_time = timestamp;\\n // debug(event_time)\\n var statusHex = changeEndianness(value.substring(8, 16));\\n // debug(statusHex)\\n var statusInt = hexToDecimal(statusHex);\\n var statusDevice = '';\\n if ((statusInt & 1) == 1) {\\n statusDevice += 'GPS,';\\n }\\n if ((statusInt & 2) == 2) {\\n statusDevice += 'WIFISource,';\\n }\\n if ((statusInt & 4) == 4) {\\n statusDevice += 'CellTower,';\\n }\\n if ((statusInt & 8) == 8) {\\n statusDevice += 'BLELocation,';\\n }\\n if ((statusInt & 16) == 16) {\\n statusDevice += 'Charging,';\\n }\\n if ((statusInt & 32) == 32) {\\n statusDevice += 'FUllyCharged,';\\n }\\n if ((statusInt & 64) == 64) {\\n statusDevice += 'Reboot,';\\n }\\n if ((statusInt & 128) == 128) {\\n statusDevice += 'HistoricalData,';\\n }\\n if ((statusInt & 256) == 256) {\\n statusDevice += 'AGPSDataValid,';\\n }\\n if ((statusInt & 512) == 512) {\\n statusDevice += 'Motion,';\\n }\\n if ((statusInt & 1024) == 1024) {\\n statusDevice += 'SmartLocating,';\\n }\\n if ((statusInt & 2048) == 2048) {\\n statusDevice += 'BeaconLocation,';\\n }\\n if ((statusInt & 4096) == 4096) {\\n statusDevice += 'BLEConnected,';\\n }\\n statusDevice = statusDevice.slice(0, -1);\\n // debug('statusHex:' + statusHex)\\n statusHex = (statusHex);\\n statusHex = hexToBin(statusHex);\\n statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\n // debug(statusHex)\\n battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\n // debug(battery_percentage)\\n // debug(battery_percentage)\\n // debug(statusHex.substring(8, 13))\\n cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\n // debug(cellNetworkSignal)\\n workMode = parseInt(statusHex.substring(13, 16), 2);\\n // debug(workMode)\\n general += 'statusDevice:' + statusDevice + ';';\\n if (battery_percentage) {\\n general += 'battery:' + battery_percentage + ';';\\n }\\n if (cellNetworkSignal) {\\n general += 'cellNetworkSignal:' + cellNetworkSignal + ';';\\n }\\n if (workMode) {\\n general += 'workMode:' + workMode + ';';\\n }\\n }\\n }\\n // revisar\\n var gen_location = '0';\\n //CustomID is not provided so far with command type 03.. commented in the mean time\\n /*if (customID != '04') {\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n AddValue(codeValues, \\\"customID\\\", value);\\n return\\n }*/\\n //messageForReceiver = (`Eview-HTB;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};SIGNAL=${cellNetworkSignal};WM=${workMode};SL=${systemLanguage};GENERAL=${general}`);\\n messageForReceiver = (`Watch-HTB;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n //messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n case '12': // Device requesting timestamp\\n timestamp = moment.utc().unix();\\n timestampHex = decimalToHex(timestamp);\\n timestampHex = changeEndianness(timestampHex);\\n keyLengthHex = ('00' + decimalToHex(1 + (timestampHex.length) / 2)).slice(-2);\\n // respond to device with the timestamp of the server\\n messageBody = messageBody + keyLengthHex + key + timestampHex;\\n messageForReceiver = `Eview;${imei};${sequenceID};Get timestamp`;\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n break;\\n case '21': //Cell Towers\\n var mccHex = value.substring(0, 2);\\n var mncHex = value.substring(2, 3);\\n var mcc = hexToDecimal(mccHex);\\n var mnc = hexToDecimal(mncHex);\\n var numTowers = (keyLength - 4) / 5;\\n var cellTowers = hexToAscii(value);\\n messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n case '22': // WIFI locations \\n location_type = 'WIFI';\\n var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\n //location_time = timestamp;\\n var wifiTowers = value;\\n general += 'wifiTowers:';\\n var indexWifi = 0;\\n var bssid_array = [];\\n gen_location = '';\\n for (let i = 0; i < numWifi; i++) {\\n gen_location += wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\n indexWifi += 14;\\n }\\n gen_location = gen_location.slice(0, -1);\\n general += gen_location;\\n //CustomID is not provided so far with command type 03\\n /*if (customID != '04') {\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n AddValue(codeValues, \\\"customID\\\", value);\\n return\\n }*/\\n if (alarmCode) {\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};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 = (`Watch-ACK;${imei};${message}`); // ${sequenceID}; add ${sequenceID}; 19-07\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n var value = message.substring(index, index = index + keyLength - 2);\\n if (typeof configIds !== 'undefined' && configIds && configIds.ConfigureDevice && configIds.ConfigureDevice.LastConfigured) { // when is defined\\n AddValue(configsToUpdate, configIds.ConfigureDevice.LastConfigured, moment().format('YYYY/MM/DD, HH:mm:ss'));\\n configsToAck.push(configIds.ConfigureDevice.LastConfigured);\\n }\\n //}\\n }\\n if (command == 'FE') {\\n while (index < total_length + 16) {\\n var keyLength = message.substring(index, index = index + 2);\\n keyLength = 2 * hexToDecimal(keyLength);\\n var key = message.substring(index, index = index + 2);\\n var value = message.substring(index, index = index + keyLength - 2);\\n }\\n }\\n // prepare the ACK msg and change config if it is needed\\n lengthAck = messageBody.length / 2;\\n lengthAck = ('0000' + decimalToHex(lengthAck)).slice(-4);\\n lengthAck = lengthAck.toString().substring(2, 4) + lengthAck.toString().substring(0, 2);\\n ////////////checksum CRC 16\\n var checksumAck = byteStringToByteArray(messageBody);\\n checksumAck = crc16byte(checksumAck);\\n checksumAck = decimalToHex(checksumAck);\\n checksumAck = ('0000' + checksumAck).slice(-4);\\n checksumAck = checksumAck.toString().substring(2, 4) + checksumAck.toString().substring(0, 2);\\n prefix = prefix + lengthAck + checksumAck + sequenceID;\\n // To send ACK to the device previous to internal msg with parts\\n if (needsAck == true) {\\n if (messageBody.length <= 2) {\\n ack = 'AB00030008C7' + sequenceID + '7F0100'; // change AB10030008C7 to AB00030008C7\\n } else {\\n ack = prefix + messageBody;\\n }\\n AddValue(codeValues, 'imei', imei);\\n AddValue(codeValues, 'ack', ack);\\n }\\n } else { // checksum was invalid - print out useful debug info and bet quess at imei \\n AddValue(codeValues, \\\"error\\\", \\\"checksum failed for message\\\");\\n AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n i = rawFromBytes.search('3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]');\\n if (i >= 0) {\\n imei = hexToAscii(rawFromBytes.substring(i, i + 30));\\n AddValue(codeValues, \\\"imei\\\", imei);\\n }\\n }\\n }\\n // Auxiliary functions\\n function buildDataToReceiver(codeValues, configsToAck = [], configsToUpdate = [], configsToSend = []) {\\n const dataToReceiver = {\\n values: codeValues\\n };\\n if (configsToAck.length > 0) {\\n dataToReceiver.configsToAck = configsToAck;\\n }\\n if (configsToUpdate.length > 0) {\\n dataToReceiver.configsToUpdate = configsToUpdate;\\n }\\n if (configsToSend.length > 0) {\\n dataToReceiver.configsToSend = configsToSend;\\n }\\n return dataToReceiver;\\n }\\n\\n function AddValue(codeValueArray, p1, p2) { // push code value pair into array\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n codeValueArray.push(cvpair);\\n }\\n // convert functions\\n function asciiToHex(str) { // ascii to hex \\n return [...str].map(char => char.charCodeAt(0).toString(16).padStart(2, '0')).join('');\\n }\\n\\n function byteStringToByteArray(str) { // convierte una cadena hexadecimal en un array de bytes (number[])\\n const bytes = [];\\n for (let i = 0; i < str.length; i += 2) {\\n const byte = parseInt(str.substring(i, i + 2), 16);\\n if (!isNaN(byte) && byte >= 0 && byte <= 255) {\\n bytes.push(byte);\\n }\\n }\\n return bytes;\\n }\\n\\n function decimalToHex(x) {\\n return Number(x).toString(16).toUpperCase();\\n }\\n\\n function hexToBin(hex) { // convierte un valor hexadecimal a su representación binaria, y asegura que tenga al menos 8 bits \\n const bin = parseInt(hex, 16).toString(2);\\n return bin.padStart(hex.length * 4, '0');\\n }\\n\\n function hexToAscii(hex) {\\n if (hex.length % 2 !== 0) {\\n throw new Error(\\\"Hex string length must be even\\\");\\n }\\n let ascii = '';\\n for (let i = 0; i < hex.length; i += 2) {\\n const byte = hex.substr(i, 2);\\n const charCode = parseInt(byte, 16);\\n if (charCode !== 0) { // remove null character (\\\\u0000)\\n ascii += String.fromCharCode(charCode);\\n }\\n }\\n return ascii;\\n //return hex.match(/.{2}/g).map(byte => String.fromCharCode(parseInt(byte, 16))).join('');\\n }\\n\\n function hexToDecimalSigned(hex) { // hex to decimal\\n if (hex.length % 2 !== 0) {\\n hex = '0' + hex;\\n }\\n const num = parseInt(hex, 16);\\n const bits = hex.length * 4;\\n const maxVal = 2 ** bits;\\n return num >= maxVal / 2 ? num - maxVal : num;\\n }\\n\\n function hexToDecimal(hex) {\\n return parseInt(hex, 16);\\n }\\n // CheckSum and debug functions\\n function changeEndianness(hexString) { // changeEndianness\\n if (hexString.length === 0) { //if string is empty or not defined\\n return \\\"\\\";\\n }\\n if (hexString.length % 2 !== 0) {\\n throw new Error(\\\"Hex string length must be even\\\");\\n }\\n return hexString.match(/.{2}/g) // divide in bytes (2 chars)\\n .reverse() // reverse the order\\n .join('');\\n }\\n\\n function calculateCheckSum(payloadData) { // calcula el CRC16 sobre una cadena hexadecimal y devuelve el valor con el endianness invertido\\n const bytes = byteStringToByteArray(payloadData);\\n const crc = crc16byte(bytes);\\n const hex = crc.toString(16).padStart(4, '0').toUpperCase();\\n return changeEndianness(hex);\\n }\\n\\n function crc16byte(byteArray) { // calcula el CRC-16 sobre un array de bytes usando una tabla precalculada (crcTable)\\n let crc = 0x0000;\\n for (const byte of byteArray) {\\n if (byte < 0 || byte > 255 || !Number.isInteger(byte)) {\\n throw new RangeError(\\\"Invalid byte value in input array\\\");\\n }\\n const index = (byte ^ (crc >> 8)) & 0xFF;\\n crc = crcTable[index] ^ (crc << 8);\\n }\\n return crc & 0xFFFF;\\n }\\n\\n function debug(...args) { // write debug info to console log, if localTesting\\n if (localTesting) {\\n console.debug('[DEBUG]', ...args);\\n }\\n }\\n /*\\n function sendMessageToLocalhostNoWait(str) { // sends message to system, closing connection after\\n var server;\\n if (localTesting) {\\n console.log('local testing - sending to protocol-dev server the message ... '); // port 5878\\n console.log(str);\\n server = '52.174.17.77';\\n } else {\\n server = '127.0.0.1';\\n }\\n var c = net.createConnection(5878, server);\\n c.on('error', function(error) {\\n c = net.createConnection(5878, server);\\n });\\n c.write(`${str}`);\\n c.end();\\n }*/\\n function sendMessageToLocalhostNoWait(message) {\\n const server = localTesting ? '52.174.17.77' : '127.0.0.1';\\n //const port = localTesting ? '5878' : ''; //Protocol-dev\\n const port = '5678'; //acceptance-dev\\n if (localTesting) {\\n console.debug('[DEBUG] Sending message to test server:', message);\\n }\\n const client = net.createConnection(port, server, () => {\\n client.write(message);\\n client.end();\\n });\\n client.on('error', (err) => {\\n console.error(`[ERROR] Failed to send message to ${server}:${port}:`, err.message);\\n });\\n client.on('end', () => {\\n if (localTesting) {\\n console.debug('[DEBUG] Connection closed');\\n }\\n });\\n }\\n}\\n// params is not defined locally -> export as module\\nif (typeof(params) === 'undefined') {\\n module.exports = {\\n execute_ops\\n }\\n} else { // on server use local defined vars\\n let return_values = execute_ops(moment, msg, net, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\n // define global returns\\n msg = return_values;\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1749108422},{"Type":1,"NewValue":"{\"Id\":437,\"Name\":\"Access TEC Care Watch\",\"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 // Watch protocol - please see variables and typical values in order below\\n // Watch-CYC;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;SIGNAL=<>;WM=<>;GENERAL=<>\\n // Watch-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\n //\\n // Author: Juanmi Navarro\\n // Created: 01/01/0000\\n // Last modified: 20/05/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', 'Watch');\\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 = (`Watch-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 //<>,<>,<> \\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 //<>,<>,<> \\n if (mac2) {\\n AddValue(codeValues, 'beacon_mac', mac2);\\n var simpleQuery2 = [{\\n 'code': 'Mac',\\n 'value': mac2,\\n }];\\n var simpleQueryLabel2 = {\\n 'table': 'beacons',\\n 'select': 'Name',\\n 'query': simpleQuery2\\n };\\n var labels2 = [];\\n labels2.push(JSON.stringify(simpleQueryLabel2));\\n AddValue(codeValues, 'oysta_labels', JSON.stringify(labels2));\\n }\\n if (params.beacon_major) {\\n AddValue(codeValues, 'beacon_major', params.beacon_major);\\n } else {\\n AddValue(codeValues, 'beacon_major', 0);\\n }\\n if (params.beacon_minor) {\\n AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\n } else {\\n AddValue(codeValues, 'beacon_minor', 0);\\n }\\n //AddValue(codeValues,'oysta_labels', label);\\n //AddValue(codeValues,'oysta_value', mac);\\n if (location_time) {\\n AddValue(codeValues, 'location_time', location_time);\\n }\\n }\\n /* meter mas tarde... \\n if (params.smart_data !== 'undefined') {\\n var gen_location = params.smart_data.split(',')\\n var latitude = gen_location[0]\\n var longitude = gen_location[1]\\n var location_accuracy = gen_location[2]\\n var altitude = gen_location[3]\\n AddValue(codeValues,'latitude', latitude);\\n AddValue(codeValues,'longitude', longitude);\\n AddValue(codeValues,'altitude', altitude);\\n AddValue(codeValues,'location_accuracy', location_accuracy);\\n }\\n */\\n /*else if ((params.event_time) && (params.event_time == '')) {\\n var event_time = moment.utc().unix();\\n AddValue(codeValues,'event_time', event_time);\\n } revisar mas adelante*/\\n // to parse SMS info from the device\\n switch (messageTypeLocalCode) {\\n case 'COMM-SMS': // SMS message sent in\\n if (params.data.startsWith('Device location request')) {\\n configsToAck.push(configIds.Controls.RealTimeLocate);\\n } else if (params.data.startsWith('Set IP ok')) {\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\n } else if (params.data.startsWith('IMEI:')) {\\n configsToAck.push(configIds.Controls.GetFirmwareVersion);\\n } else if (params.data.startsWith('Set IP ok')) {\\n configsToAck.push(configIds.Controls.ClearBufferedMessages);\\n } else if (params.data.startsWith('flush ok')) {\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\n } else if (params.data.startsWith('Set Watch-')) {\\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 = (`Watch-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 = (`Watch;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 = (`Watch;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 = (`Watch-RTL;${params.imei};${location_time};${location_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n break;\\n }\\n if (!params.event_time && !event_time) { // if params.event_time undefined - set it to now. \\n var event_time = moment.utc().unix();\\n AddValue(codeValues, 'event_time', event_time);\\n }\\n // if (!params.location_time && !location_time) { // if params.location_time undefined - set it to now. \\n // var location_time = moment.utc().unix();\\n // AddValue(codeValues, 'location_time', location_time);\\n //}\\n }\\n // send data msg to kibana\\n const data = buildDataToReceiver(codeValues, configsToAck, configsToUpdate, configsToSend);\\n console.log(data);\\n return data\\n // end of main operation\\n // define functions used in operation\\n // decode global msg\\n function decoder(str) { // decode rawdata\\n // CARE Decoder\\n AddValue(codeValues, 'Message : ', str);\\n var message = str;\\n // need to check if checksum is correct for possible msg corruption 10/03/23\\n var checksum = message.substring(8, 12);\\n var messageBody = message.substring(16, message.length);\\n debug('message =' + message);\\n debug('checksum =' + checksum);\\n debug('calculateCheckSum =' + calculateCheckSum(messageBody));\\n if (calculateCheckSum(messageBody) == checksum) { // payload is valid\\n debug(\\\"message has valid checksum\\\");\\n var messageBody = command; // update value for the ACK\\n debug('command =' + command);\\n if (command == '01') {\\n while (index < total_length + 16) {\\n // gen_location = '0'; //cambiado 30/09\\n var keyLengthHex = message.substring(index, index = index + 2);\\n var keyLength = 2 * hexToDecimal(keyLengthHex);\\n var key = message.substring(index, index = index + 2);\\n var value = message.substring(index, index = index + keyLength - 2);\\n debug('key = ' + key);\\n debug('value = ' + value);\\n switch (key) {\\n //Device ID\\n case '01':\\n var imei = hexToAscii(value);\\n // create long connection if it is needed\\n if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\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\\n if ((alarmCodeExtInt & 1) == 1) {\\n var alarm = 'ALF-C';\\n }\\n // Welfare Check-out\\n else if ((alarmCodeExtInt & 2) == 2) {\\n var alarm = 'ALA-C';\\n }\\n // Standard Alerts\\n //Battery low\\n else if ((alarmCodeInt & 1) == 1) {\\n var alarm = 'BATL';\\n }\\n //Overspeed\\n else if ((alarmCodeInt & 2) == 2) {\\n var alarm = 'ALSP';\\n }\\n //Fall\\n else if ((alarmCodeInt & 4) == 4) {\\n var alarm = 'ALF';\\n }\\n //Tilt\\n else if ((alarmCodeInt & 8) == 8) {\\n var alarm = 'Tilt';\\n } else if ((alarmCodeInt & 16) == 16) {\\n if ((alarmCodeInt & 16777216) == 16777216) {\\n var alarm = 'Geo1-IN';\\n } else {\\n var alarm = 'Geo1-OUT';\\n }\\n } else if ((alarmCodeInt & 32) == 32) {\\n if ((alarmCodeInt & 33554432) == 33554432) {\\n var alarm = 'Geo2-IN';\\n } else {\\n var alarm = 'Geo2-OUT';\\n }\\n } else if ((alarmCodeInt & 64) == 64) {\\n if ((alarmCodeInt & 67108864) == 67108864) {\\n var alarm = 'Geo3-IN';\\n } else {\\n var alarm = 'Geo3-OUT';\\n }\\n } else if ((alarmCodeInt & 128) == 128) {\\n if ((alarmCodeInt & 134217728) == 134217728) {\\n var alarm = 'Geo4-IN';\\n } else {\\n var alarm = 'Geo4-OUT';\\n }\\n }\\n //Power Off\\n else if ((alarmCodeInt & 256) == 256) {\\n var alarm = 'PWRF';\\n }\\n //Power On\\n else if ((alarmCodeInt & 512) == 512) {\\n var alarm = 'PWRN';\\n }\\n //Motion\\n else if ((alarmCodeInt & 1024) == 1024) {\\n var alarm = 'ALMOV';\\n }\\n //No Motion\\n else if ((alarmCodeInt & 2048) == 2048) {\\n var alarm = 'ALNM';\\n }\\n //SOS\\n else if ((alarmCodeInt & 4096) == 4096) {\\n var alarm = 'ALSOS';\\n } else if ((alarmCodeInt & 8192) == 8192) {\\n var alarm = 'Side1';\\n } else if ((alarmCodeInt & 16384) == 16384) {\\n var alarm = 'Side2';\\n }\\n //Battery charging\\n else if ((alarmCodeInt & 32768) == 32768) {\\n var alarm = 'BATCN';\\n }\\n //Battery no charging\\n else if ((alarmCodeInt & 65536) == 65536) {\\n var alarm = 'BATCF';\\n }\\n //SOS Ending\\n // Temporary Commented until we know exactly how it works. 22/09/2022\\n else if ((alarmCodeInt & 131072) == 131072) {\\n var alarm = 'SOSEnding';\\n info = 'Alarm Finished';\\n }\\n //Amber Alert EC03 only\\n else if ((alarmCodeInt & 262144) == 262144) {\\n var alarm = 'ALAO';\\n }\\n // welfare Alert check-in ALA-O\\n else if ((alarmCodeInt & 524288) == 524288) {\\n var alarm = 'ALA-O';\\n }\\n // Amber alert Ending ALA-C\\n else if ((alarmCodeInt & 1048576) == 1048576) {\\n var alarm = 'ALA-C';\\n }\\n // Amber alert Ending ALA-C\\n //else if ((alarmCodeInt & 1048576) == 1048576) {\\n // var alarm = 'ALA-C';\\n //}\\n // Fall-Down Alert ending\\n else if ((alarmCodeInt & 2097152) == 2097152) {\\n var alarm = 'ALF-C';\\n }\\n // welfare Alert Ending ALA\\n else if ((alarmCodeInt & 4194304) == 4194304) {\\n var alarm = 'ALA';\\n }\\n // Beacon absent Alert 11/10/22. Need to be added in msg types\\n //else if ((alarmCodeInt & 16777216) == 16777216) {\\n // var alarm = 'BEA';\\n //}\\n general += 'alarm:' + alarm + ',';\\n break;\\n //Custom ID\\n case '03':\\n // in value is customID.... '06' for Watch Care\\n // if ((imei != '860470063029395') && (imei != '860470063035947')) {\\n //update customID to check if belongs to this type of device\\n //value = hexToAscii(value);\\n customID = value;\\n if (value != '3036') {\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n AddValue(codeValues, \\\"customID\\\", value);\\n // exit decoder\\n // const data = buildDataToReceiver(codeValues, configsToAck, configsToUpdate, configsToSend);\\n // console.log(data);\\n return // data\\n } else {\\n if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\n //return;\\n }\\n AddValue(codeValues, \\\"customID\\\", value);\\n general += 'customID:' + value + ',';\\n break;\\n }\\n //Historical Data Completed\\n case '10': // indica q se han terminado de enviar todos los datos historicos.\\n var histData = true;\\n break;\\n //GPS location\\n case '20':\\n location_type = 'GPS';\\n var latitudeHex = value.substring(0, 8);\\n var longitudeHex = value.substring(8, 16);\\n var speedHex = value.substring(16, 20);\\n var directionHex = value.substring(20, 24);\\n var altitudeHex = value.substring(24, 28);\\n var location_accuracyHex = value.substring(28, 32);\\n var mileageHex = value.substring(32, 40);\\n var satellitesHex = value.substring(40, 42);\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n speed = ((hexToDecimal(changeEndianness(speedHex))) / 3.6).toFixed(2); //date 14-02-2023 in m/s\\n var direction = hexToDecimal(changeEndianness(directionHex));\\n var altitude = hexToDecimal(changeEndianness(altitudeHex)); // in meters\\n //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\n // Range: 0.5 to 99.9 \\n location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\n //var mileage = hexToDecimal(changeEndianness(mileageHex)) this is in km/h we need m/s\\n var mileage = hexToDecimal(changeEndianness(mileageHex)); // in meters date 14-02-2023\\n var satellites = hexToDecimal(satellitesHex);\\n // location_time = timestamp;\\n //<>,<>,<>,<>,<>\\n gps_data = `${latitude},${longitude},${location_accuracy},${speed},${direction},${altitude},${satellites},${mileage}`;\\n general += 'gps location (lat):' + latitude + ', (long):' + longitude + ',';\\n break;\\n //WIFI Towers\\n case '22':\\n location_type = 'WIFI';\\n var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\n //location_time = timestamp;\\n var wifiTowers = value;\\n general += 'wifiTowers:';\\n var indexWifi = 0;\\n var bssid_array = [];\\n wifi_data = '';\\n for (let i = 0; i < numWifi; i++) {\\n wifi_data += hexToDecimalSigned(wifiTowers.substring(indexWifi, indexWifi + 2)) + ',' + wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\n indexWifi += 14;\\n }\\n wifi_data = wifi_data.slice(0, -1);\\n general += wifi_data;\\n break;\\n //BLE Location Added 10/10/22\\n case '23':\\n location_type = 'BLE';\\n var mac = value.substring(0, 12);\\n var latitudeHex = value.substring(12, 20);\\n var longitudeHex = value.substring(20, 28);\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n var address = hexToAscii(value.substring(28, value.length));\\n var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\n // add : format in MAC\\n mac = mac.match(/.{1,2}/g).join(':');\\n // location_time = timestamp;\\n ble_data = `${latitude},${longitude},${mac},${address}`;\\n general += 'BLE location (lat):' + latitude + ', (long):' + longitude + ',';\\n break;\\n //General Data , status_data\\n case '24':\\n //var general = 'true'\\n if (customID != '3036') {\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n AddValue(codeValues, \\\"customID\\\", customID);\\n return\\n }\\n if (alarmCode) {\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\n }\\n //else {\\n // messageForReceiver = (`CareWatch-CYC;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};`);\\n //}\\n // reset variables\\n //alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\n var timestampHex = value.substring(0, 8);\\n timestampHex = changeEndianness(timestampHex);\\n timestamp = hexToDecimal(timestampHex);\\n location_time = timestamp;\\n event_time = timestamp;\\n // HardCode to fix possible issue in protocol\\n //event_time = moment.utc().unix();\\n // end of hard code\\n var statusHex = changeEndianness(value.substring(8, 16));\\n var statusInt = hexToDecimal(statusHex);\\n var statusDevice = '';\\n if ((statusInt & 1) == 1) {\\n statusDevice += 'GPS,';\\n }\\n if ((statusInt & 2) == 2) {\\n statusDevice += 'WIFISource,';\\n }\\n if ((statusInt & 4) == 4) {\\n statusDevice += 'CellTower,';\\n }\\n if ((statusInt & 8) == 8) {\\n statusDevice += 'BLELocation,';\\n }\\n //params.BatteryStatus.BatteryStatus = '1';\\n if ((statusInt & 16) == 16) {\\n statusDevice += 'Charging,';\\n // var alarm = 'BATCN';\\n //configs.BatteryStatus.BatteryStatus = '1';\\n /* if (configs.BatteryStatus.BatteryStatus !== '1') {\\n hasConfigs = true;\\n var batteryStatus = '1';\\n var alarm = 'BATCN';\\n let configsToUpdate = [];\\n configsToUpdate.push({\\n 'code': configIds.BatteryStatus.BatteryStatus,\\n 'value': batteryStatus\\n });\\n }*/\\n }\\n if ((statusInt & 32) == 32) {\\n statusDevice += 'FUllyCharged,';\\n //var alarm = 'BATF';\\n // configs.BatteryStatus.BatteryStatus = '3';\\n /* if (configs.BatteryStatus.BatteryStatus !== '3') {\\n hasConfigs = true;\\n var batteryStatus = '3';\\n var alarm = 'BATF';\\n let configsToUpdate = [];\\n configsToUpdate.push({\\n 'code': configIds.BatteryStatus.BatteryStatus,\\n 'value': batteryStatus\\n });\\n }*/\\n }\\n /* if (!((statusInt & 32) == 32) & !((statusInt & 16) == 16)) {\\n statusDevice += 'Not Charging,';\\n var alarm = 'BATCF';\\n //configs.BatteryStatus.BatteryStatus = '2';\\n if (configs.BatteryStatus.BatteryStatus !== '2') {\\n var batteryStatus = '2';\\n var alarm = 'BATCF';\\n let configsToUpdate = [];\\n configsToUpdate.push({\\n 'code': configIds.BatteryStatus.BatteryStatus,\\n 'value': batteryStatus\\n });\\n }\\n }*/\\n if ((statusInt & 64) == 64) {\\n statusDevice += 'Reboot,';\\n }\\n if ((statusInt & 128) == 128) {\\n statusDevice += 'HistoricalData,';\\n }\\n if ((statusInt & 256) == 256) {\\n statusDevice += 'AGPSDataValid,';\\n }\\n if ((statusInt & 512) == 512) {\\n statusDevice += 'Motion,';\\n }\\n if ((statusInt & 1024) == 1024) {\\n statusDevice += 'SmartLocating,';\\n }\\n if ((statusInt & 2048) == 2048) { //isHome\\n statusDevice += 'BeaconLocation,';\\n }\\n if ((statusInt & 4096) == 4096) {\\n statusDevice += 'BLEConnected,';\\n }\\n if ((statusInt & 16384) == 16384) {\\n statusDevice += 'HomeWiFi,';\\n }\\n statusDevice = statusDevice.slice(0, -1);\\n status_data = statusDevice; //to oysta template\\n //statusHex = (statusHex);\\n statusHex = hexToBin(statusHex);\\n statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\n battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\n cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\n workMode = parseInt(statusHex.substring(13, 16), 2);\\n general += 'statusDevice:' + statusDevice + ',';\\n if (battery_percentage) {\\n general += 'battery:' + battery_percentage + ',';\\n }\\n if (cellNetworkSignal) {\\n general += 'cellNetworkSignal:' + cellNetworkSignal + ',';\\n }\\n if (workMode) {\\n general += 'workMode:' + workMode + ',';\\n }\\n //messageForReceiver = (`CareWatch-CYC;${imei};${i};${event_time};${battery_percentage}`);\\n break;\\n //Call Records\\n case '25':\\n //Needed?\\n break;\\n //BLE Location 2\\n case '26':\\n //I don't understand\\n //messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n //Smart Location\\n case '27':\\n location_type = 'SMART';\\n var latitudeHex = value.substring(0, 8);\\n var longitudeHex = value.substring(8, 16);\\n var location_accuracyHex = value.substring(16, 20);\\n var altitudeHex = value.substring(20, 24);\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n var altitude = hexToDecimal(changeEndianness(altitudeHex));\\n //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\n //04/08/2022 se quita el multiplicador por 5 pq ya viene el valor en metros\\n location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\n //location_time = timestamp;\\n smart_data = `${latitude},${longitude},${location_accuracy},${altitude}`;\\n general += 'smart location (lat):' + latitude + ', (long):' + longitude + ',';\\n break;\\n //Beacon Location Added 11/10/22\\n case '28':\\n location_type = 'BEACON';\\n // var alarm = 'EBZI';\\n var latitudeHex = '00';\\n var longitudeHex = '00';\\n var descr = 'empty';\\n var flag = hexToDecimal(value.substring(0, 1));\\n var beacId = hexToDecimal(value.substring(1, 2));\\n // msg includes descrip\\n if ((flag & 4) == 4) {\\n descr = hexToAscii(value.substring(18, value.length));\\n }\\n // msg includes lat/lon\\n if ((flag & 8) == 8) {\\n latitudeHex = value.substring(18, 26);\\n longitudeHex = value.substring(26, 34);\\n }\\n // msg includes lat/lon and description\\n if ((flag & 12) == 12) {\\n latitudeHex = value.substring(18, 26);\\n longitudeHex = value.substring(26, 34);\\n descr = hexToAscii(value.substring(34, value.length));\\n }\\n var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\n // add : format in MAC\\n mac = mac.match(/.{1,2}/g).join(':');\\n var rssiHex = value.substring(14, 16);\\n var rssi1Hex = value.substring(16, 18);\\n rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\n rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\n // var latitudeHex = value.substring(18, 26);\\n // var longitudeHex = value.substring(26, 34);\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n //location_time = timestamp;\\n beacon_data = `${latitude},${longitude},${mac},${descr}`;\\n general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (listIndex):' + beacId + ',';\\n break;\\n // Beacon V2\\n case '2C':\\n location_type = 'BEACON';\\n // var alarm = 'EBZI';\\n var latitudeHex = '00';\\n var longitudeHex = '00';\\n var descr = 'empty';\\n var flag = hexToDecimal(value.substring(0, 1));\\n var beacId = hexToDecimal(value.substring(1, 2));\\n // msg includes descrip\\n if ((flag & 4) == 4) {\\n let desc_leng = hexToDecimal(value.substring(20, 22));\\n descr = hexToAscii(value.substring(22, 22 + (2 * desc_leng)));\\n //descr = hexToAscii(value.substring(18, value.length));\\n }\\n // msg includes lat/lon\\n if ((flag & 8) == 8) {\\n latitudeHex = value.substring(18, 26);\\n longitudeHex = value.substring(26, 34);\\n }\\n // msg includes lat/lon and description\\n if ((flag & 12) == 12) {\\n latitudeHex = value.substring(20, 28);\\n longitudeHex = value.substring(28, 36);\\n let desc_leng = hexToDecimal(value.substring(36, 38));\\n descr = hexToAscii(value.substring(38, 38 + (2 * desc_leng)));\\n }\\n var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\n // add : format in MAC\\n mac = mac.match(/.{1,2}/g).join(':');\\n var rssiHex = value.substring(14, 16);\\n var rssi1Hex = value.substring(16, 18);\\n rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\n rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\n var battery_beacon = hexToDecimal(value.substring(18, 20));\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n //location_time = timestamp;\\n beacon_data = `${latitude},${longitude},${mac},${descr}`;\\n general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (battery):' + battery_beacon + ', (listIndex):' + beacId + ',';\\n break;\\n //Cell Towers Note\\n case '29':\\n location_type = 'LBS';\\n lbs_data = '';\\n var mccHex = changeEndianness(value.substring(0, 4));\\n var mncHex = value.substring(4, 6);\\n var mcc = hexToDecimal(mccHex);\\n lbs_data += mcc + ',';\\n var mnc = hexToDecimal(mncHex);\\n lbs_data += mnc + ',';\\n var indexLbs = 6;\\n var numTowers = (hexToDecimal(keyLengthHex) - 4) / 7;\\n for (let i = 0; i < numTowers; i++) {\\n var rxlHex = changeEndianness(value.substring(indexLbs, indexLbs + 2));\\n var rxl = hexToDecimal(rxlHex);\\n var lacHex = changeEndianness(value.substring(indexLbs + 2, indexLbs + 6));\\n var lac = hexToDecimal(lacHex);\\n var cellTowers = hexToDecimal(changeEndianness(value.substring(indexLbs + 6, indexLbs + 14)));\\n lbs_data += rxl + ',' + lac + ',' + cellTowers + ',';\\n indexLbs += 14;\\n }\\n lbs_data = lbs_data.slice(0, -1);\\n general += lbs_data;\\n break;\\n case '30':\\n //G-sensor.\\n //value = hexToAscii(value);\\n //if (value != '06') {\\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 = (`Watch-${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 //value = hexToAscii(value);\\n //if (value != '06') {\\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 = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n }\\n break;\\n //BLE Connected . For Flic button\\n case '62':\\n location_type = 'BLE';\\n //var alarm = 'EBZI'; \\n //var latitudeHex = '00';\\n //var longitudeHex = '00';\\n //var descr = 'empty';\\n var flag = hexToDecimal(value.substring(0, 2)); // 0= Disconnected, 1= Connected\\n var mac = value.substring(2, 14); // No hace falta darle la vuelta\\n // add : format in MAC\\n mac = mac.match(/.{1,2}/g).join(':');\\n var batLevel = hexToDecimal(value.substring(14, 16)); // 0-100\\n //location_time = timestamp;\\n ble_data = `${flag},${batLevel},${mac}`;\\n general += 'BLE location (State):' + flag + ', (bat):' + batLevel + ', (mac):' + mac + ',';\\n break;\\n }\\n }\\n if (alarmCode) {\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};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 = (`Watch;ACK-FIRM;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\n //AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\n configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\n //configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\n //messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n case '1A':\\n //no ACK need\\n var fwVersion = hexToAscii(value);\\n imei = serverParams.Imei;\\n AddValue(codeValues, \\\"imei\\\", imei);\\n AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\n messageForReceiver = (`Watch;ACK-FIRM;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\n //AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\n configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\n //configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\n break;\\n //IMEI\\n case '03':\\n var imei = hexToDecimal(value);\\n // harcode to avoid conflicts with Rio protocol\\n //if ((imei != '860470063029395') && (imei != '860470063035947')) {\\n // AddValue(codeValues, \\\"error\\\", \\\"device imei is not in this protocol\\\");\\n // AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n //AddValue(codeValues, \\\"IMEI\\\", imei);\\n // return\\n //}\\n if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\n //return;\\n }\\n messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n //ICCID\\n case '04':\\n var iccid = hexToDecimal(value);\\n messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n //BLE-MAC\\n case '05':\\n var bleMac = hexToDecimal(value);\\n messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n //Run Time\\n case '07':\\n var runTime = hexToDecimal(value);\\n messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n case '10': // Ringer Volume\\n var volume = hexToDecimal(value);\\n imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-VOL;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"Volume\\\", volume);\\n AddValue(configsToUpdate, configIds.ReadSystemSettings.Volume, volume);\\n configsToAck.push(configIds.ReadSystemSettings.Volume);\\n break;\\n case '0A': //Performance mode\\n //var workMode = hexToDecimal(value);\\n //messageBody = messageBody + keyLengthHex + key + value;\\n //AddValue(codeValues, \\\"WorkMode\\\", workMode);\\n //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\n //configsToAck.push(configIds.ReadPerformance`Settings.Mode);\\n //var workMode = hexToAscii(value.substring(0, value.length));\\n //var workMode = hexToDecimal(value);\\n //var workMode = hexToAscii(value.substring(0, value.length));\\n var workMode = 1234; // + value + \\\"end\\\";\\n //var workModeVal = 9;\\n //workMode = 'test10';\\n imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-MODE;${imei};`);\\n AddValue(codeValues, \\\"Mode\\\", workMode);\\n AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\n configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n //AddValue(codeValues, \\\"performanceMode\\\", performanceMode);\\n //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, performanceMode);\\n // configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\n break;\\n case '1B':\\n //Decimal o ascii?\\n var gsmModule = hexToDecimal(value);\\n messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n case '1F':\\n //System Language\\n var systemLanguage = hexToAscii(value.substring(0, value.length));\\n imei = serverParams.Imei;\\n //messageBody = messageBody + keyLengthHex + key + value;\\n messageForReceiver = (`Watch;ACK-LANG;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"SystemLanguage\\\", systemLanguage);\\n AddValue(configsToUpdate, configIds.ReadSystemSettings.SystemLanguage, systemLanguage);\\n configsToAck.push(configIds.ReadSystemSettings.SystemLanguage);\\n break;\\n case '33': // phone option\\n // [Value]:83 0B 00 00 {\\\"phoneOption\\\":{\\\"flag_value\\\":2947,\\\"s3\\\":1,\\\"s4\\\":0,\\\"s5\\\":1,\\\"s6\\\":0,\\\"callIncoming\\\":0,\\\"rings\\\":3,\\\"s7\\\":0,\\\"toneID\\\":0,\\\"s1\\\":1,\\\"s2\\\":1}}\\n var statusPhone = hexToBin(value.substring(0, 2)); // To find autoanswer setup\\n if (statusPhone.substring(0, 1) == '1') { // 1 Enable\\n var auto = 'true';\\n } else var auto = 'false';\\n statusPhone = hexToBin(value.substring(2, 4)); // To find allow list setup\\n if (statusPhone.substring(7, 8) == '1') { // 1 Enable\\n allow = 'true';\\n } else var allow = 'false';\\n //statusPhone = hexToBin(value.substring(0, 2)) + hexToBin(value.substring(2, 4));\\n //AddValue(configsToUpdate, configIds.ReadSystemSettings.Statusphone, statusPhone);\\n AddValue(configsToUpdate, configIds.ReadSystemSettings.AllowList, allow);\\n AddValue(configsToUpdate, configIds.ReadSystemSettings.AutoAnswer, auto);\\n //configsToAck.push(configIds.ReadSystemSettings.Statusphone);\\n configsToAck.push(configIds.ReadSystemSettings.AllowList);\\n configsToAck.push(configIds.ReadSystemSettings.AutoAnswer);\\n break;\\n case '34': //ContactList with name\\n var contactNumber = value.substring(1, 2);\\n var telLength = hexToDecimal(value.substring(2, 4));\\n var tel = '';\\n switch (contactNumber) {\\n // Emergency Number\\n case '0':\\n tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\n AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\n AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\n configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\n break;\\n // Speed Dial Number\\n //case '1':\\n // tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\n // AddValue(codeValues, \\\"SpeedDialNumber\\\", tel);\\n // AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.SpeedDialNumber, tel);\\n // configsToAck.push(configIds.ReadSpeedDialSettings.SpeedDialNumber);\\n // break;\\n // Gateway Number\\n case '9': //00447781482635,Esendex UK 0034627177148,Esendex Spain 00447507288240,Esendex UK Acceptance\\n tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\n if (tel.includes('447781482635') || tel.includes('00447781482635')) {\\n tel = 'Esendex UK'\\n } else if (tel.includes('34627177148') || tel.includes('0034627177148')) {\\n tel = 'Esendex Spain'\\n } else if (tel.includes('447507288240') || tel.includes('00447507288240')) {\\n tel = 'Esendex UK Acceptance'\\n } else {\\n tel = 'Default'\\n }\\n AddValue(codeValues, \\\"SMSGateway\\\", tel);\\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\n configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\n break;\\n default:\\n tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\n if (tel.length < 6) {\\n contacts += '';\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\n break;\\n }\\n //contacts += 'A' + (contactNumber - 1) + ': ' + tel + ', ';\\n contacts += tel + ', ';\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\n break;\\n }\\n break;\\n case '40': // APN\\n //no ACK need\\n AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'));\\n configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\n var apn = hexToAscii(value.substring(0, value.length));\\n imei = serverParams.Imei;\\n break;\\n case '41': // APN Username\\n //no ACK need\\n //apn = apn + ',' + hexToAscii(value.substring(0, value.length));\\n break;\\n case '42': // APN Password\\n //no ACK need\\n //apn = apn + ',' + hexToAscii(value.substring(0, value.length));\\n messageForReceiver = (`Watch;ACK-GDATA;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"apn\\\", apn);\\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.APN, apn);\\n configsToAck.push(configIds.ReadCommunicationSettings.APN);\\n break;\\n case '43': //Server Details\\n //52.232.85.255,5678 production 52.174.17.77,5678 acceptance\\n var serverDetails = hexToAscii(value.substring(6, value.length)) + ':' + hexToDecimal(value.substring(4, 6) + value.substring(2, 4));\\n if (serverDetails.includes('52.232.85.255:5678')) {\\n serverDetails = 'Production'\\n } else if (serverDetails.includes('52.174.17.77:5678')) {\\n serverDetails = 'Acceptance'\\n } else if (serverDetails.includes('52.174.17.77:5778')) {\\n serverDetails = 'Protocol-Import'\\n } else if (serverDetails.includes('52.174.17.77:5878')) {\\n serverDetails = 'Protocol-Dev'\\n } else {\\n serverDetails = 'Default'\\n }\\n AddValue(codeValues, \\\"server\\\", serverDetails);\\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.Server, serverDetails);\\n configsToAck.push(configIds.ReadCommunicationSettings.Server);\\n break;\\n case '44': //time interval - work mode intervals\\n imei = serverParams.Imei;\\n messageForReceiver = (`Watch;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 '46': //HeartRate\\n // '10 0E 00 80'\\n var HeartRateStatus = hexToBin(value.substring(6, 8));\\n var enalbleDisable = '';\\n if (HeartRateStatus.substring(0, 1) == '1') {\\n var hrate = 'Enable, '\\n enalbleDisable = '1'\\n } else {\\n var hrate = 'Disable, '\\n };\\n var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6)));\\n hrate += detectingInterval;\\n AddValue(codeValues, \\\"hrate\\\", hrate);\\n var imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings, enalbleDisable);\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\n configsToAck.push(configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings);\\n configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\n break;\\n case '47': // Custom Id\\n imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-CUSTID;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"customeid\\\", value);\\n AddValue(configsToUpdate, configIds.ReadState.CustomId, hexToAscii(value)); //now it comes \\\"3036\\\"\\n configsToAck.push(configIds.ReadState.CustomId);\\n break;\\n case '53': // Non motion alert\\n //2B020080\\n var status = hexToBin(value.substring(6, 8));\\n var alertSetting = '';\\n var enableDisable = '';\\n if (status.substring(0, 1) == '1') {\\n alertSetting = 'Enable, '\\n enableDisable = '1';\\n } else {\\n alertSetting = 'Disable, '\\n };\\n //if (status.substring(5, 6) == '1') {\\n // alertSetting += 'Dial, '\\n //} else {\\n // alertSetting += 'No Dial, '\\n //};\\n var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\n alertSetting += time;\\n imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-NOMOTION;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"nomotion\\\", alertSetting);\\n //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings, enableDisable);\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\n //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\n configsToAck.push(configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings);\\n configsToAck.push(configIds.ReadNonMovementSettings.Time);\\n break;\\n case '56': //Fall down sensibility\\n // '00001100'\\n var fallStatus = hexToBin(value.substring(0, 2));\\n var enalbleDisable = '';\\n //if (fallStatus.substring(4, 5) == '1') {\\n if (fallStatus.substring(0, 1) == '1') {\\n var sensibility = 'Enable, '\\n enalbleDisable = '1'\\n } else {\\n var sensibility = 'Disable, '\\n };\\n if (fallStatus.substring(5, 6) == '1') {\\n sensibility += 'Dial, '\\n } else {\\n sensibility += 'No Dial, '\\n };\\n var imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-FALLALERT;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n var sesibityOptionValue = hexToDecimal(value.substring(1, 2));\\n sensibility += sesibityOptionValue;\\n AddValue(codeValues, \\\"sensibility\\\", sensibility);\\n //AddValue(configsToUpdate, configIds.ReadAlertSettings.FallSettings, sensibility);\\n AddValue(configsToUpdate, configIds.ReadFallSettings.EnableDisableFallSettings, enalbleDisable);\\n AddValue(configsToUpdate, configIds.ReadFallSettings.Sensitivity, sesibityOptionValue);\\n //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\n configsToAck.push(configIds.ReadFallSettings.EnableDisableFallSettings);\\n configsToAck.push(configIds.ReadFallSettings.Sensitivity);\\n break;\\n case '73': //BeaconList\\n var beaconNumber = hexToDecimal(value.substring(1, 2));\\n var beaconStatus = hexToBin(value.substring(0, 1));\\n beaconStatus = hexToAscii(value.substring(30, value.length));\\n //beaconStatus = changeEndianness(value.substring(30, value.length));\\n //homeBeacon += 'B' + (beaconNumber + 1) + ': ' + beaconStatus + ', ';\\n homeBeacon += beaconStatus + ', ';\\n AddValue(codeValues, \\\"homeBeacon\\\", homeBeacon);\\n messageForReceiver = (`Watch;ACK-GDATA;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\n configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\n break;\\n case '4A': //Wifi Network List\\n var wifiSSIDLenght = hexToDecimal(value.substring(2, 4));\\n var wifiPasswordLenght = hexToDecimal(value.substring(4, 6));\\n var wifiIndex = hexToDecimal(value.substring(1, 2));\\n //var wifiStatus = hexToDecimal(value.substring(0, 1));\\n var wifiStatus = value.substring(0, 1);\\n /*var enalbleDisable = wifiSSID = wifiPassword = homeWifi = '';\\n /var homeWifi = '';\\n if (wifiIndex == '0') { // Only first Wifi of the list\\n if (wifiStatus == '8') {\\n homeWifi += ' Enable, '\\n enalbleDisable = '1';\\n } else {\\n homeWifi += ' Disable, '\\n //enalbleDisable = '0';\\n };*/\\n if ((wifiStatus == '8') || (wifiStatus == 'C')) { // 8 == ON OR C== ON and Connected\\n var wifiSSID = hexToAscii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\n var wifiPassword = hexToAscii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\n var imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-WIFI;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n //homeWiFi += 'W' + (wifiIndex + 1) + ': ' + wifiSSID + ', ' + wifiPassword + ';';\\n homeWiFi += wifiSSID + ', ' + wifiPassword + ';';\\n AddValue(codeValues, \\\"wifi\\\", homeWiFi);\\n AddValue(configsToUpdate, configIds.ReadWiFiList.WiFiList, homeWiFi);\\n configsToAck.push(configIds.ReadWiFiList.WiFiList);\\n }\\n //AddValue(configsToUpdate, configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings, enalbleDisable);\\n //AddValue(configsToUpdate, configIds.ReadWiFiSettings.SSID, wifiSSID);\\n //AddValue(configsToUpdate, configIds.ReadWiFiSettings.Password, wifiPassword);\\n //configsToAck.push(configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings);\\n //configsToAck.push(configIds.ReadWiFiSettings.SSID);\\n //configsToAck.push(configIds.ReadWiFiSettings.Password);\\n break;\\n case '21': // Speed Dial Settings\\n // [Value]:53 84 {\\\"call1Button\\\":{\\\"mode\\\":0,\\\"feedBack\\\":3,\\\"task\\\":2,\\\"time\\\":20,\\\"status\\\":1}}\\n var status = hexToBin(value.substring(2, 4)); //always pass 2 HEXs to this function\\n var alertSetting = '';\\n var enalbleDisable = '';\\n if (status.substring(0, 1) == '1') {\\n alertSetting = 'Enable, '\\n enalbleDisable = '1'\\n } else {\\n alertSetting = 'Disable, '\\n //enableDisable = '0';\\n };\\n //var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\n //alertSetting += time;\\n imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-SPEED;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"speed\\\", alertSetting);\\n //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\n AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\n //AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\n //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\n configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\n //configsToAck.push(configIds.ReadNonMovementSettings.Time);\\n break;\\n }\\n }\\n }\\n if (command == '03') {\\n while (index < total_length + 16) {\\n var keyLengthHex = message.substring(index, index = index + 2);\\n var keyLength = 2 * hexToDecimal(keyLengthHex);\\n var key = message.substring(index, index = index + 2);\\n var value = message.substring(index, index = index + keyLength - 2);\\n debug('key = ' + key);\\n debug('value = ' + value);\\n switch (key) {\\n case '01': // Device ID\\n var imei = hexToAscii(value);\\n // create long connection if it is needed\\n if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\n //return;\\n }\\n break;\\n //CustomID is not provided so far with command type 03.. commented in the mean time\\n /* case '03':\\n //update customID to check if belongs to this type of device\\n customID = value;\\n if (value != '04') {\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n AddValue(codeValues, \\\"customID\\\", value);\\n return\\n } else {\\n if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\n }\\n AddValue(codeValues, \\\"customID\\\", value);\\n general += 'customID:' + value + ',';\\n break;\\n }\\n break; */\\n case '10': // Heartbeat\\n var heartbeat = hexToAscii(value);\\n event_time = moment.utc().unix();\\n if (index < total_length + 16) {\\n var keyLengthHex = message.substring(index, index = index + 2);\\n keyLength = 2 * hexToDecimal(keyLengthHex);\\n key = message.substring(index, index = index + 2);\\n if (key == '24') {\\n // debug('key: ' + key) //comment those out\\n value = message.substring(index, index = index + keyLength - 2);\\n // debug(value)\\n var timestampHex = value.substring(0, 8);\\n // debug('timestampt hex: ' + timestampHex)\\n timestampHex = changeEndianness(timestampHex);\\n timestamp = hexToDecimal(timestampHex);\\n event_time = timestamp;\\n // debug(event_time)\\n var statusHex = changeEndianness(value.substring(8, 16));\\n // debug(statusHex)\\n var statusInt = hexToDecimal(statusHex);\\n var statusDevice = '';\\n if ((statusInt & 1) == 1) {\\n statusDevice += 'GPS,';\\n }\\n if ((statusInt & 2) == 2) {\\n statusDevice += 'WIFISource,';\\n }\\n if ((statusInt & 4) == 4) {\\n statusDevice += 'CellTower,';\\n }\\n if ((statusInt & 8) == 8) {\\n statusDevice += 'BLELocation,';\\n }\\n if ((statusInt & 16) == 16) {\\n statusDevice += 'Charging,';\\n }\\n if ((statusInt & 32) == 32) {\\n statusDevice += 'FUllyCharged,';\\n }\\n if ((statusInt & 64) == 64) {\\n statusDevice += 'Reboot,';\\n }\\n if ((statusInt & 128) == 128) {\\n statusDevice += 'HistoricalData,';\\n }\\n if ((statusInt & 256) == 256) {\\n statusDevice += 'AGPSDataValid,';\\n }\\n if ((statusInt & 512) == 512) {\\n statusDevice += 'Motion,';\\n }\\n if ((statusInt & 1024) == 1024) {\\n statusDevice += 'SmartLocating,';\\n }\\n if ((statusInt & 2048) == 2048) {\\n statusDevice += 'BeaconLocation,';\\n }\\n if ((statusInt & 4096) == 4096) {\\n statusDevice += 'BLEConnected,';\\n }\\n statusDevice = statusDevice.slice(0, -1);\\n // debug('statusHex:' + statusHex)\\n statusHex = (statusHex);\\n statusHex = hexToBin(statusHex);\\n statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\n // debug(statusHex)\\n battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\n // debug(battery_percentage)\\n // debug(battery_percentage)\\n // debug(statusHex.substring(8, 13))\\n cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\n // debug(cellNetworkSignal)\\n workMode = parseInt(statusHex.substring(13, 16), 2);\\n // debug(workMode)\\n general += 'statusDevice:' + statusDevice + ';';\\n if (battery_percentage) {\\n general += 'battery:' + battery_percentage + ';';\\n }\\n if (cellNetworkSignal) {\\n general += 'cellNetworkSignal:' + cellNetworkSignal + ';';\\n }\\n if (workMode) {\\n general += 'workMode:' + workMode + ';';\\n }\\n }\\n }\\n // revisar\\n var gen_location = '0';\\n //CustomID is not provided so far with command type 03.. commented in the mean time\\n /*if (customID != '04') {\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n AddValue(codeValues, \\\"customID\\\", value);\\n return\\n }*/\\n //messageForReceiver = (`Eview-HTB;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};SIGNAL=${cellNetworkSignal};WM=${workMode};SL=${systemLanguage};GENERAL=${general}`);\\n messageForReceiver = (`Watch-HTB;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n //messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n case '12': // Device requesting timestamp\\n timestamp = moment.utc().unix();\\n timestampHex = decimalToHex(timestamp);\\n timestampHex = changeEndianness(timestampHex);\\n keyLengthHex = ('00' + decimalToHex(1 + (timestampHex.length) / 2)).slice(-2);\\n // respond to device with the timestamp of the server\\n messageBody = messageBody + keyLengthHex + key + timestampHex;\\n messageForReceiver = `Eview;${imei};${sequenceID};Get timestamp`;\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n break;\\n case '21': //Cell Towers\\n var mccHex = value.substring(0, 2);\\n var mncHex = value.substring(2, 3);\\n var mcc = hexToDecimal(mccHex);\\n var mnc = hexToDecimal(mncHex);\\n var numTowers = (keyLength - 4) / 5;\\n var cellTowers = hexToAscii(value);\\n messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n case '22': // WIFI locations \\n location_type = 'WIFI';\\n var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\n //location_time = timestamp;\\n var wifiTowers = value;\\n general += 'wifiTowers:';\\n var indexWifi = 0;\\n var bssid_array = [];\\n gen_location = '';\\n for (let i = 0; i < numWifi; i++) {\\n gen_location += wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\n indexWifi += 14;\\n }\\n gen_location = gen_location.slice(0, -1);\\n general += gen_location;\\n //CustomID is not provided so far with command type 03\\n /*if (customID != '04') {\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n AddValue(codeValues, \\\"customID\\\", value);\\n return\\n }*/\\n if (alarmCode) {\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};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 = (`Watch-ACK;${imei};${message}`); // ${sequenceID}; add ${sequenceID}; 19-07\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n var value = message.substring(index, index = index + keyLength - 2);\\n if (typeof configIds !== 'undefined' && configIds && configIds.ConfigureDevice && configIds.ConfigureDevice.LastConfigured) { // when is defined\\n AddValue(configsToUpdate, configIds.ConfigureDevice.LastConfigured, moment().format('YYYY/MM/DD, HH:mm:ss'));\\n configsToAck.push(configIds.ConfigureDevice.LastConfigured);\\n }\\n //}\\n }\\n if (command == 'FE') {\\n while (index < total_length + 16) {\\n var keyLength = message.substring(index, index = index + 2);\\n keyLength = 2 * hexToDecimal(keyLength);\\n var key = message.substring(index, index = index + 2);\\n var value = message.substring(index, index = index + keyLength - 2);\\n }\\n }\\n // prepare the ACK msg and change config if it is needed\\n lengthAck = messageBody.length / 2;\\n lengthAck = ('0000' + decimalToHex(lengthAck)).slice(-4);\\n lengthAck = lengthAck.toString().substring(2, 4) + lengthAck.toString().substring(0, 2);\\n ////////////checksum CRC 16\\n var checksumAck = byteStringToByteArray(messageBody);\\n checksumAck = crc16byte(checksumAck);\\n checksumAck = decimalToHex(checksumAck);\\n checksumAck = ('0000' + checksumAck).slice(-4);\\n checksumAck = checksumAck.toString().substring(2, 4) + checksumAck.toString().substring(0, 2);\\n prefix = prefix + lengthAck + checksumAck + sequenceID;\\n // To send ACK to the device previous to internal msg with parts\\n if (needsAck == true) {\\n if (messageBody.length <= 2) {\\n ack = 'AB00030008C7' + sequenceID + '7F0100'; // change AB10030008C7 to AB00030008C7\\n } else {\\n ack = prefix + messageBody;\\n }\\n AddValue(codeValues, 'imei', imei);\\n AddValue(codeValues, 'ack', ack);\\n }\\n } else { // checksum was invalid - print out useful debug info and bet quess at imei \\n AddValue(codeValues, \\\"error\\\", \\\"checksum failed for message\\\");\\n AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n i = rawFromBytes.search('3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]');\\n if (i >= 0) {\\n imei = hexToAscii(rawFromBytes.substring(i, i + 30));\\n AddValue(codeValues, \\\"imei\\\", imei);\\n }\\n }\\n }\\n // Auxiliary functions\\n function buildDataToReceiver(codeValues, configsToAck = [], configsToUpdate = [], configsToSend = []) {\\n const dataToReceiver = {\\n values: codeValues\\n };\\n if (configsToAck.length > 0) {\\n dataToReceiver.configsToAck = configsToAck;\\n }\\n if (configsToUpdate.length > 0) {\\n dataToReceiver.configsToUpdate = configsToUpdate;\\n }\\n if (configsToSend.length > 0) {\\n dataToReceiver.configsToSend = configsToSend;\\n }\\n return dataToReceiver;\\n }\\n\\n function AddValue(codeValueArray, p1, p2) { // push code value pair into array\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n codeValueArray.push(cvpair);\\n }\\n // convert functions\\n function asciiToHex(str) { // ascii to hex \\n return [...str].map(char => char.charCodeAt(0).toString(16).padStart(2, '0')).join('');\\n }\\n\\n function byteStringToByteArray(str) { // convierte una cadena hexadecimal en un array de bytes (number[])\\n const bytes = [];\\n for (let i = 0; i < str.length; i += 2) {\\n const byte = parseInt(str.substring(i, i + 2), 16);\\n if (!isNaN(byte) && byte >= 0 && byte <= 255) {\\n bytes.push(byte);\\n }\\n }\\n return bytes;\\n }\\n\\n function decimalToHex(x) {\\n return Number(x).toString(16).toUpperCase();\\n }\\n\\n function hexToBin(hex) { // convierte un valor hexadecimal a su representación binaria, y asegura que tenga al menos 8 bits \\n const bin = parseInt(hex, 16).toString(2);\\n return bin.padStart(hex.length * 4, '0');\\n }\\n\\n function hexToAscii(hex) {\\n if (hex.length % 2 !== 0) {\\n throw new Error(\\\"Hex string length must be even\\\");\\n }\\n let ascii = '';\\n for (let i = 0; i < hex.length; i += 2) {\\n const byte = hex.substr(i, 2);\\n const charCode = parseInt(byte, 16);\\n if (charCode !== 0) { // remove null character (\\\\u0000)\\n ascii += String.fromCharCode(charCode);\\n }\\n }\\n return ascii;\\n //return hex.match(/.{2}/g).map(byte => String.fromCharCode(parseInt(byte, 16))).join('');\\n }\\n\\n function hexToDecimalSigned(hex) { // hex to decimal\\n if (hex.length % 2 !== 0) {\\n hex = '0' + hex;\\n }\\n const num = parseInt(hex, 16);\\n const bits = hex.length * 4;\\n const maxVal = 2 ** bits;\\n return num >= maxVal / 2 ? num - maxVal : num;\\n }\\n\\n function hexToDecimal(hex) {\\n return parseInt(hex, 16);\\n }\\n // CheckSum and debug functions\\n function changeEndianness(hexString) { // changeEndianness\\n if (hexString.length === 0) { //if string is empty or not defined\\n return \\\"\\\";\\n }\\n if (hexString.length % 2 !== 0) {\\n throw new Error(\\\"Hex string length must be even\\\");\\n }\\n return hexString.match(/.{2}/g) // divide in bytes (2 chars)\\n .reverse() // reverse the order\\n .join('');\\n }\\n\\n function calculateCheckSum(payloadData) { // calcula el CRC16 sobre una cadena hexadecimal y devuelve el valor con el endianness invertido\\n const bytes = byteStringToByteArray(payloadData);\\n const crc = crc16byte(bytes);\\n const hex = crc.toString(16).padStart(4, '0').toUpperCase();\\n return changeEndianness(hex);\\n }\\n\\n function crc16byte(byteArray) { // calcula el CRC-16 sobre un array de bytes usando una tabla precalculada (crcTable)\\n let crc = 0x0000;\\n for (const byte of byteArray) {\\n if (byte < 0 || byte > 255 || !Number.isInteger(byte)) {\\n throw new RangeError(\\\"Invalid byte value in input array\\\");\\n }\\n const index = (byte ^ (crc >> 8)) & 0xFF;\\n crc = crcTable[index] ^ (crc << 8);\\n }\\n return crc & 0xFFFF;\\n }\\n\\n function debug(...args) { // write debug info to console log, if localTesting\\n if (localTesting) {\\n console.debug('[DEBUG]', ...args);\\n }\\n }\\n /*\\n function sendMessageToLocalhostNoWait(str) { // sends message to system, closing connection after\\n var server;\\n if (localTesting) {\\n console.log('local testing - sending to protocol-dev server the message ... '); // port 5878\\n console.log(str);\\n server = '52.174.17.77';\\n } else {\\n server = '127.0.0.1';\\n }\\n var c = net.createConnection(5878, server);\\n c.on('error', function(error) {\\n c = net.createConnection(5878, server);\\n });\\n c.write(`${str}`);\\n c.end();\\n }*/\\n function sendMessageToLocalhostNoWait(message) {\\n const server = localTesting ? '52.174.17.77' : '127.0.0.1';\\n //const port = localTesting ? '5878' : ''; //Protocol-dev\\n const port = '5678'; //acceptance-dev\\n if (localTesting) {\\n console.debug('[DEBUG] Sending message to test server:', message);\\n }\\n const client = net.createConnection(port, server, () => {\\n client.write(message);\\n client.end();\\n });\\n client.on('error', (err) => {\\n console.error(`[ERROR] Failed to send message to ${server}:${port}:`, err.message);\\n });\\n client.on('end', () => {\\n if (localTesting) {\\n console.debug('[DEBUG] Connection closed');\\n }\\n });\\n }\\n}\\n// params is not defined locally -> export as module\\nif (typeof(params) === 'undefined') {\\n module.exports = {\\n execute_ops\\n }\\n} else { // on server use local defined vars\\n let return_values = execute_ops(moment, msg, net, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\n // define global returns\\n msg = return_values;\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1749579157},{"Type":1,"NewValue":"{\"Id\":437,\"Name\":\"Access TEC Care Watch\",\"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 // Watch protocol - please see variables and typical values in order below\\n // Watch-CYC;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;SIGNAL=<>;WM=<>;GENERAL=<>\\n // Watch-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\n //\\n // Author: Juanmi Navarro\\n // Created: 01/01/0000\\n // Last modified: 20/05/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', 'Watch');\\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 = (`Watch-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 //<>,<>,<> \\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 //<>,<>,<> \\n if (mac2) {\\n AddValue(codeValues, 'beacon_mac', mac2);\\n var simpleQuery2 = [{\\n 'code': 'Mac',\\n 'value': mac2,\\n }];\\n var simpleQueryLabel2 = {\\n 'table': 'beacons',\\n 'select': 'Name',\\n 'query': simpleQuery2\\n };\\n var labels2 = [];\\n labels2.push(JSON.stringify(simpleQueryLabel2));\\n AddValue(codeValues, 'oysta_labels', JSON.stringify(labels2));\\n }\\n if (params.beacon_major) {\\n AddValue(codeValues, 'beacon_major', params.beacon_major);\\n } else {\\n AddValue(codeValues, 'beacon_major', 0);\\n }\\n if (params.beacon_minor) {\\n AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\n } else {\\n AddValue(codeValues, 'beacon_minor', 0);\\n }\\n //AddValue(codeValues,'oysta_labels', label);\\n //AddValue(codeValues,'oysta_value', mac);\\n if (location_time) {\\n AddValue(codeValues, 'location_time', location_time);\\n }\\n }\\n /* meter mas tarde... \\n if (params.smart_data !== 'undefined') {\\n var gen_location = params.smart_data.split(',')\\n var latitude = gen_location[0]\\n var longitude = gen_location[1]\\n var location_accuracy = gen_location[2]\\n var altitude = gen_location[3]\\n AddValue(codeValues,'latitude', latitude);\\n AddValue(codeValues,'longitude', longitude);\\n AddValue(codeValues,'altitude', altitude);\\n AddValue(codeValues,'location_accuracy', location_accuracy);\\n }\\n */\\n /*else if ((params.event_time) && (params.event_time == '')) {\\n var event_time = moment.utc().unix();\\n AddValue(codeValues,'event_time', event_time);\\n } revisar mas adelante*/\\n // to parse SMS info from the device\\n switch (messageTypeLocalCode) {\\n case 'COMM-SMS': // SMS message sent in\\n if (params.data.startsWith('Device location request')) {\\n configsToAck.push(configIds.Controls.RealTimeLocate);\\n } else if (params.data.startsWith('Set IP ok')) {\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\n } else if (params.data.startsWith('IMEI:')) {\\n configsToAck.push(configIds.Controls.GetFirmwareVersion);\\n } else if (params.data.startsWith('Set IP ok')) {\\n configsToAck.push(configIds.Controls.ClearBufferedMessages);\\n } else if (params.data.startsWith('flush ok')) {\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\n } else if (params.data.startsWith('Set Watch-')) {\\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 = (`Watch-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 = (`Watch;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 = (`Watch;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 = (`Watch-RTL;${params.imei};${location_time};${location_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n break;\\n }\\n if (!params.event_time && !event_time) { // if params.event_time undefined - set it to now. \\n var event_time = moment.utc().unix();\\n AddValue(codeValues, 'event_time', event_time);\\n }\\n // if (!params.location_time && !location_time) { // if params.location_time undefined - set it to now. \\n // var location_time = moment.utc().unix();\\n // AddValue(codeValues, 'location_time', location_time);\\n //}\\n }\\n // send data msg to kibana\\n const data = buildDataToReceiver(codeValues, configsToAck, configsToUpdate, configsToSend);\\n console.log(data);\\n return data\\n // end of main operation\\n // define functions used in operation\\n // decode global msg\\n function decoder(str) { // decode rawdata\\n // CARE Decoder\\n AddValue(codeValues, 'Message : ', str);\\n var message = str;\\n // need to check if checksum is correct for possible msg corruption 10/03/23\\n var checksum = message.substring(8, 12);\\n var messageBody = message.substring(16, message.length);\\n debug('message =' + message);\\n debug('checksum =' + checksum);\\n debug('calculateCheckSum =' + calculateCheckSum(messageBody));\\n if (calculateCheckSum(messageBody) == checksum) { // payload is valid\\n debug(\\\"message has valid checksum\\\");\\n var messageBody = command; // update value for the ACK\\n debug('command =' + command);\\n if (command == '01') {\\n while (index < total_length + 16) {\\n // gen_location = '0'; //cambiado 30/09\\n var keyLengthHex = message.substring(index, index = index + 2);\\n var keyLength = 2 * hexToDecimal(keyLengthHex);\\n var key = message.substring(index, index = index + 2);\\n var value = message.substring(index, index = index + keyLength - 2);\\n debug('key = ' + key);\\n debug('value = ' + value);\\n switch (key) {\\n //Device ID\\n case '01':\\n var imei = hexToAscii(value);\\n // create long connection if it is needed\\n if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\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\\n if ((alarmCodeExtInt & 1) == 1) {\\n var alarm = 'ALF-C';\\n }\\n // Welfare Check-out\\n else if ((alarmCodeExtInt & 2) == 2) {\\n var alarm = 'ALA-C';\\n }\\n // Standard Alerts\\n //Battery low\\n else if ((alarmCodeInt & 1) == 1) {\\n var alarm = 'BATL';\\n }\\n //Overspeed\\n else if ((alarmCodeInt & 2) == 2) {\\n var alarm = 'ALSP';\\n }\\n //Fall\\n else if ((alarmCodeInt & 4) == 4) {\\n var alarm = 'ALF';\\n }\\n //Tilt\\n else if ((alarmCodeInt & 8) == 8) {\\n var alarm = 'Tilt';\\n } else if ((alarmCodeInt & 16) == 16) {\\n if ((alarmCodeInt & 16777216) == 16777216) {\\n var alarm = 'Geo1-IN';\\n } else {\\n var alarm = 'Geo1-OUT';\\n }\\n } else if ((alarmCodeInt & 32) == 32) {\\n if ((alarmCodeInt & 33554432) == 33554432) {\\n var alarm = 'Geo2-IN';\\n } else {\\n var alarm = 'Geo2-OUT';\\n }\\n } else if ((alarmCodeInt & 64) == 64) {\\n if ((alarmCodeInt & 67108864) == 67108864) {\\n var alarm = 'Geo3-IN';\\n } else {\\n var alarm = 'Geo3-OUT';\\n }\\n } else if ((alarmCodeInt & 128) == 128) {\\n if ((alarmCodeInt & 134217728) == 134217728) {\\n var alarm = 'Geo4-IN';\\n } else {\\n var alarm = 'Geo4-OUT';\\n }\\n }\\n //Power Off\\n else if ((alarmCodeInt & 256) == 256) {\\n var alarm = 'PWRF';\\n }\\n //Power On\\n else if ((alarmCodeInt & 512) == 512) {\\n var alarm = 'PWRN';\\n }\\n //Motion\\n else if ((alarmCodeInt & 1024) == 1024) {\\n var alarm = 'ALMOV';\\n }\\n //No Motion\\n else if ((alarmCodeInt & 2048) == 2048) {\\n var alarm = 'ALNM';\\n }\\n //SOS\\n else if ((alarmCodeInt & 4096) == 4096) {\\n var alarm = 'ALSOS';\\n } else if ((alarmCodeInt & 8192) == 8192) {\\n var alarm = 'Side1';\\n } else if ((alarmCodeInt & 16384) == 16384) {\\n var alarm = 'Side2';\\n }\\n //Battery charging\\n else if ((alarmCodeInt & 32768) == 32768) {\\n var alarm = 'BATCN';\\n }\\n //Battery no charging\\n else if ((alarmCodeInt & 65536) == 65536) {\\n var alarm = 'BATCF';\\n }\\n //SOS Ending\\n // Temporary Commented until we know exactly how it works. 22/09/2022\\n else if ((alarmCodeInt & 131072) == 131072) {\\n var alarm = 'SOSEnding';\\n info = 'Alarm Finished';\\n }\\n //Amber Alert EC03 only\\n else if ((alarmCodeInt & 262144) == 262144) {\\n var alarm = 'ALAO';\\n }\\n // welfare Alert check-in ALA-O\\n else if ((alarmCodeInt & 524288) == 524288) {\\n var alarm = 'ALA-O';\\n }\\n // Amber alert Ending ALA-C\\n else if ((alarmCodeInt & 1048576) == 1048576) {\\n var alarm = 'ALA-C';\\n }\\n // Amber alert Ending ALA-C\\n //else if ((alarmCodeInt & 1048576) == 1048576) {\\n // var alarm = 'ALA-C';\\n //}\\n // Fall-Down Alert ending\\n else if ((alarmCodeInt & 2097152) == 2097152) {\\n var alarm = 'ALF-C';\\n }\\n // welfare Alert Ending ALA\\n else if ((alarmCodeInt & 4194304) == 4194304) {\\n var alarm = 'ALA';\\n }\\n // Beacon absent Alert 11/10/22. Need to be added in msg types\\n //else if ((alarmCodeInt & 16777216) == 16777216) {\\n // var alarm = 'BEA';\\n //}\\n general += 'alarm:' + alarm + ',';\\n break;\\n //Custom ID\\n case '03':\\n // in value is customID.... '06' for Watch Care\\n // if ((imei != '860470063029395') && (imei != '860470063035947')) {\\n //update customID to check if belongs to this type of device\\n //value = hexToAscii(value);\\n customID = value;\\n if (value != '3036') {\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n AddValue(codeValues, \\\"customID\\\", value);\\n // exit decoder\\n // const data = buildDataToReceiver(codeValues, configsToAck, configsToUpdate, configsToSend);\\n // console.log(data);\\n return // data\\n } else {\\n if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\n //return;\\n }\\n AddValue(codeValues, \\\"customID\\\", value);\\n general += 'customID:' + value + ',';\\n break;\\n }\\n //Historical Data Completed\\n case '10': // indica q se han terminado de enviar todos los datos historicos.\\n var histData = true;\\n break;\\n //GPS location\\n case '20':\\n location_type = 'GPS';\\n var latitudeHex = value.substring(0, 8);\\n var longitudeHex = value.substring(8, 16);\\n var speedHex = value.substring(16, 20);\\n var directionHex = value.substring(20, 24);\\n var altitudeHex = value.substring(24, 28);\\n var location_accuracyHex = value.substring(28, 32);\\n var mileageHex = value.substring(32, 40);\\n var satellitesHex = value.substring(40, 42);\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n speed = ((hexToDecimal(changeEndianness(speedHex))) / 3.6).toFixed(2); //date 14-02-2023 in m/s\\n var direction = hexToDecimal(changeEndianness(directionHex));\\n var altitude = hexToDecimal(changeEndianness(altitudeHex)); // in meters\\n //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\n // Range: 0.5 to 99.9 \\n location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\n //var mileage = hexToDecimal(changeEndianness(mileageHex)) this is in km/h we need m/s\\n var mileage = hexToDecimal(changeEndianness(mileageHex)); // in meters date 14-02-2023\\n var satellites = hexToDecimal(satellitesHex);\\n // location_time = timestamp;\\n //<>,<>,<>,<>,<>\\n gps_data = `${latitude},${longitude},${location_accuracy},${speed},${direction},${altitude},${satellites},${mileage}`;\\n general += 'gps location (lat):' + latitude + ', (long):' + longitude + ',';\\n break;\\n //WIFI Towers\\n case '22':\\n location_type = 'WIFI';\\n var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\n //location_time = timestamp;\\n var wifiTowers = value;\\n general += 'wifiTowers:';\\n var indexWifi = 0;\\n var bssid_array = [];\\n wifi_data = '';\\n for (let i = 0; i < numWifi; i++) {\\n wifi_data += hexToDecimalSigned(wifiTowers.substring(indexWifi, indexWifi + 2)) + ',' + wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\n indexWifi += 14;\\n }\\n wifi_data = wifi_data.slice(0, -1);\\n general += wifi_data;\\n break;\\n //BLE Location Added 10/10/22\\n case '23':\\n location_type = 'BLE';\\n var mac = value.substring(0, 12);\\n var latitudeHex = value.substring(12, 20);\\n var longitudeHex = value.substring(20, 28);\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n var address = hexToAscii(value.substring(28, value.length));\\n var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\n // add : format in MAC\\n mac = mac.match(/.{1,2}/g).join(':');\\n // location_time = timestamp;\\n ble_data = `${latitude},${longitude},${mac},${address}`;\\n general += 'BLE location (lat):' + latitude + ', (long):' + longitude + ',';\\n break;\\n //General Data , status_data\\n case '24':\\n //var general = 'true'\\n if (customID != '3036') {\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n AddValue(codeValues, \\\"customID\\\", customID);\\n return\\n }\\n if (alarmCode) {\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\n }\\n //else {\\n // messageForReceiver = (`CareWatch-CYC;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};`);\\n //}\\n // reset variables\\n //alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\n var timestampHex = value.substring(0, 8);\\n timestampHex = changeEndianness(timestampHex);\\n timestamp = hexToDecimal(timestampHex);\\n location_time = timestamp;\\n event_time = timestamp;\\n // HardCode to fix possible issue in protocol\\n //event_time = moment.utc().unix();\\n // end of hard code\\n var statusHex = changeEndianness(value.substring(8, 16));\\n var statusInt = hexToDecimal(statusHex);\\n var statusDevice = '';\\n if ((statusInt & 1) == 1) {\\n statusDevice += 'GPS,';\\n }\\n if ((statusInt & 2) == 2) {\\n statusDevice += 'WIFISource,';\\n }\\n if ((statusInt & 4) == 4) {\\n statusDevice += 'CellTower,';\\n }\\n if ((statusInt & 8) == 8) {\\n statusDevice += 'BLELocation,';\\n }\\n //params.BatteryStatus.BatteryStatus = '1';\\n if ((statusInt & 16) == 16) {\\n statusDevice += 'Charging,';\\n // var alarm = 'BATCN';\\n //configs.BatteryStatus.BatteryStatus = '1';\\n /* if (configs.BatteryStatus.BatteryStatus !== '1') {\\n hasConfigs = true;\\n var batteryStatus = '1';\\n var alarm = 'BATCN';\\n let configsToUpdate = [];\\n configsToUpdate.push({\\n 'code': configIds.BatteryStatus.BatteryStatus,\\n 'value': batteryStatus\\n });\\n }*/\\n }\\n if ((statusInt & 32) == 32) {\\n statusDevice += 'FUllyCharged,';\\n //var alarm = 'BATF';\\n // configs.BatteryStatus.BatteryStatus = '3';\\n /* if (configs.BatteryStatus.BatteryStatus !== '3') {\\n hasConfigs = true;\\n var batteryStatus = '3';\\n var alarm = 'BATF';\\n let configsToUpdate = [];\\n configsToUpdate.push({\\n 'code': configIds.BatteryStatus.BatteryStatus,\\n 'value': batteryStatus\\n });\\n }*/\\n }\\n /* if (!((statusInt & 32) == 32) & !((statusInt & 16) == 16)) {\\n statusDevice += 'Not Charging,';\\n var alarm = 'BATCF';\\n //configs.BatteryStatus.BatteryStatus = '2';\\n if (configs.BatteryStatus.BatteryStatus !== '2') {\\n var batteryStatus = '2';\\n var alarm = 'BATCF';\\n let configsToUpdate = [];\\n configsToUpdate.push({\\n 'code': configIds.BatteryStatus.BatteryStatus,\\n 'value': batteryStatus\\n });\\n }\\n }*/\\n if ((statusInt & 64) == 64) {\\n statusDevice += 'Reboot,';\\n }\\n if ((statusInt & 128) == 128) {\\n statusDevice += 'HistoricalData,';\\n }\\n if ((statusInt & 256) == 256) {\\n statusDevice += 'AGPSDataValid,';\\n }\\n if ((statusInt & 512) == 512) {\\n statusDevice += 'Motion,';\\n }\\n if ((statusInt & 1024) == 1024) {\\n statusDevice += 'SmartLocating,';\\n }\\n if ((statusInt & 2048) == 2048) { //isHome\\n statusDevice += 'BeaconLocation,';\\n }\\n if ((statusInt & 4096) == 4096) {\\n statusDevice += 'BLEConnected,';\\n }\\n if ((statusInt & 16384) == 16384) {\\n statusDevice += 'HomeWiFi,';\\n }\\n statusDevice = statusDevice.slice(0, -1);\\n status_data = statusDevice; //to oysta template\\n //statusHex = (statusHex);\\n statusHex = hexToBin(statusHex);\\n statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\n battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\n cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\n workMode = parseInt(statusHex.substring(13, 16), 2);\\n general += 'statusDevice:' + statusDevice + ',';\\n if (battery_percentage) {\\n general += 'battery:' + battery_percentage + ',';\\n }\\n if (cellNetworkSignal) {\\n general += 'cellNetworkSignal:' + cellNetworkSignal + ',';\\n }\\n if (workMode) {\\n general += 'workMode:' + workMode + ',';\\n }\\n //messageForReceiver = (`CareWatch-CYC;${imei};${i};${event_time};${battery_percentage}`);\\n break;\\n //Call Records\\n case '25':\\n //Needed?\\n break;\\n //BLE Location 2\\n case '26':\\n //I don't understand\\n //messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n //Smart Location\\n case '27':\\n location_type = 'SMART';\\n var latitudeHex = value.substring(0, 8);\\n var longitudeHex = value.substring(8, 16);\\n var location_accuracyHex = value.substring(16, 20);\\n var altitudeHex = value.substring(20, 24);\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n var altitude = hexToDecimal(changeEndianness(altitudeHex));\\n //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\n //04/08/2022 se quita el multiplicador por 5 pq ya viene el valor en metros\\n location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\n //location_time = timestamp;\\n smart_data = `${latitude},${longitude},${location_accuracy},${altitude}`;\\n general += 'smart location (lat):' + latitude + ', (long):' + longitude + ',';\\n break;\\n //Beacon Location Added 11/10/22\\n case '28':\\n location_type = 'BEACON';\\n // var alarm = 'EBZI';\\n var latitudeHex = '00';\\n var longitudeHex = '00';\\n var descr = 'empty';\\n var flag = hexToDecimal(value.substring(0, 1));\\n var beacId = hexToDecimal(value.substring(1, 2));\\n // msg includes descrip\\n if ((flag & 4) == 4) {\\n descr = hexToAscii(value.substring(18, value.length));\\n }\\n // msg includes lat/lon\\n if ((flag & 8) == 8) {\\n latitudeHex = value.substring(18, 26);\\n longitudeHex = value.substring(26, 34);\\n }\\n // msg includes lat/lon and description\\n if ((flag & 12) == 12) {\\n latitudeHex = value.substring(18, 26);\\n longitudeHex = value.substring(26, 34);\\n descr = hexToAscii(value.substring(34, value.length));\\n }\\n var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\n // add : format in MAC\\n mac = mac.match(/.{1,2}/g).join(':');\\n var rssiHex = value.substring(14, 16);\\n var rssi1Hex = value.substring(16, 18);\\n rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\n rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\n // var latitudeHex = value.substring(18, 26);\\n // var longitudeHex = value.substring(26, 34);\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n //location_time = timestamp;\\n beacon_data = `${latitude},${longitude},${mac},${descr}`;\\n general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (listIndex):' + beacId + ',';\\n break;\\n // Beacon V2\\n case '2C':\\n location_type = 'BEACON';\\n // var alarm = 'EBZI';\\n var latitudeHex = '00';\\n var longitudeHex = '00';\\n var descr = 'empty';\\n var flag = hexToDecimal(value.substring(0, 1));\\n var beacId = hexToDecimal(value.substring(1, 2));\\n // msg includes descrip\\n if ((flag & 4) == 4) {\\n let desc_leng = hexToDecimal(value.substring(20, 22));\\n descr = hexToAscii(value.substring(22, 22 + (2 * desc_leng)));\\n //descr = hexToAscii(value.substring(18, value.length));\\n }\\n // msg includes lat/lon\\n if ((flag & 8) == 8) {\\n latitudeHex = value.substring(18, 26);\\n longitudeHex = value.substring(26, 34);\\n }\\n // msg includes lat/lon and description\\n if ((flag & 12) == 12) {\\n latitudeHex = value.substring(20, 28);\\n longitudeHex = value.substring(28, 36);\\n let desc_leng = hexToDecimal(value.substring(36, 38));\\n descr = hexToAscii(value.substring(38, 38 + (2 * desc_leng)));\\n }\\n var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\n // add : format in MAC\\n mac = mac.match(/.{1,2}/g).join(':');\\n var rssiHex = value.substring(14, 16);\\n var rssi1Hex = value.substring(16, 18);\\n rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\n rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\n var battery_beacon = hexToDecimal(value.substring(18, 20));\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n //location_time = timestamp;\\n beacon_data = `${latitude},${longitude},${mac},${descr}`;\\n general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (battery):' + battery_beacon + ', (listIndex):' + beacId + ',';\\n break;\\n //Cell Towers Note\\n case '29':\\n location_type = 'LBS';\\n lbs_data = '';\\n var mccHex = changeEndianness(value.substring(0, 4));\\n var mncHex = value.substring(4, 6);\\n var mcc = hexToDecimal(mccHex);\\n lbs_data += mcc + ',';\\n var mnc = hexToDecimal(mncHex);\\n lbs_data += mnc + ',';\\n var indexLbs = 6;\\n var numTowers = (hexToDecimal(keyLengthHex) - 4) / 7;\\n for (let i = 0; i < numTowers; i++) {\\n var rxlHex = changeEndianness(value.substring(indexLbs, indexLbs + 2));\\n var rxl = hexToDecimal(rxlHex);\\n var lacHex = changeEndianness(value.substring(indexLbs + 2, indexLbs + 6));\\n var lac = hexToDecimal(lacHex);\\n var cellTowers = hexToDecimal(changeEndianness(value.substring(indexLbs + 6, indexLbs + 14)));\\n lbs_data += rxl + ',' + lac + ',' + cellTowers + ',';\\n indexLbs += 14;\\n }\\n lbs_data = lbs_data.slice(0, -1);\\n general += lbs_data;\\n break;\\n case '30':\\n //G-sensor.\\n //value = hexToAscii(value);\\n //if (value != '06') {\\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 = (`Watch-${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 //value = hexToAscii(value);\\n //if (value != '06') {\\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 = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n }\\n break;\\n //BLE Connected . For Flic button\\n case '62':\\n location_type = 'BLE';\\n //var alarm = 'EBZI'; \\n //var latitudeHex = '00';\\n //var longitudeHex = '00';\\n //var descr = 'empty';\\n var flag = hexToDecimal(value.substring(0, 2)); // 0= Disconnected, 1= Connected\\n var mac = value.substring(2, 14); // No hace falta darle la vuelta\\n // add : format in MAC\\n mac = mac.match(/.{1,2}/g).join(':');\\n var batLevel = hexToDecimal(value.substring(14, 16)); // 0-100\\n //location_time = timestamp;\\n ble_data = `${flag},${batLevel},${mac}`;\\n general += 'BLE location (State):' + flag + ', (bat):' + batLevel + ', (mac):' + mac + ',';\\n break;\\n }\\n }\\n if (alarmCode) {\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};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 = (`Watch;ACK-FIRM;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\n //AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\n configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\n //configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\n //messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n case '1A':\\n //no ACK need\\n var fwVersion = hexToAscii(value);\\n imei = serverParams.Imei;\\n AddValue(codeValues, \\\"imei\\\", imei);\\n AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\n messageForReceiver = (`Watch;ACK-FIRM;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\n //AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\n configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\n //configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\n break;\\n //IMEI\\n case '03':\\n var imei = hexToDecimal(value);\\n // harcode to avoid conflicts with Rio protocol\\n //if ((imei != '860470063029395') && (imei != '860470063035947')) {\\n // AddValue(codeValues, \\\"error\\\", \\\"device imei is not in this protocol\\\");\\n // AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n //AddValue(codeValues, \\\"IMEI\\\", imei);\\n // return\\n //}\\n if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\n //return;\\n }\\n messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n //ICCID\\n case '04':\\n var iccid = hexToDecimal(value);\\n messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n //BLE-MAC\\n case '05':\\n var bleMac = hexToDecimal(value);\\n messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n //Run Time\\n case '07':\\n var runTime = hexToDecimal(value);\\n messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n case '10': // Ringer Volume\\n var volume = hexToDecimal(value);\\n imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-VOL;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"Volume\\\", volume);\\n AddValue(configsToUpdate, configIds.ReadSystemSettings.Volume, volume);\\n configsToAck.push(configIds.ReadSystemSettings.Volume);\\n break;\\n case '0A': //Performance mode\\n //var workMode = hexToDecimal(value);\\n //messageBody = messageBody + keyLengthHex + key + value;\\n //AddValue(codeValues, \\\"WorkMode\\\", workMode);\\n //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\n //configsToAck.push(configIds.ReadPerformance`Settings.Mode);\\n //var workMode = hexToAscii(value.substring(0, value.length));\\n //var workMode = hexToDecimal(value);\\n //var workMode = hexToAscii(value.substring(0, value.length));\\n var workMode = 1234; // + value + \\\"end\\\";\\n //var workModeVal = 9;\\n //workMode = 'test10';\\n imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-MODE;${imei};`);\\n AddValue(codeValues, \\\"Mode\\\", workMode);\\n AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\n configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n //AddValue(codeValues, \\\"performanceMode\\\", performanceMode);\\n //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, performanceMode);\\n // configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\n break;\\n case '1B':\\n //Decimal o ascii?\\n var gsmModule = hexToDecimal(value);\\n messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n case '1F':\\n //System Language\\n var systemLanguage = hexToAscii(value.substring(0, value.length));\\n imei = serverParams.Imei;\\n //messageBody = messageBody + keyLengthHex + key + value;\\n messageForReceiver = (`Watch;ACK-LANG;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"SystemLanguage\\\", systemLanguage);\\n AddValue(configsToUpdate, configIds.ReadSystemSettings.SystemLanguage, systemLanguage);\\n configsToAck.push(configIds.ReadSystemSettings.SystemLanguage);\\n break;\\n case '33': // phone option\\n // [Value]:83 0B 00 00 {\\\"phoneOption\\\":{\\\"flag_value\\\":2947,\\\"s3\\\":1,\\\"s4\\\":0,\\\"s5\\\":1,\\\"s6\\\":0,\\\"callIncoming\\\":0,\\\"rings\\\":3,\\\"s7\\\":0,\\\"toneID\\\":0,\\\"s1\\\":1,\\\"s2\\\":1}}\\n var statusPhone = hexToBin(value.substring(0, 2)); // To find autoanswer setup\\n if (statusPhone.substring(0, 1) == '1') { // 1 Enable\\n var auto = 'true';\\n } else var auto = 'false';\\n statusPhone = hexToBin(value.substring(2, 4)); // To find allow list setup\\n if (statusPhone.substring(7, 8) == '1') { // 1 Enable\\n allow = 'true';\\n } else var allow = 'false';\\n //statusPhone = hexToBin(value.substring(0, 2)) + hexToBin(value.substring(2, 4));\\n //AddValue(configsToUpdate, configIds.ReadSystemSettings.Statusphone, statusPhone);\\n AddValue(configsToUpdate, configIds.ReadSystemSettings.AllowList, allow);\\n AddValue(configsToUpdate, configIds.ReadSystemSettings.AutoAnswer, auto);\\n //configsToAck.push(configIds.ReadSystemSettings.Statusphone);\\n configsToAck.push(configIds.ReadSystemSettings.AllowList);\\n configsToAck.push(configIds.ReadSystemSettings.AutoAnswer);\\n break;\\n case '34': //ContactList with name\\n var contactNumber = value.substring(1, 2);\\n var telLength = hexToDecimal(value.substring(2, 4));\\n var tel = '';\\n switch (contactNumber) {\\n // Emergency Number\\n case '0':\\n tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\n AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\n AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\n configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\n break;\\n // Speed Dial Number\\n //case '1':\\n // tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\n // AddValue(codeValues, \\\"SpeedDialNumber\\\", tel);\\n // AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.SpeedDialNumber, tel);\\n // configsToAck.push(configIds.ReadSpeedDialSettings.SpeedDialNumber);\\n // break;\\n // Gateway Number\\n case '9': //00447781482635,Esendex UK 0034627177148,Esendex Spain 00447507288240,Esendex UK Acceptance\\n tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\n if (tel.includes('447781482635') || tel.includes('00447781482635')) {\\n tel = 'Esendex UK'\\n } else if (tel.includes('34627177148') || tel.includes('0034627177148')) {\\n tel = 'Esendex Spain'\\n } else if (tel.includes('447507288240') || tel.includes('00447507288240')) {\\n tel = 'Esendex UK Acceptance'\\n } else {\\n tel = 'Default'\\n }\\n AddValue(codeValues, \\\"SMSGateway\\\", tel);\\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\n configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\n break;\\n default:\\n tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\n if (tel.length < 6) {\\n contacts += '';\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\n break;\\n }\\n //contacts += 'A' + (contactNumber - 1) + ': ' + tel + ', ';\\n contacts += tel + ', ';\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\n break;\\n }\\n break;\\n case '40': // APN\\n //no ACK need\\n AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'));\\n configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\n var apn = hexToAscii(value.substring(0, value.length));\\n imei = serverParams.Imei;\\n break;\\n case '41': // APN Username\\n //no ACK need\\n //apn = apn + ',' + hexToAscii(value.substring(0, value.length));\\n break;\\n case '42': // APN Password\\n //no ACK need\\n //apn = apn + ',' + hexToAscii(value.substring(0, value.length));\\n messageForReceiver = (`Watch;ACK-GDATA;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"apn\\\", apn);\\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.APN, apn);\\n configsToAck.push(configIds.ReadCommunicationSettings.APN);\\n break;\\n case '43': //Server Details\\n //52.232.85.255,5678 production 52.174.17.77,5678 acceptance\\n var serverDetails = hexToAscii(value.substring(6, value.length)) + ':' + hexToDecimal(value.substring(4, 6) + value.substring(2, 4));\\n if (serverDetails.includes('52.232.85.255:5678')) {\\n serverDetails = 'Production'\\n } else if (serverDetails.includes('52.174.17.77:5678')) {\\n serverDetails = 'Acceptance'\\n } else if (serverDetails.includes('52.174.17.77:5778')) {\\n serverDetails = 'Protocol-Import'\\n } else if (serverDetails.includes('52.174.17.77:5878')) {\\n serverDetails = 'Protocol-Dev'\\n } else {\\n serverDetails = 'Default'\\n }\\n AddValue(codeValues, \\\"server\\\", serverDetails);\\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.Server, serverDetails);\\n configsToAck.push(configIds.ReadCommunicationSettings.Server);\\n break;\\n case '44': //time interval - work mode intervals\\n imei = serverParams.Imei;\\n messageForReceiver = (`Watch;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 '46': //HeartRate\\n // '10 0E 00 80'\\n var HeartRateStatus = hexToBin(value.substring(6, 8));\\n var enalbleDisable = '';\\n if (HeartRateStatus.substring(0, 1) == '1') {\\n var hrate = 'Enable, '\\n enalbleDisable = '1'\\n } else {\\n var hrate = 'Disable, '\\n };\\n var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\n hrate += detectingInterval;\\n AddValue(codeValues, \\\"hrate\\\", hrate);\\n var imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings, enalbleDisable);\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\n configsToAck.push(configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings);\\n configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\n break;\\n case '47': // Custom Id\\n imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-CUSTID;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"customeid\\\", value);\\n AddValue(configsToUpdate, configIds.ReadState.CustomId, hexToAscii(value)); //now it comes \\\"3036\\\"\\n configsToAck.push(configIds.ReadState.CustomId);\\n break;\\n case '53': // Non motion alert\\n //2B020080\\n var status = hexToBin(value.substring(6, 8));\\n var alertSetting = '';\\n var enableDisable = '';\\n if (status.substring(0, 1) == '1') {\\n alertSetting = 'Enable, '\\n enableDisable = '1';\\n } else {\\n alertSetting = 'Disable, '\\n };\\n //if (status.substring(5, 6) == '1') {\\n // alertSetting += 'Dial, '\\n //} else {\\n // alertSetting += 'No Dial, '\\n //};\\n var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\n alertSetting += time;\\n imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-NOMOTION;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"nomotion\\\", alertSetting);\\n //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings, enableDisable);\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\n //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\n configsToAck.push(configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings);\\n configsToAck.push(configIds.ReadNonMovementSettings.Time);\\n break;\\n case '56': //Fall down sensibility\\n // '00001100'\\n var fallStatus = hexToBin(value.substring(0, 2));\\n var enalbleDisable = '';\\n //if (fallStatus.substring(4, 5) == '1') {\\n if (fallStatus.substring(0, 1) == '1') {\\n var sensibility = 'Enable, '\\n enalbleDisable = '1'\\n } else {\\n var sensibility = 'Disable, '\\n };\\n if (fallStatus.substring(5, 6) == '1') {\\n sensibility += 'Dial, '\\n } else {\\n sensibility += 'No Dial, '\\n };\\n var imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-FALLALERT;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n var sesibityOptionValue = hexToDecimal(value.substring(1, 2));\\n sensibility += sesibityOptionValue;\\n AddValue(codeValues, \\\"sensibility\\\", sensibility);\\n //AddValue(configsToUpdate, configIds.ReadAlertSettings.FallSettings, sensibility);\\n AddValue(configsToUpdate, configIds.ReadFallSettings.EnableDisableFallSettings, enalbleDisable);\\n AddValue(configsToUpdate, configIds.ReadFallSettings.Sensitivity, sesibityOptionValue);\\n //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\n configsToAck.push(configIds.ReadFallSettings.EnableDisableFallSettings);\\n configsToAck.push(configIds.ReadFallSettings.Sensitivity);\\n break;\\n case '73': //BeaconList\\n var beaconNumber = hexToDecimal(value.substring(1, 2));\\n var beaconStatus = hexToBin(value.substring(0, 1));\\n beaconStatus = hexToAscii(value.substring(30, value.length));\\n //beaconStatus = changeEndianness(value.substring(30, value.length));\\n //homeBeacon += 'B' + (beaconNumber + 1) + ': ' + beaconStatus + ', ';\\n homeBeacon += beaconStatus + ', ';\\n AddValue(codeValues, \\\"homeBeacon\\\", homeBeacon);\\n messageForReceiver = (`Watch;ACK-GDATA;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\n configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\n break;\\n case '4A': //Wifi Network List\\n var wifiSSIDLenght = hexToDecimal(value.substring(2, 4));\\n var wifiPasswordLenght = hexToDecimal(value.substring(4, 6));\\n var wifiIndex = hexToDecimal(value.substring(1, 2));\\n //var wifiStatus = hexToDecimal(value.substring(0, 1));\\n var wifiStatus = value.substring(0, 1);\\n /*var enalbleDisable = wifiSSID = wifiPassword = homeWifi = '';\\n /var homeWifi = '';\\n if (wifiIndex == '0') { // Only first Wifi of the list\\n if (wifiStatus == '8') {\\n homeWifi += ' Enable, '\\n enalbleDisable = '1';\\n } else {\\n homeWifi += ' Disable, '\\n //enalbleDisable = '0';\\n };*/\\n if ((wifiStatus == '8') || (wifiStatus == 'C')) { // 8 == ON OR C== ON and Connected\\n var wifiSSID = hexToAscii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\n var wifiPassword = hexToAscii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\n var imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-WIFI;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n //homeWiFi += 'W' + (wifiIndex + 1) + ': ' + wifiSSID + ', ' + wifiPassword + ';';\\n homeWiFi += wifiSSID + ', ' + wifiPassword + ';';\\n AddValue(codeValues, \\\"wifi\\\", homeWiFi);\\n AddValue(configsToUpdate, configIds.ReadWiFiList.WiFiList, homeWiFi);\\n configsToAck.push(configIds.ReadWiFiList.WiFiList);\\n }\\n //AddValue(configsToUpdate, configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings, enalbleDisable);\\n //AddValue(configsToUpdate, configIds.ReadWiFiSettings.SSID, wifiSSID);\\n //AddValue(configsToUpdate, configIds.ReadWiFiSettings.Password, wifiPassword);\\n //configsToAck.push(configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings);\\n //configsToAck.push(configIds.ReadWiFiSettings.SSID);\\n //configsToAck.push(configIds.ReadWiFiSettings.Password);\\n break;\\n case '21': // Speed Dial Settings\\n // [Value]:53 84 {\\\"call1Button\\\":{\\\"mode\\\":0,\\\"feedBack\\\":3,\\\"task\\\":2,\\\"time\\\":20,\\\"status\\\":1}}\\n var status = hexToBin(value.substring(2, 4)); //always pass 2 HEXs to this function\\n var alertSetting = '';\\n var enalbleDisable = '';\\n if (status.substring(0, 1) == '1') {\\n alertSetting = 'Enable, '\\n enalbleDisable = '1'\\n } else {\\n alertSetting = 'Disable, '\\n //enableDisable = '0';\\n };\\n //var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\n //alertSetting += time;\\n imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-SPEED;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"speed\\\", alertSetting);\\n //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\n AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\n //AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\n //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\n configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\n //configsToAck.push(configIds.ReadNonMovementSettings.Time);\\n break;\\n }\\n }\\n }\\n if (command == '03') {\\n while (index < total_length + 16) {\\n var keyLengthHex = message.substring(index, index = index + 2);\\n var keyLength = 2 * hexToDecimal(keyLengthHex);\\n var key = message.substring(index, index = index + 2);\\n var value = message.substring(index, index = index + keyLength - 2);\\n debug('key = ' + key);\\n debug('value = ' + value);\\n switch (key) {\\n case '01': // Device ID\\n var imei = hexToAscii(value);\\n // create long connection if it is needed\\n if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\n //return;\\n }\\n break;\\n //CustomID is not provided so far with command type 03.. commented in the mean time\\n /* case '03':\\n //update customID to check if belongs to this type of device\\n customID = value;\\n if (value != '04') {\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n AddValue(codeValues, \\\"customID\\\", value);\\n return\\n } else {\\n if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\n }\\n AddValue(codeValues, \\\"customID\\\", value);\\n general += 'customID:' + value + ',';\\n break;\\n }\\n break; */\\n case '10': // Heartbeat\\n var heartbeat = hexToAscii(value);\\n event_time = moment.utc().unix();\\n if (index < total_length + 16) {\\n var keyLengthHex = message.substring(index, index = index + 2);\\n keyLength = 2 * hexToDecimal(keyLengthHex);\\n key = message.substring(index, index = index + 2);\\n if (key == '24') {\\n // debug('key: ' + key) //comment those out\\n value = message.substring(index, index = index + keyLength - 2);\\n // debug(value)\\n var timestampHex = value.substring(0, 8);\\n // debug('timestampt hex: ' + timestampHex)\\n timestampHex = changeEndianness(timestampHex);\\n timestamp = hexToDecimal(timestampHex);\\n event_time = timestamp;\\n // debug(event_time)\\n var statusHex = changeEndianness(value.substring(8, 16));\\n // debug(statusHex)\\n var statusInt = hexToDecimal(statusHex);\\n var statusDevice = '';\\n if ((statusInt & 1) == 1) {\\n statusDevice += 'GPS,';\\n }\\n if ((statusInt & 2) == 2) {\\n statusDevice += 'WIFISource,';\\n }\\n if ((statusInt & 4) == 4) {\\n statusDevice += 'CellTower,';\\n }\\n if ((statusInt & 8) == 8) {\\n statusDevice += 'BLELocation,';\\n }\\n if ((statusInt & 16) == 16) {\\n statusDevice += 'Charging,';\\n }\\n if ((statusInt & 32) == 32) {\\n statusDevice += 'FUllyCharged,';\\n }\\n if ((statusInt & 64) == 64) {\\n statusDevice += 'Reboot,';\\n }\\n if ((statusInt & 128) == 128) {\\n statusDevice += 'HistoricalData,';\\n }\\n if ((statusInt & 256) == 256) {\\n statusDevice += 'AGPSDataValid,';\\n }\\n if ((statusInt & 512) == 512) {\\n statusDevice += 'Motion,';\\n }\\n if ((statusInt & 1024) == 1024) {\\n statusDevice += 'SmartLocating,';\\n }\\n if ((statusInt & 2048) == 2048) {\\n statusDevice += 'BeaconLocation,';\\n }\\n if ((statusInt & 4096) == 4096) {\\n statusDevice += 'BLEConnected,';\\n }\\n statusDevice = statusDevice.slice(0, -1);\\n // debug('statusHex:' + statusHex)\\n statusHex = (statusHex);\\n statusHex = hexToBin(statusHex);\\n statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\n // debug(statusHex)\\n battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\n // debug(battery_percentage)\\n // debug(battery_percentage)\\n // debug(statusHex.substring(8, 13))\\n cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\n // debug(cellNetworkSignal)\\n workMode = parseInt(statusHex.substring(13, 16), 2);\\n // debug(workMode)\\n general += 'statusDevice:' + statusDevice + ';';\\n if (battery_percentage) {\\n general += 'battery:' + battery_percentage + ';';\\n }\\n if (cellNetworkSignal) {\\n general += 'cellNetworkSignal:' + cellNetworkSignal + ';';\\n }\\n if (workMode) {\\n general += 'workMode:' + workMode + ';';\\n }\\n }\\n }\\n // revisar\\n var gen_location = '0';\\n //CustomID is not provided so far with command type 03.. commented in the mean time\\n /*if (customID != '04') {\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n AddValue(codeValues, \\\"customID\\\", value);\\n return\\n }*/\\n //messageForReceiver = (`Eview-HTB;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};SIGNAL=${cellNetworkSignal};WM=${workMode};SL=${systemLanguage};GENERAL=${general}`);\\n messageForReceiver = (`Watch-HTB;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n //messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n case '12': // Device requesting timestamp\\n timestamp = moment.utc().unix();\\n timestampHex = decimalToHex(timestamp);\\n timestampHex = changeEndianness(timestampHex);\\n keyLengthHex = ('00' + decimalToHex(1 + (timestampHex.length) / 2)).slice(-2);\\n // respond to device with the timestamp of the server\\n messageBody = messageBody + keyLengthHex + key + timestampHex;\\n messageForReceiver = `Eview;${imei};${sequenceID};Get timestamp`;\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n break;\\n case '21': //Cell Towers\\n var mccHex = value.substring(0, 2);\\n var mncHex = value.substring(2, 3);\\n var mcc = hexToDecimal(mccHex);\\n var mnc = hexToDecimal(mncHex);\\n var numTowers = (keyLength - 4) / 5;\\n var cellTowers = hexToAscii(value);\\n messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n case '22': // WIFI locations \\n location_type = 'WIFI';\\n var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\n //location_time = timestamp;\\n var wifiTowers = value;\\n general += 'wifiTowers:';\\n var indexWifi = 0;\\n var bssid_array = [];\\n gen_location = '';\\n for (let i = 0; i < numWifi; i++) {\\n gen_location += wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\n indexWifi += 14;\\n }\\n gen_location = gen_location.slice(0, -1);\\n general += gen_location;\\n //CustomID is not provided so far with command type 03\\n /*if (customID != '04') {\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n AddValue(codeValues, \\\"customID\\\", value);\\n return\\n }*/\\n if (alarmCode) {\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};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 = (`Watch-ACK;${imei};${message}`); // ${sequenceID}; add ${sequenceID}; 19-07\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n var value = message.substring(index, index = index + keyLength - 2);\\n if (typeof configIds !== 'undefined' && configIds && configIds.ConfigureDevice && configIds.ConfigureDevice.LastConfigured) { // when is defined\\n AddValue(configsToUpdate, configIds.ConfigureDevice.LastConfigured, moment().format('YYYY/MM/DD, HH:mm:ss'));\\n configsToAck.push(configIds.ConfigureDevice.LastConfigured);\\n }\\n //}\\n }\\n if (command == 'FE') {\\n while (index < total_length + 16) {\\n var keyLength = message.substring(index, index = index + 2);\\n keyLength = 2 * hexToDecimal(keyLength);\\n var key = message.substring(index, index = index + 2);\\n var value = message.substring(index, index = index + keyLength - 2);\\n }\\n }\\n // prepare the ACK msg and change config if it is needed\\n lengthAck = messageBody.length / 2;\\n lengthAck = ('0000' + decimalToHex(lengthAck)).slice(-4);\\n lengthAck = lengthAck.toString().substring(2, 4) + lengthAck.toString().substring(0, 2);\\n ////////////checksum CRC 16\\n var checksumAck = byteStringToByteArray(messageBody);\\n checksumAck = crc16byte(checksumAck);\\n checksumAck = decimalToHex(checksumAck);\\n checksumAck = ('0000' + checksumAck).slice(-4);\\n checksumAck = checksumAck.toString().substring(2, 4) + checksumAck.toString().substring(0, 2);\\n prefix = prefix + lengthAck + checksumAck + sequenceID;\\n // To send ACK to the device previous to internal msg with parts\\n if (needsAck == true) {\\n if (messageBody.length <= 2) {\\n ack = 'AB00030008C7' + sequenceID + '7F0100'; // change AB10030008C7 to AB00030008C7\\n } else {\\n ack = prefix + messageBody;\\n }\\n AddValue(codeValues, 'imei', imei);\\n AddValue(codeValues, 'ack', ack);\\n }\\n } else { // checksum was invalid - print out useful debug info and bet quess at imei \\n AddValue(codeValues, \\\"error\\\", \\\"checksum failed for message\\\");\\n AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n i = rawFromBytes.search('3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]');\\n if (i >= 0) {\\n imei = hexToAscii(rawFromBytes.substring(i, i + 30));\\n AddValue(codeValues, \\\"imei\\\", imei);\\n }\\n }\\n }\\n // Auxiliary functions\\n function buildDataToReceiver(codeValues, configsToAck = [], configsToUpdate = [], configsToSend = []) {\\n const dataToReceiver = {\\n values: codeValues\\n };\\n if (configsToAck.length > 0) {\\n dataToReceiver.configsToAck = configsToAck;\\n }\\n if (configsToUpdate.length > 0) {\\n dataToReceiver.configsToUpdate = configsToUpdate;\\n }\\n if (configsToSend.length > 0) {\\n dataToReceiver.configsToSend = configsToSend;\\n }\\n return dataToReceiver;\\n }\\n\\n function AddValue(codeValueArray, p1, p2) { // push code value pair into array\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n codeValueArray.push(cvpair);\\n }\\n // convert functions\\n function asciiToHex(str) { // ascii to hex \\n return [...str].map(char => char.charCodeAt(0).toString(16).padStart(2, '0')).join('');\\n }\\n\\n function byteStringToByteArray(str) { // convierte una cadena hexadecimal en un array de bytes (number[])\\n const bytes = [];\\n for (let i = 0; i < str.length; i += 2) {\\n const byte = parseInt(str.substring(i, i + 2), 16);\\n if (!isNaN(byte) && byte >= 0 && byte <= 255) {\\n bytes.push(byte);\\n }\\n }\\n return bytes;\\n }\\n\\n function decimalToHex(x) {\\n return Number(x).toString(16).toUpperCase();\\n }\\n\\n function hexToBin(hex) { // convierte un valor hexadecimal a su representación binaria, y asegura que tenga al menos 8 bits \\n const bin = parseInt(hex, 16).toString(2);\\n return bin.padStart(hex.length * 4, '0');\\n }\\n\\n function hexToAscii(hex) {\\n if (hex.length % 2 !== 0) {\\n throw new Error(\\\"Hex string length must be even\\\");\\n }\\n let ascii = '';\\n for (let i = 0; i < hex.length; i += 2) {\\n const byte = hex.substr(i, 2);\\n const charCode = parseInt(byte, 16);\\n if (charCode !== 0) { // remove null character (\\\\u0000)\\n ascii += String.fromCharCode(charCode);\\n }\\n }\\n return ascii;\\n //return hex.match(/.{2}/g).map(byte => String.fromCharCode(parseInt(byte, 16))).join('');\\n }\\n\\n function hexToDecimalSigned(hex) { // hex to decimal\\n if (hex.length % 2 !== 0) {\\n hex = '0' + hex;\\n }\\n const num = parseInt(hex, 16);\\n const bits = hex.length * 4;\\n const maxVal = 2 ** bits;\\n return num >= maxVal / 2 ? num - maxVal : num;\\n }\\n\\n function hexToDecimal(hex) {\\n return parseInt(hex, 16);\\n }\\n // CheckSum and debug functions\\n function changeEndianness(hexString) { // changeEndianness\\n if (hexString.length === 0) { //if string is empty or not defined\\n return \\\"\\\";\\n }\\n if (hexString.length % 2 !== 0) {\\n throw new Error(\\\"Hex string length must be even\\\");\\n }\\n return hexString.match(/.{2}/g) // divide in bytes (2 chars)\\n .reverse() // reverse the order\\n .join('');\\n }\\n\\n function calculateCheckSum(payloadData) { // calcula el CRC16 sobre una cadena hexadecimal y devuelve el valor con el endianness invertido\\n const bytes = byteStringToByteArray(payloadData);\\n const crc = crc16byte(bytes);\\n const hex = crc.toString(16).padStart(4, '0').toUpperCase();\\n return changeEndianness(hex);\\n }\\n\\n function crc16byte(byteArray) { // calcula el CRC-16 sobre un array de bytes usando una tabla precalculada (crcTable)\\n let crc = 0x0000;\\n for (const byte of byteArray) {\\n if (byte < 0 || byte > 255 || !Number.isInteger(byte)) {\\n throw new RangeError(\\\"Invalid byte value in input array\\\");\\n }\\n const index = (byte ^ (crc >> 8)) & 0xFF;\\n crc = crcTable[index] ^ (crc << 8);\\n }\\n return crc & 0xFFFF;\\n }\\n\\n function debug(...args) { // write debug info to console log, if localTesting\\n if (localTesting) {\\n console.debug('[DEBUG]', ...args);\\n }\\n }\\n /*\\n function sendMessageToLocalhostNoWait(str) { // sends message to system, closing connection after\\n var server;\\n if (localTesting) {\\n console.log('local testing - sending to protocol-dev server the message ... '); // port 5878\\n console.log(str);\\n server = '52.174.17.77';\\n } else {\\n server = '127.0.0.1';\\n }\\n var c = net.createConnection(5878, server);\\n c.on('error', function(error) {\\n c = net.createConnection(5878, server);\\n });\\n c.write(`${str}`);\\n c.end();\\n }*/\\n function sendMessageToLocalhostNoWait(message) {\\n const server = localTesting ? '52.174.17.77' : '127.0.0.1';\\n //const port = localTesting ? '5878' : ''; //Protocol-dev\\n const port = '5678'; //acceptance-dev\\n if (localTesting) {\\n console.debug('[DEBUG] Sending message to test server:', message);\\n }\\n const client = net.createConnection(port, server, () => {\\n client.write(message);\\n client.end();\\n });\\n client.on('error', (err) => {\\n console.error(`[ERROR] Failed to send message to ${server}:${port}:`, err.message);\\n });\\n client.on('end', () => {\\n if (localTesting) {\\n console.debug('[DEBUG] Connection closed');\\n }\\n });\\n }\\n}\\n// params is not defined locally -> export as module\\nif (typeof(params) === 'undefined') {\\n module.exports = {\\n execute_ops\\n }\\n} else { // on server use local defined vars\\n let return_values = execute_ops(moment, msg, net, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\n // define global returns\\n msg = return_values;\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1749579352},{"Type":1,"NewValue":"{\"Id\":437,\"Name\":\"Access TEC Care Watch\",\"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 // Watch protocol - please see variables and typical values in order below\\n // Watch-CYC;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;SIGNAL=<>;WM=<>;GENERAL=<>\\n // Watch-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\n //\\n // Author: Juanmi Navarro\\n // Created: 01/01/0000\\n // Last modified: 20/05/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', 'Watch');\\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 = (`Watch-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 //<>,<>,<> \\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 //<>,<>,<> \\n if (mac2) {\\n AddValue(codeValues, 'beacon_mac', mac2);\\n var simpleQuery2 = [{\\n 'code': 'Mac',\\n 'value': mac2,\\n }];\\n var simpleQueryLabel2 = {\\n 'table': 'beacons',\\n 'select': 'Name',\\n 'query': simpleQuery2\\n };\\n var labels2 = [];\\n labels2.push(JSON.stringify(simpleQueryLabel2));\\n AddValue(codeValues, 'oysta_labels', JSON.stringify(labels2));\\n }\\n if (params.beacon_major) {\\n AddValue(codeValues, 'beacon_major', params.beacon_major);\\n } else {\\n AddValue(codeValues, 'beacon_major', 0);\\n }\\n if (params.beacon_minor) {\\n AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\n } else {\\n AddValue(codeValues, 'beacon_minor', 0);\\n }\\n //AddValue(codeValues,'oysta_labels', label);\\n //AddValue(codeValues,'oysta_value', mac);\\n if (location_time) {\\n AddValue(codeValues, 'location_time', location_time);\\n }\\n }\\n /* meter mas tarde... \\n if (params.smart_data !== 'undefined') {\\n var gen_location = params.smart_data.split(',')\\n var latitude = gen_location[0]\\n var longitude = gen_location[1]\\n var location_accuracy = gen_location[2]\\n var altitude = gen_location[3]\\n AddValue(codeValues,'latitude', latitude);\\n AddValue(codeValues,'longitude', longitude);\\n AddValue(codeValues,'altitude', altitude);\\n AddValue(codeValues,'location_accuracy', location_accuracy);\\n }\\n */\\n /*else if ((params.event_time) && (params.event_time == '')) {\\n var event_time = moment.utc().unix();\\n AddValue(codeValues,'event_time', event_time);\\n } revisar mas adelante*/\\n // to parse SMS info from the device\\n switch (messageTypeLocalCode) {\\n case 'COMM-SMS': // SMS message sent in\\n if (params.data.startsWith('Device location request')) {\\n configsToAck.push(configIds.Controls.RealTimeLocate);\\n } else if (params.data.startsWith('Set IP ok')) {\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\n } else if (params.data.startsWith('IMEI:')) {\\n configsToAck.push(configIds.Controls.GetFirmwareVersion);\\n } else if (params.data.startsWith('Set IP ok')) {\\n configsToAck.push(configIds.Controls.ClearBufferedMessages);\\n } else if (params.data.startsWith('flush ok')) {\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\n } else if (params.data.startsWith('Set Watch-')) {\\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 = (`Watch-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 = (`Watch;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 = (`Watch;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 = (`Watch-RTL;${params.imei};${location_time};${location_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n break;\\n }\\n if (!params.event_time && !event_time) { // if params.event_time undefined - set it to now. \\n var event_time = moment.utc().unix();\\n AddValue(codeValues, 'event_time', event_time);\\n }\\n // if (!params.location_time && !location_time) { // if params.location_time undefined - set it to now. \\n // var location_time = moment.utc().unix();\\n // AddValue(codeValues, 'location_time', location_time);\\n //}\\n }\\n // send data msg to kibana\\n const data = buildDataToReceiver(codeValues, configsToAck, configsToUpdate, configsToSend);\\n console.log(data);\\n return data\\n // end of main operation\\n // define functions used in operation\\n // decode global msg\\n function decoder(str) { // decode rawdata\\n // CARE Decoder\\n AddValue(codeValues, 'Message : ', str);\\n var message = str;\\n // need to check if checksum is correct for possible msg corruption 10/03/23\\n var checksum = message.substring(8, 12);\\n var messageBody = message.substring(16, message.length);\\n debug('message =' + message);\\n debug('checksum =' + checksum);\\n debug('calculateCheckSum =' + calculateCheckSum(messageBody));\\n if (calculateCheckSum(messageBody) == checksum) { // payload is valid\\n debug(\\\"message has valid checksum\\\");\\n var messageBody = command; // update value for the ACK\\n debug('command =' + command);\\n if (command == '01') {\\n while (index < total_length + 16) {\\n // gen_location = '0'; //cambiado 30/09\\n var keyLengthHex = message.substring(index, index = index + 2);\\n var keyLength = 2 * hexToDecimal(keyLengthHex);\\n var key = message.substring(index, index = index + 2);\\n var value = message.substring(index, index = index + keyLength - 2);\\n debug('key = ' + key);\\n debug('value = ' + value);\\n switch (key) {\\n //Device ID\\n case '01':\\n var imei = hexToAscii(value);\\n // create long connection if it is needed\\n if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\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\\n if ((alarmCodeExtInt & 1) == 1) {\\n var alarm = 'ALF-C';\\n }\\n // Welfare Check-out\\n else if ((alarmCodeExtInt & 2) == 2) {\\n var alarm = 'ALA-C';\\n }\\n // Standard Alerts\\n //Battery low\\n else if ((alarmCodeInt & 1) == 1) {\\n var alarm = 'BATL';\\n }\\n //Overspeed\\n else if ((alarmCodeInt & 2) == 2) {\\n var alarm = 'ALSP';\\n }\\n //Fall\\n else if ((alarmCodeInt & 4) == 4) {\\n var alarm = 'ALF';\\n }\\n //Tilt\\n else if ((alarmCodeInt & 8) == 8) {\\n var alarm = 'Tilt';\\n } else if ((alarmCodeInt & 16) == 16) {\\n if ((alarmCodeInt & 16777216) == 16777216) {\\n var alarm = 'Geo1-IN';\\n } else {\\n var alarm = 'Geo1-OUT';\\n }\\n } else if ((alarmCodeInt & 32) == 32) {\\n if ((alarmCodeInt & 33554432) == 33554432) {\\n var alarm = 'Geo2-IN';\\n } else {\\n var alarm = 'Geo2-OUT';\\n }\\n } else if ((alarmCodeInt & 64) == 64) {\\n if ((alarmCodeInt & 67108864) == 67108864) {\\n var alarm = 'Geo3-IN';\\n } else {\\n var alarm = 'Geo3-OUT';\\n }\\n } else if ((alarmCodeInt & 128) == 128) {\\n if ((alarmCodeInt & 134217728) == 134217728) {\\n var alarm = 'Geo4-IN';\\n } else {\\n var alarm = 'Geo4-OUT';\\n }\\n }\\n //Power Off\\n else if ((alarmCodeInt & 256) == 256) {\\n var alarm = 'PWRF';\\n }\\n //Power On\\n else if ((alarmCodeInt & 512) == 512) {\\n var alarm = 'PWRN';\\n }\\n //Motion\\n else if ((alarmCodeInt & 1024) == 1024) {\\n var alarm = 'ALMOV';\\n }\\n //No Motion\\n else if ((alarmCodeInt & 2048) == 2048) {\\n var alarm = 'ALNM';\\n }\\n //SOS\\n else if ((alarmCodeInt & 4096) == 4096) {\\n var alarm = 'ALSOS';\\n } else if ((alarmCodeInt & 8192) == 8192) {\\n var alarm = 'Side1';\\n } else if ((alarmCodeInt & 16384) == 16384) {\\n var alarm = 'Side2';\\n }\\n //Battery charging\\n else if ((alarmCodeInt & 32768) == 32768) {\\n var alarm = 'BATCN';\\n }\\n //Battery no charging\\n else if ((alarmCodeInt & 65536) == 65536) {\\n var alarm = 'BATCF';\\n }\\n //SOS Ending\\n // Temporary Commented until we know exactly how it works. 22/09/2022\\n else if ((alarmCodeInt & 131072) == 131072) {\\n var alarm = 'SOSEnding';\\n info = 'Alarm Finished';\\n }\\n //Amber Alert EC03 only\\n else if ((alarmCodeInt & 262144) == 262144) {\\n var alarm = 'ALAO';\\n }\\n // welfare Alert check-in ALA-O\\n else if ((alarmCodeInt & 524288) == 524288) {\\n var alarm = 'ALA-O';\\n }\\n // Amber alert Ending ALA-C\\n else if ((alarmCodeInt & 1048576) == 1048576) {\\n var alarm = 'ALA-C';\\n }\\n // Amber alert Ending ALA-C\\n //else if ((alarmCodeInt & 1048576) == 1048576) {\\n // var alarm = 'ALA-C';\\n //}\\n // Fall-Down Alert ending\\n else if ((alarmCodeInt & 2097152) == 2097152) {\\n var alarm = 'ALF-C';\\n }\\n // welfare Alert Ending ALA\\n else if ((alarmCodeInt & 4194304) == 4194304) {\\n var alarm = 'ALA';\\n }\\n // Beacon absent Alert 11/10/22. Need to be added in msg types\\n //else if ((alarmCodeInt & 16777216) == 16777216) {\\n // var alarm = 'BEA';\\n //}\\n general += 'alarm:' + alarm + ',';\\n break;\\n //Custom ID\\n case '03':\\n // in value is customID.... '06' for Watch Care\\n // if ((imei != '860470063029395') && (imei != '860470063035947')) {\\n //update customID to check if belongs to this type of device\\n //value = hexToAscii(value);\\n customID = value;\\n if (value != '3036') {\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n AddValue(codeValues, \\\"customID\\\", value);\\n // exit decoder\\n // const data = buildDataToReceiver(codeValues, configsToAck, configsToUpdate, configsToSend);\\n // console.log(data);\\n return // data\\n } else {\\n if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\n //return;\\n }\\n AddValue(codeValues, \\\"customID\\\", value);\\n general += 'customID:' + value + ',';\\n break;\\n }\\n //Historical Data Completed\\n case '10': // indica q se han terminado de enviar todos los datos historicos.\\n var histData = true;\\n break;\\n //GPS location\\n case '20':\\n location_type = 'GPS';\\n var latitudeHex = value.substring(0, 8);\\n var longitudeHex = value.substring(8, 16);\\n var speedHex = value.substring(16, 20);\\n var directionHex = value.substring(20, 24);\\n var altitudeHex = value.substring(24, 28);\\n var location_accuracyHex = value.substring(28, 32);\\n var mileageHex = value.substring(32, 40);\\n var satellitesHex = value.substring(40, 42);\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n speed = ((hexToDecimal(changeEndianness(speedHex))) / 3.6).toFixed(2); //date 14-02-2023 in m/s\\n var direction = hexToDecimal(changeEndianness(directionHex));\\n var altitude = hexToDecimal(changeEndianness(altitudeHex)); // in meters\\n //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\n // Range: 0.5 to 99.9 \\n location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\n //var mileage = hexToDecimal(changeEndianness(mileageHex)) this is in km/h we need m/s\\n var mileage = hexToDecimal(changeEndianness(mileageHex)); // in meters date 14-02-2023\\n var satellites = hexToDecimal(satellitesHex);\\n // location_time = timestamp;\\n //<>,<>,<>,<>,<>\\n gps_data = `${latitude},${longitude},${location_accuracy},${speed},${direction},${altitude},${satellites},${mileage}`;\\n general += 'gps location (lat):' + latitude + ', (long):' + longitude + ',';\\n break;\\n //WIFI Towers\\n case '22':\\n location_type = 'WIFI';\\n var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\n //location_time = timestamp;\\n var wifiTowers = value;\\n general += 'wifiTowers:';\\n var indexWifi = 0;\\n var bssid_array = [];\\n wifi_data = '';\\n for (let i = 0; i < numWifi; i++) {\\n wifi_data += hexToDecimalSigned(wifiTowers.substring(indexWifi, indexWifi + 2)) + ',' + wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\n indexWifi += 14;\\n }\\n wifi_data = wifi_data.slice(0, -1);\\n general += wifi_data;\\n break;\\n //BLE Location Added 10/10/22\\n case '23':\\n location_type = 'BLE';\\n var mac = value.substring(0, 12);\\n var latitudeHex = value.substring(12, 20);\\n var longitudeHex = value.substring(20, 28);\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n var address = hexToAscii(value.substring(28, value.length));\\n var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\n // add : format in MAC\\n mac = mac.match(/.{1,2}/g).join(':');\\n // location_time = timestamp;\\n ble_data = `${latitude},${longitude},${mac},${address}`;\\n general += 'BLE location (lat):' + latitude + ', (long):' + longitude + ',';\\n break;\\n //General Data , status_data\\n case '24':\\n //var general = 'true'\\n if (customID != '3036') {\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n AddValue(codeValues, \\\"customID\\\", customID);\\n return\\n }\\n if (alarmCode) {\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\n }\\n //else {\\n // messageForReceiver = (`CareWatch-CYC;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};`);\\n //}\\n // reset variables\\n //alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\n var timestampHex = value.substring(0, 8);\\n timestampHex = changeEndianness(timestampHex);\\n timestamp = hexToDecimal(timestampHex);\\n location_time = timestamp;\\n event_time = timestamp;\\n // HardCode to fix possible issue in protocol\\n //event_time = moment.utc().unix();\\n // end of hard code\\n var statusHex = changeEndianness(value.substring(8, 16));\\n var statusInt = hexToDecimal(statusHex);\\n var statusDevice = '';\\n if ((statusInt & 1) == 1) {\\n statusDevice += 'GPS,';\\n }\\n if ((statusInt & 2) == 2) {\\n statusDevice += 'WIFISource,';\\n }\\n if ((statusInt & 4) == 4) {\\n statusDevice += 'CellTower,';\\n }\\n if ((statusInt & 8) == 8) {\\n statusDevice += 'BLELocation,';\\n }\\n //params.BatteryStatus.BatteryStatus = '1';\\n if ((statusInt & 16) == 16) {\\n statusDevice += 'Charging,';\\n // var alarm = 'BATCN';\\n //configs.BatteryStatus.BatteryStatus = '1';\\n /* if (configs.BatteryStatus.BatteryStatus !== '1') {\\n hasConfigs = true;\\n var batteryStatus = '1';\\n var alarm = 'BATCN';\\n let configsToUpdate = [];\\n configsToUpdate.push({\\n 'code': configIds.BatteryStatus.BatteryStatus,\\n 'value': batteryStatus\\n });\\n }*/\\n }\\n if ((statusInt & 32) == 32) {\\n statusDevice += 'FUllyCharged,';\\n //var alarm = 'BATF';\\n // configs.BatteryStatus.BatteryStatus = '3';\\n /* if (configs.BatteryStatus.BatteryStatus !== '3') {\\n hasConfigs = true;\\n var batteryStatus = '3';\\n var alarm = 'BATF';\\n let configsToUpdate = [];\\n configsToUpdate.push({\\n 'code': configIds.BatteryStatus.BatteryStatus,\\n 'value': batteryStatus\\n });\\n }*/\\n }\\n /* if (!((statusInt & 32) == 32) & !((statusInt & 16) == 16)) {\\n statusDevice += 'Not Charging,';\\n var alarm = 'BATCF';\\n //configs.BatteryStatus.BatteryStatus = '2';\\n if (configs.BatteryStatus.BatteryStatus !== '2') {\\n var batteryStatus = '2';\\n var alarm = 'BATCF';\\n let configsToUpdate = [];\\n configsToUpdate.push({\\n 'code': configIds.BatteryStatus.BatteryStatus,\\n 'value': batteryStatus\\n });\\n }\\n }*/\\n if ((statusInt & 64) == 64) {\\n statusDevice += 'Reboot,';\\n }\\n if ((statusInt & 128) == 128) {\\n statusDevice += 'HistoricalData,';\\n }\\n if ((statusInt & 256) == 256) {\\n statusDevice += 'AGPSDataValid,';\\n }\\n if ((statusInt & 512) == 512) {\\n statusDevice += 'Motion,';\\n }\\n if ((statusInt & 1024) == 1024) {\\n statusDevice += 'SmartLocating,';\\n }\\n if ((statusInt & 2048) == 2048) { //isHome\\n statusDevice += 'BeaconLocation,';\\n }\\n if ((statusInt & 4096) == 4096) {\\n statusDevice += 'BLEConnected,';\\n }\\n if ((statusInt & 16384) == 16384) {\\n statusDevice += 'HomeWiFi,';\\n }\\n statusDevice = statusDevice.slice(0, -1);\\n status_data = statusDevice; //to oysta template\\n //statusHex = (statusHex);\\n statusHex = hexToBin(statusHex);\\n statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\n battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\n cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\n workMode = parseInt(statusHex.substring(13, 16), 2);\\n general += 'statusDevice:' + statusDevice + ',';\\n if (battery_percentage) {\\n general += 'battery:' + battery_percentage + ',';\\n }\\n if (cellNetworkSignal) {\\n general += 'cellNetworkSignal:' + cellNetworkSignal + ',';\\n }\\n if (workMode) {\\n general += 'workMode:' + workMode + ',';\\n }\\n //messageForReceiver = (`CareWatch-CYC;${imei};${i};${event_time};${battery_percentage}`);\\n break;\\n //Call Records\\n case '25':\\n //Needed?\\n break;\\n //BLE Location 2\\n case '26':\\n //I don't understand\\n //messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n //Smart Location\\n case '27':\\n location_type = 'SMART';\\n var latitudeHex = value.substring(0, 8);\\n var longitudeHex = value.substring(8, 16);\\n var location_accuracyHex = value.substring(16, 20);\\n var altitudeHex = value.substring(20, 24);\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n var altitude = hexToDecimal(changeEndianness(altitudeHex));\\n //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\n //04/08/2022 se quita el multiplicador por 5 pq ya viene el valor en metros\\n location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\n //location_time = timestamp;\\n smart_data = `${latitude},${longitude},${location_accuracy},${altitude}`;\\n general += 'smart location (lat):' + latitude + ', (long):' + longitude + ',';\\n break;\\n //Beacon Location Added 11/10/22\\n case '28':\\n location_type = 'BEACON';\\n // var alarm = 'EBZI';\\n var latitudeHex = '00';\\n var longitudeHex = '00';\\n var descr = 'empty';\\n var flag = hexToDecimal(value.substring(0, 1));\\n var beacId = hexToDecimal(value.substring(1, 2));\\n // msg includes descrip\\n if ((flag & 4) == 4) {\\n descr = hexToAscii(value.substring(18, value.length));\\n }\\n // msg includes lat/lon\\n if ((flag & 8) == 8) {\\n latitudeHex = value.substring(18, 26);\\n longitudeHex = value.substring(26, 34);\\n }\\n // msg includes lat/lon and description\\n if ((flag & 12) == 12) {\\n latitudeHex = value.substring(18, 26);\\n longitudeHex = value.substring(26, 34);\\n descr = hexToAscii(value.substring(34, value.length));\\n }\\n var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\n // add : format in MAC\\n mac = mac.match(/.{1,2}/g).join(':');\\n var rssiHex = value.substring(14, 16);\\n var rssi1Hex = value.substring(16, 18);\\n rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\n rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\n // var latitudeHex = value.substring(18, 26);\\n // var longitudeHex = value.substring(26, 34);\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n //location_time = timestamp;\\n beacon_data = `${latitude},${longitude},${mac},${descr}`;\\n general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (listIndex):' + beacId + ',';\\n break;\\n // Beacon V2\\n case '2C':\\n location_type = 'BEACON';\\n // var alarm = 'EBZI';\\n var latitudeHex = '00';\\n var longitudeHex = '00';\\n var descr = 'empty';\\n var flag = hexToDecimal(value.substring(0, 1));\\n var beacId = hexToDecimal(value.substring(1, 2));\\n // msg includes descrip\\n if ((flag & 4) == 4) {\\n let desc_leng = hexToDecimal(value.substring(20, 22));\\n descr = hexToAscii(value.substring(22, 22 + (2 * desc_leng)));\\n //descr = hexToAscii(value.substring(18, value.length));\\n }\\n // msg includes lat/lon\\n if ((flag & 8) == 8) {\\n latitudeHex = value.substring(18, 26);\\n longitudeHex = value.substring(26, 34);\\n }\\n // msg includes lat/lon and description\\n if ((flag & 12) == 12) {\\n latitudeHex = value.substring(20, 28);\\n longitudeHex = value.substring(28, 36);\\n let desc_leng = hexToDecimal(value.substring(36, 38));\\n descr = hexToAscii(value.substring(38, 38 + (2 * desc_leng)));\\n }\\n var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\n // add : format in MAC\\n mac = mac.match(/.{1,2}/g).join(':');\\n var rssiHex = value.substring(14, 16);\\n var rssi1Hex = value.substring(16, 18);\\n rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\n rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\n var battery_beacon = hexToDecimal(value.substring(18, 20));\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n //location_time = timestamp;\\n beacon_data = `${latitude},${longitude},${mac},${descr}`;\\n general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (battery):' + battery_beacon + ', (listIndex):' + beacId + ',';\\n break;\\n //Cell Towers Note\\n case '29':\\n location_type = 'LBS';\\n lbs_data = '';\\n var mccHex = changeEndianness(value.substring(0, 4));\\n var mncHex = value.substring(4, 6);\\n var mcc = hexToDecimal(mccHex);\\n lbs_data += mcc + ',';\\n var mnc = hexToDecimal(mncHex);\\n lbs_data += mnc + ',';\\n var indexLbs = 6;\\n var numTowers = (hexToDecimal(keyLengthHex) - 4) / 7;\\n for (let i = 0; i < numTowers; i++) {\\n var rxlHex = changeEndianness(value.substring(indexLbs, indexLbs + 2));\\n var rxl = hexToDecimal(rxlHex);\\n var lacHex = changeEndianness(value.substring(indexLbs + 2, indexLbs + 6));\\n var lac = hexToDecimal(lacHex);\\n var cellTowers = hexToDecimal(changeEndianness(value.substring(indexLbs + 6, indexLbs + 14)));\\n lbs_data += rxl + ',' + lac + ',' + cellTowers + ',';\\n indexLbs += 14;\\n }\\n lbs_data = lbs_data.slice(0, -1);\\n general += lbs_data;\\n break;\\n case '30':\\n //G-sensor.\\n //value = hexToAscii(value);\\n //if (value != '06') {\\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 = (`Watch-${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 //value = hexToAscii(value);\\n //if (value != '06') {\\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 = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n }\\n break;\\n //BLE Connected . For Flic button\\n case '62':\\n location_type = 'BLE';\\n //var alarm = 'EBZI'; \\n //var latitudeHex = '00';\\n //var longitudeHex = '00';\\n //var descr = 'empty';\\n var flag = hexToDecimal(value.substring(0, 2)); // 0= Disconnected, 1= Connected\\n var mac = value.substring(2, 14); // No hace falta darle la vuelta\\n // add : format in MAC\\n mac = mac.match(/.{1,2}/g).join(':');\\n var batLevel = hexToDecimal(value.substring(14, 16)); // 0-100\\n //location_time = timestamp;\\n ble_data = `${flag},${batLevel},${mac}`;\\n general += 'BLE location (State):' + flag + ', (bat):' + batLevel + ', (mac):' + mac + ',';\\n break;\\n }\\n }\\n if (alarmCode) {\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};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 = (`Watch;ACK-FIRM;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\n //AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\n configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\n //configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\n //messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n case '1A':\\n //no ACK need\\n var fwVersion = hexToAscii(value);\\n imei = serverParams.Imei;\\n AddValue(codeValues, \\\"imei\\\", imei);\\n AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\n messageForReceiver = (`Watch;ACK-FIRM;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\n //AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\n configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\n //configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\n break;\\n //IMEI\\n case '03':\\n var imei = hexToDecimal(value);\\n // harcode to avoid conflicts with Rio protocol\\n //if ((imei != '860470063029395') && (imei != '860470063035947')) {\\n // AddValue(codeValues, \\\"error\\\", \\\"device imei is not in this protocol\\\");\\n // AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n //AddValue(codeValues, \\\"IMEI\\\", imei);\\n // return\\n //}\\n if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\n //return;\\n }\\n messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n //ICCID\\n case '04':\\n var iccid = hexToDecimal(value);\\n messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n //BLE-MAC\\n case '05':\\n var bleMac = hexToDecimal(value);\\n messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n //Run Time\\n case '07':\\n var runTime = hexToDecimal(value);\\n messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n case '10': // Ringer Volume\\n var volume = hexToDecimal(value);\\n imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-VOL;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"Volume\\\", volume);\\n AddValue(configsToUpdate, configIds.ReadSystemSettings.Volume, volume);\\n configsToAck.push(configIds.ReadSystemSettings.Volume);\\n break;\\n case '0A': //Performance mode\\n //var workMode = hexToDecimal(value);\\n //messageBody = messageBody + keyLengthHex + key + value;\\n //AddValue(codeValues, \\\"WorkMode\\\", workMode);\\n //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\n //configsToAck.push(configIds.ReadPerformance`Settings.Mode);\\n //var workMode = hexToAscii(value.substring(0, value.length));\\n //var workMode = hexToDecimal(value);\\n //var workMode = hexToAscii(value.substring(0, value.length));\\n var workMode = 1234; // + value + \\\"end\\\";\\n //var workModeVal = 9;\\n //workMode = 'test10';\\n imei = serverParams.Imei;\\n messageForReceiver = (`Watch;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 '0F': // Enable control.... Used for STEP COUNTING SETTINGS\\n // 'FF FF 21 80'\\n var StepStatus = hexToBin(value.substring(4, 6));\\n var enalbleDisable = '';\\n if (StepStatus.substring(7, 8) == '1') {\\n var step = 'Enable, '\\n enalbleDisable = '1'\\n } else {\\n var step = 'Disable, '\\n };\\n //var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\n //hrate += detectingInterval;\\n AddValue(codeValues, \\\"step\\\", step);\\n //var imei = serverParams.Imei;\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(configsToUpdate, configIds.ReadStepsSettings.EnableDisableReadStepsSettings, enalbleDisable);\\n //AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\n configsToAck.push(configIds.ReadStepsSettings.EnableDisableReadStepsSettings);\\n //configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\n break;\\n case '1B':\\n //Decimal o ascii?\\n var gsmModule = hexToDecimal(value);\\n messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n case '1F':\\n //System Language\\n var systemLanguage = hexToAscii(value.substring(0, value.length));\\n imei = serverParams.Imei;\\n //messageBody = messageBody + keyLengthHex + key + value;\\n messageForReceiver = (`Watch;ACK-LANG;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"SystemLanguage\\\", systemLanguage);\\n AddValue(configsToUpdate, configIds.ReadSystemSettings.SystemLanguage, systemLanguage);\\n configsToAck.push(configIds.ReadSystemSettings.SystemLanguage);\\n break;\\n case '33': // phone option\\n // [Value]:83 0B 00 00 {\\\"phoneOption\\\":{\\\"flag_value\\\":2947,\\\"s3\\\":1,\\\"s4\\\":0,\\\"s5\\\":1,\\\"s6\\\":0,\\\"callIncoming\\\":0,\\\"rings\\\":3,\\\"s7\\\":0,\\\"toneID\\\":0,\\\"s1\\\":1,\\\"s2\\\":1}}\\n var statusPhone = hexToBin(value.substring(0, 2)); // To find autoanswer setup\\n if (statusPhone.substring(0, 1) == '1') { // 1 Enable\\n var auto = 'true';\\n } else var auto = 'false';\\n statusPhone = hexToBin(value.substring(2, 4)); // To find allow list setup\\n if (statusPhone.substring(7, 8) == '1') { // 1 Enable\\n allow = 'true';\\n } else var allow = 'false';\\n //statusPhone = hexToBin(value.substring(0, 2)) + hexToBin(value.substring(2, 4));\\n //AddValue(configsToUpdate, configIds.ReadSystemSettings.Statusphone, statusPhone);\\n AddValue(configsToUpdate, configIds.ReadSystemSettings.AllowList, allow);\\n AddValue(configsToUpdate, configIds.ReadSystemSettings.AutoAnswer, auto);\\n //configsToAck.push(configIds.ReadSystemSettings.Statusphone);\\n configsToAck.push(configIds.ReadSystemSettings.AllowList);\\n configsToAck.push(configIds.ReadSystemSettings.AutoAnswer);\\n break;\\n case '34': //ContactList with name\\n var contactNumber = value.substring(1, 2);\\n var telLength = hexToDecimal(value.substring(2, 4));\\n var tel = '';\\n switch (contactNumber) {\\n // Emergency Number\\n case '0':\\n tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\n AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\n AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\n configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\n break;\\n // Speed Dial Number\\n //case '1':\\n // tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\n // AddValue(codeValues, \\\"SpeedDialNumber\\\", tel);\\n // AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.SpeedDialNumber, tel);\\n // configsToAck.push(configIds.ReadSpeedDialSettings.SpeedDialNumber);\\n // break;\\n // Gateway Number\\n case '9': //00447781482635,Esendex UK 0034627177148,Esendex Spain 00447507288240,Esendex UK Acceptance\\n tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\n if (tel.includes('447781482635') || tel.includes('00447781482635')) {\\n tel = 'Esendex UK'\\n } else if (tel.includes('34627177148') || tel.includes('0034627177148')) {\\n tel = 'Esendex Spain'\\n } else if (tel.includes('447507288240') || tel.includes('00447507288240')) {\\n tel = 'Esendex UK Acceptance'\\n } else {\\n tel = 'Default'\\n }\\n AddValue(codeValues, \\\"SMSGateway\\\", tel);\\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\n configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\n break;\\n default:\\n tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\n if (tel.length < 6) {\\n contacts += '';\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\n break;\\n }\\n //contacts += 'A' + (contactNumber - 1) + ': ' + tel + ', ';\\n contacts += tel + ', ';\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\n break;\\n }\\n break;\\n case '40': // APN\\n //no ACK need\\n AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'));\\n configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\n var apn = hexToAscii(value.substring(0, value.length));\\n imei = serverParams.Imei;\\n break;\\n case '41': // APN Username\\n //no ACK need\\n //apn = apn + ',' + hexToAscii(value.substring(0, value.length));\\n break;\\n case '42': // APN Password\\n //no ACK need\\n //apn = apn + ',' + hexToAscii(value.substring(0, value.length));\\n messageForReceiver = (`Watch;ACK-GDATA;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"apn\\\", apn);\\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.APN, apn);\\n configsToAck.push(configIds.ReadCommunicationSettings.APN);\\n break;\\n case '43': //Server Details\\n //52.232.85.255,5678 production 52.174.17.77,5678 acceptance\\n var serverDetails = hexToAscii(value.substring(6, value.length)) + ':' + hexToDecimal(value.substring(4, 6) + value.substring(2, 4));\\n if (serverDetails.includes('52.232.85.255:5678')) {\\n serverDetails = 'Production'\\n } else if (serverDetails.includes('52.174.17.77:5678')) {\\n serverDetails = 'Acceptance'\\n } else if (serverDetails.includes('52.174.17.77:5778')) {\\n serverDetails = 'Protocol-Import'\\n } else if (serverDetails.includes('52.174.17.77:5878')) {\\n serverDetails = 'Protocol-Dev'\\n } else {\\n serverDetails = 'Default'\\n }\\n AddValue(codeValues, \\\"server\\\", serverDetails);\\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.Server, serverDetails);\\n configsToAck.push(configIds.ReadCommunicationSettings.Server);\\n break;\\n case '44': //time interval - work mode intervals\\n imei = serverParams.Imei;\\n messageForReceiver = (`Watch;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 '46': //HeartRate\\n // '10 0E 00 80'\\n var HeartRateStatus = hexToBin(value.substring(6, 8));\\n var enalbleDisable = '';\\n if (HeartRateStatus.substring(0, 1) == '1') {\\n var hrate = 'Enable, '\\n enalbleDisable = '1'\\n } else {\\n var hrate = 'Disable, '\\n };\\n var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\n hrate += detectingInterval;\\n AddValue(codeValues, \\\"hrate\\\", hrate);\\n //var imei = serverParams.Imei;\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings, enalbleDisable);\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\n configsToAck.push(configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings);\\n configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\n break;\\n case '47': // Custom Id\\n imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-CUSTID;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"customeid\\\", value);\\n AddValue(configsToUpdate, configIds.ReadState.CustomId, hexToAscii(value)); //now it comes \\\"3036\\\"\\n configsToAck.push(configIds.ReadState.CustomId);\\n break;\\n case '53': // Non motion alert\\n //2B020080\\n var status = hexToBin(value.substring(6, 8));\\n var alertSetting = '';\\n var enableDisable = '';\\n if (status.substring(0, 1) == '1') {\\n alertSetting = 'Enable, '\\n enableDisable = '1';\\n } else {\\n alertSetting = 'Disable, '\\n };\\n //if (status.substring(5, 6) == '1') {\\n // alertSetting += 'Dial, '\\n //} else {\\n // alertSetting += 'No Dial, '\\n //};\\n var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\n alertSetting += time;\\n imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-NOMOTION;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"nomotion\\\", alertSetting);\\n //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings, enableDisable);\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\n //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\n configsToAck.push(configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings);\\n configsToAck.push(configIds.ReadNonMovementSettings.Time);\\n break;\\n case '56': //Fall down sensibility\\n // '00001100'\\n var fallStatus = hexToBin(value.substring(0, 2));\\n var enalbleDisable = '';\\n //if (fallStatus.substring(4, 5) == '1') {\\n if (fallStatus.substring(0, 1) == '1') {\\n var sensibility = 'Enable, '\\n enalbleDisable = '1'\\n } else {\\n var sensibility = 'Disable, '\\n };\\n if (fallStatus.substring(5, 6) == '1') {\\n sensibility += 'Dial, '\\n } else {\\n sensibility += 'No Dial, '\\n };\\n var imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-FALLALERT;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n var sesibityOptionValue = hexToDecimal(value.substring(1, 2));\\n sensibility += sesibityOptionValue;\\n AddValue(codeValues, \\\"sensibility\\\", sensibility);\\n //AddValue(configsToUpdate, configIds.ReadAlertSettings.FallSettings, sensibility);\\n AddValue(configsToUpdate, configIds.ReadFallSettings.EnableDisableFallSettings, enalbleDisable);\\n AddValue(configsToUpdate, configIds.ReadFallSettings.Sensitivity, sesibityOptionValue);\\n //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\n configsToAck.push(configIds.ReadFallSettings.EnableDisableFallSettings);\\n configsToAck.push(configIds.ReadFallSettings.Sensitivity);\\n break;\\n case '73': //BeaconList\\n var beaconNumber = hexToDecimal(value.substring(1, 2));\\n var beaconStatus = hexToBin(value.substring(0, 1));\\n beaconStatus = hexToAscii(value.substring(30, value.length));\\n //beaconStatus = changeEndianness(value.substring(30, value.length));\\n //homeBeacon += 'B' + (beaconNumber + 1) + ': ' + beaconStatus + ', ';\\n homeBeacon += beaconStatus + ', ';\\n AddValue(codeValues, \\\"homeBeacon\\\", homeBeacon);\\n messageForReceiver = (`Watch;ACK-GDATA;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\n configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\n break;\\n case '4A': //Wifi Network List\\n var wifiSSIDLenght = hexToDecimal(value.substring(2, 4));\\n var wifiPasswordLenght = hexToDecimal(value.substring(4, 6));\\n var wifiIndex = hexToDecimal(value.substring(1, 2));\\n //var wifiStatus = hexToDecimal(value.substring(0, 1));\\n var wifiStatus = value.substring(0, 1);\\n /*var enalbleDisable = wifiSSID = wifiPassword = homeWifi = '';\\n /var homeWifi = '';\\n if (wifiIndex == '0') { // Only first Wifi of the list\\n if (wifiStatus == '8') {\\n homeWifi += ' Enable, '\\n enalbleDisable = '1';\\n } else {\\n homeWifi += ' Disable, '\\n //enalbleDisable = '0';\\n };*/\\n if ((wifiStatus == '8') || (wifiStatus == 'C')) { // 8 == ON OR C== ON and Connected\\n var wifiSSID = hexToAscii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\n var wifiPassword = hexToAscii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\n var imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-WIFI;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n //homeWiFi += 'W' + (wifiIndex + 1) + ': ' + wifiSSID + ', ' + wifiPassword + ';';\\n homeWiFi += wifiSSID + ', ' + wifiPassword + ';';\\n AddValue(codeValues, \\\"wifi\\\", homeWiFi);\\n AddValue(configsToUpdate, configIds.ReadWiFiList.WiFiList, homeWiFi);\\n configsToAck.push(configIds.ReadWiFiList.WiFiList);\\n }\\n //AddValue(configsToUpdate, configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings, enalbleDisable);\\n //AddValue(configsToUpdate, configIds.ReadWiFiSettings.SSID, wifiSSID);\\n //AddValue(configsToUpdate, configIds.ReadWiFiSettings.Password, wifiPassword);\\n //configsToAck.push(configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings);\\n //configsToAck.push(configIds.ReadWiFiSettings.SSID);\\n //configsToAck.push(configIds.ReadWiFiSettings.Password);\\n break;\\n case '21': // Speed Dial Settings\\n // [Value]:53 84 {\\\"call1Button\\\":{\\\"mode\\\":0,\\\"feedBack\\\":3,\\\"task\\\":2,\\\"time\\\":20,\\\"status\\\":1}}\\n var status = hexToBin(value.substring(2, 4)); //always pass 2 HEXs to this function\\n var alertSetting = '';\\n var enalbleDisable = '';\\n if (status.substring(0, 1) == '1') {\\n alertSetting = 'Enable, '\\n enalbleDisable = '1'\\n } else {\\n alertSetting = 'Disable, '\\n //enableDisable = '0';\\n };\\n //var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\n //alertSetting += time;\\n imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-SPEED;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"speed\\\", alertSetting);\\n //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\n AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\n //AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\n //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\n configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\n //configsToAck.push(configIds.ReadNonMovementSettings.Time);\\n break;\\n }\\n }\\n }\\n if (command == '03') {\\n while (index < total_length + 16) {\\n var keyLengthHex = message.substring(index, index = index + 2);\\n var keyLength = 2 * hexToDecimal(keyLengthHex);\\n var key = message.substring(index, index = index + 2);\\n var value = message.substring(index, index = index + keyLength - 2);\\n debug('key = ' + key);\\n debug('value = ' + value);\\n switch (key) {\\n case '01': // Device ID\\n var imei = hexToAscii(value);\\n // create long connection if it is needed\\n if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\n //return;\\n }\\n break;\\n //CustomID is not provided so far with command type 03.. commented in the mean time\\n /* case '03':\\n //update customID to check if belongs to this type of device\\n customID = value;\\n if (value != '04') {\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n AddValue(codeValues, \\\"customID\\\", value);\\n return\\n } else {\\n if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\n }\\n AddValue(codeValues, \\\"customID\\\", value);\\n general += 'customID:' + value + ',';\\n break;\\n }\\n break; */\\n case '10': // Heartbeat\\n var heartbeat = hexToAscii(value);\\n event_time = moment.utc().unix();\\n if (index < total_length + 16) {\\n var keyLengthHex = message.substring(index, index = index + 2);\\n keyLength = 2 * hexToDecimal(keyLengthHex);\\n key = message.substring(index, index = index + 2);\\n if (key == '24') {\\n // debug('key: ' + key) //comment those out\\n value = message.substring(index, index = index + keyLength - 2);\\n // debug(value)\\n var timestampHex = value.substring(0, 8);\\n // debug('timestampt hex: ' + timestampHex)\\n timestampHex = changeEndianness(timestampHex);\\n timestamp = hexToDecimal(timestampHex);\\n event_time = timestamp;\\n // debug(event_time)\\n var statusHex = changeEndianness(value.substring(8, 16));\\n // debug(statusHex)\\n var statusInt = hexToDecimal(statusHex);\\n var statusDevice = '';\\n if ((statusInt & 1) == 1) {\\n statusDevice += 'GPS,';\\n }\\n if ((statusInt & 2) == 2) {\\n statusDevice += 'WIFISource,';\\n }\\n if ((statusInt & 4) == 4) {\\n statusDevice += 'CellTower,';\\n }\\n if ((statusInt & 8) == 8) {\\n statusDevice += 'BLELocation,';\\n }\\n if ((statusInt & 16) == 16) {\\n statusDevice += 'Charging,';\\n }\\n if ((statusInt & 32) == 32) {\\n statusDevice += 'FUllyCharged,';\\n }\\n if ((statusInt & 64) == 64) {\\n statusDevice += 'Reboot,';\\n }\\n if ((statusInt & 128) == 128) {\\n statusDevice += 'HistoricalData,';\\n }\\n if ((statusInt & 256) == 256) {\\n statusDevice += 'AGPSDataValid,';\\n }\\n if ((statusInt & 512) == 512) {\\n statusDevice += 'Motion,';\\n }\\n if ((statusInt & 1024) == 1024) {\\n statusDevice += 'SmartLocating,';\\n }\\n if ((statusInt & 2048) == 2048) {\\n statusDevice += 'BeaconLocation,';\\n }\\n if ((statusInt & 4096) == 4096) {\\n statusDevice += 'BLEConnected,';\\n }\\n statusDevice = statusDevice.slice(0, -1);\\n // debug('statusHex:' + statusHex)\\n statusHex = (statusHex);\\n statusHex = hexToBin(statusHex);\\n statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\n // debug(statusHex)\\n battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\n // debug(battery_percentage)\\n // debug(battery_percentage)\\n // debug(statusHex.substring(8, 13))\\n cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\n // debug(cellNetworkSignal)\\n workMode = parseInt(statusHex.substring(13, 16), 2);\\n // debug(workMode)\\n general += 'statusDevice:' + statusDevice + ';';\\n if (battery_percentage) {\\n general += 'battery:' + battery_percentage + ';';\\n }\\n if (cellNetworkSignal) {\\n general += 'cellNetworkSignal:' + cellNetworkSignal + ';';\\n }\\n if (workMode) {\\n general += 'workMode:' + workMode + ';';\\n }\\n }\\n }\\n // revisar\\n var gen_location = '0';\\n //CustomID is not provided so far with command type 03.. commented in the mean time\\n /*if (customID != '04') {\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n AddValue(codeValues, \\\"customID\\\", value);\\n return\\n }*/\\n //messageForReceiver = (`Eview-HTB;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};SIGNAL=${cellNetworkSignal};WM=${workMode};SL=${systemLanguage};GENERAL=${general}`);\\n messageForReceiver = (`Watch-HTB;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n //messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n case '12': // Device requesting timestamp\\n timestamp = moment.utc().unix();\\n timestampHex = decimalToHex(timestamp);\\n timestampHex = changeEndianness(timestampHex);\\n keyLengthHex = ('00' + decimalToHex(1 + (timestampHex.length) / 2)).slice(-2);\\n // respond to device with the timestamp of the server\\n messageBody = messageBody + keyLengthHex + key + timestampHex;\\n messageForReceiver = `Eview;${imei};${sequenceID};Get timestamp`;\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n break;\\n case '21': //Cell Towers\\n var mccHex = value.substring(0, 2);\\n var mncHex = value.substring(2, 3);\\n var mcc = hexToDecimal(mccHex);\\n var mnc = hexToDecimal(mncHex);\\n var numTowers = (keyLength - 4) / 5;\\n var cellTowers = hexToAscii(value);\\n messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n case '22': // WIFI locations \\n location_type = 'WIFI';\\n var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\n //location_time = timestamp;\\n var wifiTowers = value;\\n general += 'wifiTowers:';\\n var indexWifi = 0;\\n var bssid_array = [];\\n gen_location = '';\\n for (let i = 0; i < numWifi; i++) {\\n gen_location += wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\n indexWifi += 14;\\n }\\n gen_location = gen_location.slice(0, -1);\\n general += gen_location;\\n //CustomID is not provided so far with command type 03\\n /*if (customID != '04') {\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n AddValue(codeValues, \\\"customID\\\", value);\\n return\\n }*/\\n if (alarmCode) {\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};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 = (`Watch-ACK;${imei};${message}`); // ${sequenceID}; add ${sequenceID}; 19-07\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n var value = message.substring(index, index = index + keyLength - 2);\\n if (typeof configIds !== 'undefined' && configIds && configIds.ConfigureDevice && configIds.ConfigureDevice.LastConfigured) { // when is defined\\n AddValue(configsToUpdate, configIds.ConfigureDevice.LastConfigured, moment().format('YYYY/MM/DD, HH:mm:ss'));\\n configsToAck.push(configIds.ConfigureDevice.LastConfigured);\\n }\\n //}\\n }\\n if (command == 'FE') {\\n while (index < total_length + 16) {\\n var keyLength = message.substring(index, index = index + 2);\\n keyLength = 2 * hexToDecimal(keyLength);\\n var key = message.substring(index, index = index + 2);\\n var value = message.substring(index, index = index + keyLength - 2);\\n }\\n }\\n // prepare the ACK msg and change config if it is needed\\n lengthAck = messageBody.length / 2;\\n lengthAck = ('0000' + decimalToHex(lengthAck)).slice(-4);\\n lengthAck = lengthAck.toString().substring(2, 4) + lengthAck.toString().substring(0, 2);\\n ////////////checksum CRC 16\\n var checksumAck = byteStringToByteArray(messageBody);\\n checksumAck = crc16byte(checksumAck);\\n checksumAck = decimalToHex(checksumAck);\\n checksumAck = ('0000' + checksumAck).slice(-4);\\n checksumAck = checksumAck.toString().substring(2, 4) + checksumAck.toString().substring(0, 2);\\n prefix = prefix + lengthAck + checksumAck + sequenceID;\\n // To send ACK to the device previous to internal msg with parts\\n if (needsAck == true) {\\n if (messageBody.length <= 2) {\\n ack = 'AB00030008C7' + sequenceID + '7F0100'; // change AB10030008C7 to AB00030008C7\\n } else {\\n ack = prefix + messageBody;\\n }\\n AddValue(codeValues, 'imei', imei);\\n AddValue(codeValues, 'ack', ack);\\n }\\n } else { // checksum was invalid - print out useful debug info and bet quess at imei \\n AddValue(codeValues, \\\"error\\\", \\\"checksum failed for message\\\");\\n AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n i = rawFromBytes.search('3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]');\\n if (i >= 0) {\\n imei = hexToAscii(rawFromBytes.substring(i, i + 30));\\n AddValue(codeValues, \\\"imei\\\", imei);\\n }\\n }\\n }\\n // Auxiliary functions\\n function buildDataToReceiver(codeValues, configsToAck = [], configsToUpdate = [], configsToSend = []) {\\n const dataToReceiver = {\\n values: codeValues\\n };\\n if (configsToAck.length > 0) {\\n dataToReceiver.configsToAck = configsToAck;\\n }\\n if (configsToUpdate.length > 0) {\\n dataToReceiver.configsToUpdate = configsToUpdate;\\n }\\n if (configsToSend.length > 0) {\\n dataToReceiver.configsToSend = configsToSend;\\n }\\n return dataToReceiver;\\n }\\n\\n function AddValue(codeValueArray, p1, p2) { // push code value pair into array\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n codeValueArray.push(cvpair);\\n }\\n // convert functions\\n function asciiToHex(str) { // ascii to hex \\n return [...str].map(char => char.charCodeAt(0).toString(16).padStart(2, '0')).join('');\\n }\\n\\n function byteStringToByteArray(str) { // convierte una cadena hexadecimal en un array de bytes (number[])\\n const bytes = [];\\n for (let i = 0; i < str.length; i += 2) {\\n const byte = parseInt(str.substring(i, i + 2), 16);\\n if (!isNaN(byte) && byte >= 0 && byte <= 255) {\\n bytes.push(byte);\\n }\\n }\\n return bytes;\\n }\\n\\n function decimalToHex(x) {\\n return Number(x).toString(16).toUpperCase();\\n }\\n\\n function hexToBin(hex) { // convierte un valor hexadecimal a su representación binaria, y asegura que tenga al menos 8 bits \\n const bin = parseInt(hex, 16).toString(2);\\n return bin.padStart(hex.length * 4, '0');\\n }\\n\\n function hexToAscii(hex) {\\n if (hex.length % 2 !== 0) {\\n throw new Error(\\\"Hex string length must be even\\\");\\n }\\n let ascii = '';\\n for (let i = 0; i < hex.length; i += 2) {\\n const byte = hex.substr(i, 2);\\n const charCode = parseInt(byte, 16);\\n if (charCode !== 0) { // remove null character (\\\\u0000)\\n ascii += String.fromCharCode(charCode);\\n }\\n }\\n return ascii;\\n //return hex.match(/.{2}/g).map(byte => String.fromCharCode(parseInt(byte, 16))).join('');\\n }\\n\\n function hexToDecimalSigned(hex) { // hex to decimal\\n if (hex.length % 2 !== 0) {\\n hex = '0' + hex;\\n }\\n const num = parseInt(hex, 16);\\n const bits = hex.length * 4;\\n const maxVal = 2 ** bits;\\n return num >= maxVal / 2 ? num - maxVal : num;\\n }\\n\\n function hexToDecimal(hex) {\\n return parseInt(hex, 16);\\n }\\n // CheckSum and debug functions\\n function changeEndianness(hexString) { // changeEndianness\\n if (hexString.length === 0) { //if string is empty or not defined\\n return \\\"\\\";\\n }\\n if (hexString.length % 2 !== 0) {\\n throw new Error(\\\"Hex string length must be even\\\");\\n }\\n return hexString.match(/.{2}/g) // divide in bytes (2 chars)\\n .reverse() // reverse the order\\n .join('');\\n }\\n\\n function calculateCheckSum(payloadData) { // calcula el CRC16 sobre una cadena hexadecimal y devuelve el valor con el endianness invertido\\n const bytes = byteStringToByteArray(payloadData);\\n const crc = crc16byte(bytes);\\n const hex = crc.toString(16).padStart(4, '0').toUpperCase();\\n return changeEndianness(hex);\\n }\\n\\n function crc16byte(byteArray) { // calcula el CRC-16 sobre un array de bytes usando una tabla precalculada (crcTable)\\n let crc = 0x0000;\\n for (const byte of byteArray) {\\n if (byte < 0 || byte > 255 || !Number.isInteger(byte)) {\\n throw new RangeError(\\\"Invalid byte value in input array\\\");\\n }\\n const index = (byte ^ (crc >> 8)) & 0xFF;\\n crc = crcTable[index] ^ (crc << 8);\\n }\\n return crc & 0xFFFF;\\n }\\n\\n function debug(...args) { // write debug info to console log, if localTesting\\n if (localTesting) {\\n console.debug('[DEBUG]', ...args);\\n }\\n }\\n /*\\n function sendMessageToLocalhostNoWait(str) { // sends message to system, closing connection after\\n var server;\\n if (localTesting) {\\n console.log('local testing - sending to protocol-dev server the message ... '); // port 5878\\n console.log(str);\\n server = '52.174.17.77';\\n } else {\\n server = '127.0.0.1';\\n }\\n var c = net.createConnection(5878, server);\\n c.on('error', function(error) {\\n c = net.createConnection(5878, server);\\n });\\n c.write(`${str}`);\\n c.end();\\n }*/\\n function sendMessageToLocalhostNoWait(message) {\\n const server = localTesting ? '52.174.17.77' : '127.0.0.1';\\n //const port = localTesting ? '5878' : ''; //Protocol-dev\\n const port = '5678'; //acceptance-dev\\n if (localTesting) {\\n console.debug('[DEBUG] Sending message to test server:', message);\\n }\\n const client = net.createConnection(port, server, () => {\\n client.write(message);\\n client.end();\\n });\\n client.on('error', (err) => {\\n console.error(`[ERROR] Failed to send message to ${server}:${port}:`, err.message);\\n });\\n client.on('end', () => {\\n if (localTesting) {\\n console.debug('[DEBUG] Connection closed');\\n }\\n });\\n }\\n}\\n// params is not defined locally -> export as module\\nif (typeof(params) === 'undefined') {\\n module.exports = {\\n execute_ops\\n }\\n} else { // on server use local defined vars\\n let return_values = execute_ops(moment, msg, net, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\n // define global returns\\n msg = return_values;\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1749580364},{"Type":1,"NewValue":"{\"Id\":437,\"Name\":\"Access TEC Care Watch\",\"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 // Watch protocol - please see variables and typical values in order below\\r\\n // Watch-CYC;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;SIGNAL=<>;WM=<>;GENERAL=<>\\r\\n // Watch-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\r\\n //\\r\\n // Author: Juanmi Navarro\\r\\n // Created: 01/01/0000\\r\\n // Last modified: 20/05/2025\\r\\n //\\r\\n ///////////////////////////////////////////////////////////////////////////////\\r\\n if (typeof localTesting === \\\"undefined\\\") {\\r\\n let localTesting = \\\"False\\\";\\r\\n }\\r\\n const crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,\\r\\n 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,\\r\\n 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,\\r\\n 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,\\r\\n 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,\\r\\n 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,\\r\\n 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,\\r\\n 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,\\r\\n 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,\\r\\n 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,\\r\\n 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,\\r\\n 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,\\r\\n 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,\\r\\n 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,\\r\\n 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,\\r\\n 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,\\r\\n 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,\\r\\n 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,\\r\\n 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,\\r\\n 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,\\r\\n 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,\\r\\n 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n ];\\r\\n var codeValues = [];\\r\\n AddValue(codeValues, 'protocol_template', 'Watch');\\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 = (`Watch-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 //<>,<>,<> \\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 //<>,<>,<> \\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 Watch-')) {\\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 = (`Watch-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 = (`Watch;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 = (`Watch;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 = (`Watch-RTL;${params.imei};${location_time};${location_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n break;\\r\\n }\\r\\n if (!params.event_time && !event_time) { // if params.event_time undefined - set it to now. \\r\\n var event_time = moment.utc().unix();\\r\\n AddValue(codeValues, 'event_time', event_time);\\r\\n }\\r\\n // if (!params.location_time && !location_time) { // if params.location_time undefined - set it to now. \\r\\n // var location_time = moment.utc().unix();\\r\\n // AddValue(codeValues, 'location_time', location_time);\\r\\n //}\\r\\n }\\r\\n // send data msg to kibana\\r\\n const data = buildDataToReceiver(codeValues, configsToAck, configsToUpdate, configsToSend);\\r\\n console.log(data);\\r\\n return data\\r\\n // end of main operation\\r\\n // define functions used in operation\\r\\n // decode global msg\\r\\n function decoder(str) { // decode rawdata\\r\\n // CARE Decoder\\r\\n AddValue(codeValues, 'Message : ', str);\\r\\n var message = str;\\r\\n // need to check if checksum is correct for possible msg corruption 10/03/23\\r\\n var checksum = message.substring(8, 12);\\r\\n var messageBody = message.substring(16, message.length);\\r\\n debug('message =' + message);\\r\\n debug('checksum =' + checksum);\\r\\n debug('calculateCheckSum =' + calculateCheckSum(messageBody));\\r\\n if (calculateCheckSum(messageBody) == checksum) { // payload is valid\\r\\n debug(\\\"message has valid checksum\\\");\\r\\n var messageBody = command; // update value for the ACK\\r\\n debug('command =' + command);\\r\\n if (command == '01') {\\r\\n while (index < total_length + 16) {\\r\\n var keyLengthHex = message.substring(index, index = index + 2);\\r\\n var keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n var key = message.substring(index, index = index + 2);\\r\\n var value = message.substring(index, index = index + keyLength - 2);\\r\\n debug('key = ' + key);\\r\\n debug('value = ' + value);\\r\\n switch (key) {\\r\\n //Device ID\\r\\n case '01':\\r\\n var imei = hexToAscii(value);\\r\\n // create long connection if it is needed\\r\\n if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n //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\\r\\n if ((alarmCodeExtInt & 1) == 1) {\\r\\n var alarm = 'ALF-C';\\r\\n }\\r\\n // Welfare Check-out\\r\\n else if ((alarmCodeExtInt & 2) == 2) {\\r\\n var alarm = 'ALA-C';\\r\\n }\\r\\n // Standard Alerts\\r\\n //Battery low\\r\\n else if ((alarmCodeInt & 1) == 1) {\\r\\n var alarm = 'BATL';\\r\\n }\\r\\n //Overspeed\\r\\n else if ((alarmCodeInt & 2) == 2) {\\r\\n var alarm = 'ALSP';\\r\\n }\\r\\n //Fall\\r\\n else if ((alarmCodeInt & 4) == 4) {\\r\\n var alarm = 'ALF';\\r\\n }\\r\\n //Tilt\\r\\n else if ((alarmCodeInt & 8) == 8) {\\r\\n var alarm = 'Tilt';\\r\\n } else if ((alarmCodeInt & 16) == 16) {\\r\\n if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n var alarm = 'Geo1-IN';\\r\\n } else {\\r\\n var alarm = 'Geo1-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 32) == 32) {\\r\\n if ((alarmCodeInt & 33554432) == 33554432) {\\r\\n var alarm = 'Geo2-IN';\\r\\n } else {\\r\\n var alarm = 'Geo2-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 64) == 64) {\\r\\n if ((alarmCodeInt & 67108864) == 67108864) {\\r\\n var alarm = 'Geo3-IN';\\r\\n } else {\\r\\n var alarm = 'Geo3-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 128) == 128) {\\r\\n if ((alarmCodeInt & 134217728) == 134217728) {\\r\\n var alarm = 'Geo4-IN';\\r\\n } else {\\r\\n var alarm = 'Geo4-OUT';\\r\\n }\\r\\n }\\r\\n //Power Off\\r\\n else if ((alarmCodeInt & 256) == 256) {\\r\\n var alarm = 'PWRF';\\r\\n }\\r\\n //Power On\\r\\n else if ((alarmCodeInt & 512) == 512) {\\r\\n var alarm = 'PWRN';\\r\\n }\\r\\n //Motion\\r\\n else if ((alarmCodeInt & 1024) == 1024) {\\r\\n var alarm = 'ALMOV';\\r\\n }\\r\\n //No Motion\\r\\n else if ((alarmCodeInt & 2048) == 2048) {\\r\\n var alarm = 'ALNM';\\r\\n }\\r\\n //SOS\\r\\n else if ((alarmCodeInt & 4096) == 4096) {\\r\\n var alarm = 'ALSOS';\\r\\n } else if ((alarmCodeInt & 8192) == 8192) {\\r\\n var alarm = 'Side1';\\r\\n } else if ((alarmCodeInt & 16384) == 16384) {\\r\\n var alarm = 'Side2';\\r\\n }\\r\\n //Battery charging\\r\\n else if ((alarmCodeInt & 32768) == 32768) {\\r\\n var alarm = 'BATCN';\\r\\n }\\r\\n //Battery no charging\\r\\n else if ((alarmCodeInt & 65536) == 65536) {\\r\\n var alarm = 'BATCF';\\r\\n }\\r\\n //SOS Ending\\r\\n // Temporary Commented until we know exactly how it works. 22/09/2022\\r\\n else if ((alarmCodeInt & 131072) == 131072) {\\r\\n var alarm = 'SOSEnding';\\r\\n info = 'Alarm Finished';\\r\\n }\\r\\n //Amber Alert EC03 only\\r\\n else if ((alarmCodeInt & 262144) == 262144) {\\r\\n var alarm = 'ALAO';\\r\\n }\\r\\n // welfare Alert check-in ALA-O\\r\\n else if ((alarmCodeInt & 524288) == 524288) {\\r\\n var alarm = 'ALA-O';\\r\\n }\\r\\n // Amber alert Ending ALA-C\\r\\n else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n var alarm = 'ALA-C';\\r\\n }\\r\\n // Amber alert Ending ALA-C\\r\\n //else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n // var alarm = 'ALA-C';\\r\\n //}\\r\\n // Fall-Down Alert ending\\r\\n else if ((alarmCodeInt & 2097152) == 2097152) {\\r\\n var alarm = 'ALF-C';\\r\\n }\\r\\n // welfare Alert Ending ALA\\r\\n else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n var alarm = 'ALA';\\r\\n }\\r\\n // Beacon absent Alert 11/10/22. Need to be added in msg types\\r\\n //else if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n // var alarm = 'BEA';\\r\\n //}\\r\\n general += 'alarm:' + alarm + ',';\\r\\n break;\\r\\n //Custom ID\\r\\n case '03':\\r\\n customID = value;\\r\\n var allowedCID = ['3036', '06'];\\r\\n if (!allowedCID.includes(value)) {\\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 //<>,<>,<>,<>,<>\\r\\n gps_data = `${latitude},${longitude},${location_accuracy},${speed},${direction},${altitude},${satellites},${mileage}`;\\r\\n general += 'gps location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n break;\\r\\n //WIFI Towers\\r\\n case '22':\\r\\n location_type = 'WIFI';\\r\\n var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\r\\n //location_time = timestamp;\\r\\n var wifiTowers = value;\\r\\n general += 'wifiTowers:';\\r\\n var indexWifi = 0;\\r\\n var bssid_array = [];\\r\\n wifi_data = '';\\r\\n for (let i = 0; i < numWifi; i++) {\\r\\n wifi_data += hexToDecimalSigned(wifiTowers.substring(indexWifi, indexWifi + 2)) + ',' + wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\r\\n indexWifi += 14;\\r\\n }\\r\\n wifi_data = wifi_data.slice(0, -1);\\r\\n general += wifi_data;\\r\\n break;\\r\\n //BLE Location Added 10/10/22\\r\\n case '23':\\r\\n location_type = 'BLE';\\r\\n var mac = value.substring(0, 12);\\r\\n var latitudeHex = value.substring(12, 20);\\r\\n var longitudeHex = value.substring(20, 28);\\r\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n var address = hexToAscii(value.substring(28, value.length));\\r\\n var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n // add : format in MAC\\r\\n mac = mac.match(/.{1,2}/g).join(':');\\r\\n // location_time = timestamp;\\r\\n ble_data = `${latitude},${longitude},${mac},${address}`;\\r\\n general += 'BLE location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n break;\\r\\n //General Data , status_data\\r\\n case '24':\\r\\n //const allowedCID = ['3036', '06'];\\r\\n if (!allowedCID.includes(customID)) {\\r\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n AddValue(codeValues, \\\"customID\\\", customID);\\r\\n return\\r\\n }\\r\\n if (alarmCode) {\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n }\\r\\n //else {\\r\\n // messageForReceiver = (`CareWatch-CYC;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};`);\\r\\n //}\\r\\n // reset variables\\r\\n //alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n var timestampHex = value.substring(0, 8);\\r\\n timestampHex = changeEndianness(timestampHex);\\r\\n timestamp = hexToDecimal(timestampHex);\\r\\n location_time = timestamp;\\r\\n event_time = timestamp;\\r\\n // HardCode to fix possible issue in protocol\\r\\n //event_time = moment.utc().unix();\\r\\n // end of hard code\\r\\n var statusHex = changeEndianness(value.substring(8, 16));\\r\\n var statusInt = hexToDecimal(statusHex);\\r\\n var statusDevice = '';\\r\\n if ((statusInt & 1) == 1) {\\r\\n statusDevice += 'GPS,';\\r\\n }\\r\\n if ((statusInt & 2) == 2) {\\r\\n statusDevice += 'WIFISource,';\\r\\n }\\r\\n if ((statusInt & 4) == 4) {\\r\\n statusDevice += 'CellTower,';\\r\\n }\\r\\n if ((statusInt & 8) == 8) {\\r\\n statusDevice += 'BLELocation,';\\r\\n }\\r\\n //params.BatteryStatus.BatteryStatus = '1';\\r\\n if ((statusInt & 16) == 16) {\\r\\n statusDevice += 'Charging,';\\r\\n // var alarm = 'BATCN';\\r\\n //configs.BatteryStatus.BatteryStatus = '1';\\r\\n /* if (configs.BatteryStatus.BatteryStatus !== '1') {\\r\\n hasConfigs = true;\\r\\n var batteryStatus = '1';\\r\\n var alarm = 'BATCN';\\r\\n let configsToUpdate = [];\\r\\n configsToUpdate.push({\\r\\n 'code': configIds.BatteryStatus.BatteryStatus,\\r\\n 'value': batteryStatus\\r\\n });\\r\\n }*/\\r\\n }\\r\\n if ((statusInt & 32) == 32) {\\r\\n statusDevice += 'FUllyCharged,';\\r\\n //var alarm = 'BATF';\\r\\n // configs.BatteryStatus.BatteryStatus = '3';\\r\\n /* if (configs.BatteryStatus.BatteryStatus !== '3') {\\r\\n hasConfigs = true;\\r\\n var batteryStatus = '3';\\r\\n var alarm = 'BATF';\\r\\n let configsToUpdate = [];\\r\\n configsToUpdate.push({\\r\\n 'code': configIds.BatteryStatus.BatteryStatus,\\r\\n 'value': batteryStatus\\r\\n });\\r\\n }*/\\r\\n }\\r\\n /* if (!((statusInt & 32) == 32) & !((statusInt & 16) == 16)) {\\r\\n statusDevice += 'Not Charging,';\\r\\n var alarm = 'BATCF';\\r\\n //configs.BatteryStatus.BatteryStatus = '2';\\r\\n if (configs.BatteryStatus.BatteryStatus !== '2') {\\r\\n var batteryStatus = '2';\\r\\n var alarm = 'BATCF';\\r\\n let configsToUpdate = [];\\r\\n configsToUpdate.push({\\r\\n 'code': configIds.BatteryStatus.BatteryStatus,\\r\\n 'value': batteryStatus\\r\\n });\\r\\n }\\r\\n }*/\\r\\n if ((statusInt & 64) == 64) {\\r\\n statusDevice += 'Reboot,';\\r\\n }\\r\\n if ((statusInt & 128) == 128) {\\r\\n statusDevice += 'HistoricalData,';\\r\\n }\\r\\n if ((statusInt & 256) == 256) {\\r\\n statusDevice += 'AGPSDataValid,';\\r\\n }\\r\\n if ((statusInt & 512) == 512) {\\r\\n statusDevice += 'Motion,';\\r\\n }\\r\\n if ((statusInt & 1024) == 1024) {\\r\\n statusDevice += 'SmartLocating,';\\r\\n }\\r\\n if ((statusInt & 2048) == 2048) { //isHome\\r\\n statusDevice += 'BeaconLocation,';\\r\\n }\\r\\n if ((statusInt & 4096) == 4096) {\\r\\n statusDevice += 'BLEConnected,';\\r\\n }\\r\\n if ((statusInt & 16384) == 16384) {\\r\\n statusDevice += 'HomeWiFi,';\\r\\n }\\r\\n statusDevice = statusDevice.slice(0, -1);\\r\\n status_data = statusDevice; //to oysta template\\r\\n //statusHex = (statusHex);\\r\\n statusHex = hexToBin(statusHex);\\r\\n statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\r\\n battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\r\\n cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\r\\n workMode = parseInt(statusHex.substring(13, 16), 2);\\r\\n general += 'statusDevice:' + statusDevice + ',';\\r\\n if (battery_percentage) {\\r\\n general += 'battery:' + battery_percentage + ',';\\r\\n }\\r\\n if (cellNetworkSignal) {\\r\\n general += 'cellNetworkSignal:' + cellNetworkSignal + ',';\\r\\n }\\r\\n if (workMode) {\\r\\n general += 'workMode:' + workMode + ',';\\r\\n }\\r\\n //messageForReceiver = (`CareWatch-CYC;${imei};${i};${event_time};${battery_percentage}`);\\r\\n break;\\r\\n //Call Records\\r\\n case '25':\\r\\n //Needed?\\r\\n break;\\r\\n //BLE Location 2\\r\\n case '26':\\r\\n //I don't understand\\r\\n //messageBody = messageBody + keyLengthHex + key + value;\\r\\n break;\\r\\n //Smart Location\\r\\n case '27':\\r\\n location_type = 'SMART';\\r\\n var latitudeHex = value.substring(0, 8);\\r\\n var longitudeHex = value.substring(8, 16);\\r\\n var location_accuracyHex = value.substring(16, 20);\\r\\n var altitudeHex = value.substring(20, 24);\\r\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n var altitude = hexToDecimal(changeEndianness(altitudeHex));\\r\\n //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\r\\n //04/08/2022 se quita el multiplicador por 5 pq ya viene el valor en metros\\r\\n location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\r\\n //location_time = timestamp;\\r\\n smart_data = `${latitude},${longitude},${location_accuracy},${altitude}`;\\r\\n general += 'smart location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n break;\\r\\n //Beacon Location Added 11/10/22\\r\\n case '28':\\r\\n location_type = 'BEACON';\\r\\n // var alarm = 'EBZI';\\r\\n var latitudeHex = '00';\\r\\n var longitudeHex = '00';\\r\\n var descr = 'empty';\\r\\n var flag = hexToDecimal(value.substring(0, 1));\\r\\n var beacId = hexToDecimal(value.substring(1, 2));\\r\\n // msg includes descrip\\r\\n if ((flag & 4) == 4) {\\r\\n descr = hexToAscii(value.substring(18, value.length));\\r\\n }\\r\\n // msg includes lat/lon\\r\\n if ((flag & 8) == 8) {\\r\\n latitudeHex = value.substring(18, 26);\\r\\n longitudeHex = value.substring(26, 34);\\r\\n }\\r\\n // msg includes lat/lon and description\\r\\n if ((flag & 12) == 12) {\\r\\n latitudeHex = value.substring(18, 26);\\r\\n longitudeHex = value.substring(26, 34);\\r\\n descr = hexToAscii(value.substring(34, value.length));\\r\\n }\\r\\n var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n // add : format in MAC\\r\\n mac = mac.match(/.{1,2}/g).join(':');\\r\\n var rssiHex = value.substring(14, 16);\\r\\n var rssi1Hex = value.substring(16, 18);\\r\\n rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\r\\n rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\r\\n // var latitudeHex = value.substring(18, 26);\\r\\n // var longitudeHex = value.substring(26, 34);\\r\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n //location_time = timestamp;\\r\\n beacon_data = `${latitude},${longitude},${mac},${descr}`;\\r\\n general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (listIndex):' + beacId + ',';\\r\\n break;\\r\\n // Beacon V2\\r\\n case '2C':\\r\\n location_type = 'BEACON';\\r\\n // var alarm = 'EBZI';\\r\\n var latitudeHex = '00';\\r\\n var longitudeHex = '00';\\r\\n var descr = 'empty';\\r\\n var flag = hexToDecimal(value.substring(0, 1));\\r\\n var beacId = hexToDecimal(value.substring(1, 2));\\r\\n // msg includes descrip\\r\\n if ((flag & 4) == 4) {\\r\\n let desc_leng = hexToDecimal(value.substring(20, 22));\\r\\n descr = hexToAscii(value.substring(22, 22 + (2 * desc_leng)));\\r\\n //descr = hexToAscii(value.substring(18, value.length));\\r\\n }\\r\\n // msg includes lat/lon\\r\\n if ((flag & 8) == 8) {\\r\\n latitudeHex = value.substring(18, 26);\\r\\n longitudeHex = value.substring(26, 34);\\r\\n }\\r\\n // msg includes lat/lon and description\\r\\n if ((flag & 12) == 12) {\\r\\n latitudeHex = value.substring(20, 28);\\r\\n longitudeHex = value.substring(28, 36);\\r\\n let desc_leng = hexToDecimal(value.substring(36, 38));\\r\\n descr = hexToAscii(value.substring(38, 38 + (2 * desc_leng)));\\r\\n }\\r\\n var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n // add : format in MAC\\r\\n mac = mac.match(/.{1,2}/g).join(':');\\r\\n var rssiHex = value.substring(14, 16);\\r\\n var rssi1Hex = value.substring(16, 18);\\r\\n rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\r\\n rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\r\\n var battery_beacon = hexToDecimal(value.substring(18, 20));\\r\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n //location_time = timestamp;\\r\\n beacon_data = `${latitude},${longitude},${mac},${descr}`;\\r\\n general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (battery):' + battery_beacon + ', (listIndex):' + beacId + ',';\\r\\n break;\\r\\n //Cell Towers Note\\r\\n case '29':\\r\\n location_type = 'LBS';\\r\\n lbs_data = '';\\r\\n var mccHex = changeEndianness(value.substring(0, 4));\\r\\n var mncHex = value.substring(4, 6);\\r\\n var mcc = hexToDecimal(mccHex);\\r\\n lbs_data += mcc + ',';\\r\\n var mnc = hexToDecimal(mncHex);\\r\\n lbs_data += mnc + ',';\\r\\n var indexLbs = 6;\\r\\n var numTowers = (hexToDecimal(keyLengthHex) - 4) / 7;\\r\\n for (let i = 0; i < numTowers; i++) {\\r\\n var rxlHex = changeEndianness(value.substring(indexLbs, indexLbs + 2));\\r\\n var rxl = hexToDecimal(rxlHex);\\r\\n var lacHex = changeEndianness(value.substring(indexLbs + 2, indexLbs + 6));\\r\\n var lac = hexToDecimal(lacHex);\\r\\n var cellTowers = hexToDecimal(changeEndianness(value.substring(indexLbs + 6, indexLbs + 14)));\\r\\n lbs_data += rxl + ',' + lac + ',' + cellTowers + ',';\\r\\n indexLbs += 14;\\r\\n }\\r\\n lbs_data = lbs_data.slice(0, -1);\\r\\n general += lbs_data;\\r\\n break;\\r\\n case '30':\\r\\n //G-sensor.\\r\\n 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 = (`Watch-${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 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 = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n }\\r\\n break;\\r\\n //BLE Connected . For Flic button\\r\\n case '62':\\r\\n location_type = 'BLE';\\r\\n //var alarm = 'EBZI'; \\r\\n //var latitudeHex = '00';\\r\\n //var longitudeHex = '00';\\r\\n //var descr = 'empty';\\r\\n var flag = hexToDecimal(value.substring(0, 2)); // 0= Disconnected, 1= Connected\\r\\n var mac = value.substring(2, 14); // No hace falta darle la vuelta\\r\\n // add : format in MAC\\r\\n mac = mac.match(/.{1,2}/g).join(':');\\r\\n var batLevel = hexToDecimal(value.substring(14, 16)); // 0-100\\r\\n //location_time = timestamp;\\r\\n ble_data = `${flag},${batLevel},${mac}`;\\r\\n general += 'BLE location (State):' + flag + ', (bat):' + batLevel + ', (mac):' + mac + ',';\\r\\n break;\\r\\n }\\r\\n }\\r\\n if (alarmCode) {\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch;ACK-FIRM;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\r\\n //AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\r\\n configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\r\\n //configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\r\\n //messageBody = messageBody + keyLengthHex + key + value;\\r\\n break;\\r\\n case '1A':\\r\\n //no ACK need\\r\\n var fwVersion = hexToAscii(value);\\r\\n imei = serverParams.Imei;\\r\\n AddValue(codeValues, \\\"imei\\\", imei);\\r\\n AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\r\\n messageForReceiver = (`Watch;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 = (`Watch;ACK-VOL;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"Volume\\\", volume);\\r\\n AddValue(configsToUpdate, configIds.ReadSystemSettings.Volume, volume);\\r\\n configsToAck.push(configIds.ReadSystemSettings.Volume);\\r\\n break;\\r\\n case '0A': //Performance mode\\r\\n //var workMode = hexToDecimal(value);\\r\\n //messageBody = messageBody + keyLengthHex + key + value;\\r\\n //AddValue(codeValues, \\\"WorkMode\\\", workMode);\\r\\n //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\r\\n //configsToAck.push(configIds.ReadPerformance`Settings.Mode);\\r\\n //var workMode = hexToAscii(value.substring(0, value.length));\\r\\n //var workMode = hexToDecimal(value);\\r\\n //var workMode = hexToAscii(value.substring(0, value.length));\\r\\n var workMode = 1234; // + value + \\\"end\\\";\\r\\n //var workModeVal = 9;\\r\\n //workMode = 'test10';\\r\\n imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;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 '0F': // Enable control.... Used for STEP COUNTING SETTINGS\\r\\n // 'FF FF 21 80'\\r\\n var StepStatus = hexToBin(value.substring(4, 6));\\r\\n var enalbleDisable = '';\\r\\n if (StepStatus.substring(7, 8) == '1') {\\r\\n var step = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var step = 'Disable, '\\r\\n };\\r\\n //var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n //hrate += detectingInterval;\\r\\n AddValue(codeValues, \\\"step\\\", step);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadStepsSettings.EnableDisableReadStepsSettings, enalbleDisable);\\r\\n //AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadStepsSettings.EnableDisableReadStepsSettings);\\r\\n //configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\r\\n break;\\r\\n case '1B':\\r\\n //Decimal o ascii?\\r\\n var gsmModule = hexToDecimal(value);\\r\\n messageBody = messageBody + keyLengthHex + key + value;\\r\\n break;\\r\\n case '1F':\\r\\n //System Language\\r\\n var systemLanguage = hexToAscii(value.substring(0, value.length));\\r\\n imei = serverParams.Imei;\\r\\n //messageBody = messageBody + keyLengthHex + key + value;\\r\\n messageForReceiver = (`Watch;ACK-LANG;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"SystemLanguage\\\", systemLanguage);\\r\\n AddValue(configsToUpdate, configIds.ReadSystemSettings.SystemLanguage, systemLanguage);\\r\\n configsToAck.push(configIds.ReadSystemSettings.SystemLanguage);\\r\\n break;\\r\\n case '33': // phone option\\r\\n // [Value]:83 0B 00 00 {\\\"phoneOption\\\":{\\\"flag_value\\\":2947,\\\"s3\\\":1,\\\"s4\\\":0,\\\"s5\\\":1,\\\"s6\\\":0,\\\"callIncoming\\\":0,\\\"rings\\\":3,\\\"s7\\\":0,\\\"toneID\\\":0,\\\"s1\\\":1,\\\"s2\\\":1}}\\r\\n var statusPhone = hexToBin(value.substring(0, 2)); // To find autoanswer setup\\r\\n if (statusPhone.substring(0, 1) == '1') { // 1 Enable\\r\\n var auto = 'true';\\r\\n } else var auto = 'false';\\r\\n statusPhone = hexToBin(value.substring(2, 4)); // To find allow list setup\\r\\n if (statusPhone.substring(7, 8) == '1') { // 1 Enable\\r\\n allow = 'true';\\r\\n } else var allow = 'false';\\r\\n //statusPhone = hexToBin(value.substring(0, 2)) + hexToBin(value.substring(2, 4));\\r\\n //AddValue(configsToUpdate, configIds.ReadSystemSettings.Statusphone, statusPhone);\\r\\n AddValue(configsToUpdate, configIds.ReadSystemSettings.AllowList, allow);\\r\\n AddValue(configsToUpdate, configIds.ReadSystemSettings.AutoAnswer, auto);\\r\\n //configsToAck.push(configIds.ReadSystemSettings.Statusphone);\\r\\n configsToAck.push(configIds.ReadSystemSettings.AllowList);\\r\\n configsToAck.push(configIds.ReadSystemSettings.AutoAnswer);\\r\\n break;\\r\\n case '34': //ContactList with name\\r\\n var contactNumber = value.substring(1, 2);\\r\\n var telLength = hexToDecimal(value.substring(2, 4));\\r\\n var tel = '';\\r\\n switch (contactNumber) {\\r\\n // Emergency Number\\r\\n case '0':\\r\\n tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\r\\n AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n break;\\r\\n // Speed Dial Number\\r\\n //case '1':\\r\\n // tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\r\\n // AddValue(codeValues, \\\"SpeedDialNumber\\\", tel);\\r\\n // AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.SpeedDialNumber, tel);\\r\\n // configsToAck.push(configIds.ReadSpeedDialSettings.SpeedDialNumber);\\r\\n // break;\\r\\n // Gateway Number\\r\\n case '9': //00447781482635,Esendex UK 0034627177148,Esendex Spain 00447507288240,Esendex UK Acceptance\\r\\n tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\r\\n if (tel.includes('447781482635') || tel.includes('00447781482635')) {\\r\\n tel = 'Esendex UK'\\r\\n } else if (tel.includes('34627177148') || tel.includes('0034627177148')) {\\r\\n tel = 'Esendex Spain'\\r\\n } else if (tel.includes('447507288240') || tel.includes('00447507288240')) {\\r\\n tel = 'Esendex UK Acceptance'\\r\\n } else {\\r\\n tel = 'Default'\\r\\n }\\r\\n AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n break;\\r\\n default:\\r\\n tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\r\\n if (tel.length < 6) {\\r\\n contacts += '';\\r\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n break;\\r\\n }\\r\\n //contacts += 'A' + (contactNumber - 1) + ': ' + tel + ', ';\\r\\n contacts += tel + ', ';\\r\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n break;\\r\\n }\\r\\n break;\\r\\n case '40': // APN\\r\\n //no ACK need\\r\\n AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'));\\r\\n configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\r\\n var apn = hexToAscii(value.substring(0, value.length));\\r\\n imei = serverParams.Imei;\\r\\n break;\\r\\n case '41': // APN Username\\r\\n //no ACK need\\r\\n //apn = apn + ',' + hexToAscii(value.substring(0, value.length));\\r\\n break;\\r\\n case '42': // APN Password\\r\\n //no ACK need\\r\\n //apn = apn + ',' + hexToAscii(value.substring(0, value.length));\\r\\n messageForReceiver = (`Watch;ACK-GDATA;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"apn\\\", apn);\\r\\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.APN, apn);\\r\\n configsToAck.push(configIds.ReadCommunicationSettings.APN);\\r\\n break;\\r\\n case '43': //Server Details\\r\\n //52.232.85.255,5678 production 52.174.17.77,5678 acceptance\\r\\n var serverDetails = hexToAscii(value.substring(6, value.length)) + ':' + hexToDecimal(value.substring(4, 6) + value.substring(2, 4));\\r\\n if (serverDetails.includes('52.232.85.255:5678')) {\\r\\n serverDetails = 'Production'\\r\\n } else if (serverDetails.includes('52.174.17.77:5678')) {\\r\\n serverDetails = 'Acceptance'\\r\\n } else if (serverDetails.includes('52.174.17.77:5778')) {\\r\\n serverDetails = 'Protocol-Import'\\r\\n } else if (serverDetails.includes('52.174.17.77:5878')) {\\r\\n serverDetails = 'Protocol-Dev'\\r\\n } else {\\r\\n serverDetails = 'Default'\\r\\n }\\r\\n AddValue(codeValues, \\\"server\\\", serverDetails);\\r\\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.Server, serverDetails);\\r\\n configsToAck.push(configIds.ReadCommunicationSettings.Server);\\r\\n break;\\r\\n case '44': //time interval - work mode intervals\\r\\n imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;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 '46': //HeartRate\\r\\n // '10 0E 00 80'\\r\\n var HeartRateStatus = hexToBin(value.substring(6, 8));\\r\\n var enalbleDisable = '';\\r\\n if (HeartRateStatus.substring(0, 1) == '1') {\\r\\n var hrate = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var hrate = 'Disable, '\\r\\n };\\r\\n var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n hrate += detectingInterval;\\r\\n AddValue(codeValues, \\\"hrate\\\", hrate);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings);\\r\\n configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\r\\n break;\\r\\n case '47': // Custom Id\\r\\n imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;ACK-CUSTID;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"customeid\\\", value);\\r\\n AddValue(configsToUpdate, configIds.ReadState.CustomId, hexToAscii(value)); //now it comes \\\"3036\\\"\\r\\n configsToAck.push(configIds.ReadState.CustomId);\\r\\n break;\\r\\n case '53': // Non motion alert\\r\\n //2B020080\\r\\n var status = hexToBin(value.substring(6, 8));\\r\\n var alertSetting = '';\\r\\n var enableDisable = '';\\r\\n if (status.substring(0, 1) == '1') {\\r\\n alertSetting = 'Enable, '\\r\\n enableDisable = '1';\\r\\n } else {\\r\\n alertSetting = 'Disable, '\\r\\n };\\r\\n //if (status.substring(5, 6) == '1') {\\r\\n // alertSetting += 'Dial, '\\r\\n //} else {\\r\\n // alertSetting += 'No Dial, '\\r\\n //};\\r\\n var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\r\\n alertSetting += time;\\r\\n imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;ACK-NOMOTION;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"nomotion\\\", alertSetting);\\r\\n //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings, enableDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n configsToAck.push(configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings);\\r\\n configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n break;\\r\\n case '56': //Fall down sensibility\\r\\n // '00001100'\\r\\n var fallStatus = hexToBin(value.substring(0, 2));\\r\\n var enalbleDisable = '';\\r\\n //if (fallStatus.substring(4, 5) == '1') {\\r\\n if (fallStatus.substring(0, 1) == '1') {\\r\\n var sensibility = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var sensibility = 'Disable, '\\r\\n };\\r\\n if (fallStatus.substring(5, 6) == '1') {\\r\\n sensibility += 'Dial, '\\r\\n } else {\\r\\n sensibility += 'No Dial, '\\r\\n };\\r\\n var imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;ACK-FALLALERT;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n var sesibityOptionValue = hexToDecimal(value.substring(1, 2));\\r\\n sensibility += sesibityOptionValue;\\r\\n AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n //AddValue(configsToUpdate, configIds.ReadAlertSettings.FallSettings, sensibility);\\r\\n AddValue(configsToUpdate, configIds.ReadFallSettings.EnableDisableFallSettings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadFallSettings.Sensitivity, sesibityOptionValue);\\r\\n //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n configsToAck.push(configIds.ReadFallSettings.EnableDisableFallSettings);\\r\\n configsToAck.push(configIds.ReadFallSettings.Sensitivity);\\r\\n break;\\r\\n case '73': //BeaconList\\r\\n var beaconNumber = hexToDecimal(value.substring(1, 2));\\r\\n var beaconStatus = hexToBin(value.substring(0, 1));\\r\\n beaconStatus = hexToAscii(value.substring(30, value.length));\\r\\n //beaconStatus = changeEndianness(value.substring(30, value.length));\\r\\n //homeBeacon += 'B' + (beaconNumber + 1) + ': ' + beaconStatus + ', ';\\r\\n homeBeacon += beaconStatus + ', ';\\r\\n AddValue(codeValues, \\\"homeBeacon\\\", homeBeacon);\\r\\n messageForReceiver = (`Watch;ACK-GDATA;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n break;\\r\\n case '4A': //Wifi Network List\\r\\n var wifiSSIDLenght = hexToDecimal(value.substring(2, 4));\\r\\n var wifiPasswordLenght = hexToDecimal(value.substring(4, 6));\\r\\n var wifiIndex = hexToDecimal(value.substring(1, 2));\\r\\n //var wifiStatus = hexToDecimal(value.substring(0, 1));\\r\\n var wifiStatus = value.substring(0, 1);\\r\\n /*var enalbleDisable = wifiSSID = wifiPassword = homeWifi = '';\\r\\n /var homeWifi = '';\\r\\n if (wifiIndex == '0') { // Only first Wifi of the list\\r\\n if (wifiStatus == '8') {\\r\\n homeWifi += ' Enable, '\\r\\n enalbleDisable = '1';\\r\\n } else {\\r\\n homeWifi += ' Disable, '\\r\\n //enalbleDisable = '0';\\r\\n };*/\\r\\n if ((wifiStatus == '8') || (wifiStatus == 'C')) { // 8 == ON OR C== ON and Connected\\r\\n var wifiSSID = hexToAscii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\r\\n var wifiPassword = hexToAscii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\r\\n var imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;ACK-WIFI;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n //homeWiFi += 'W' + (wifiIndex + 1) + ': ' + wifiSSID + ', ' + wifiPassword + ';';\\r\\n homeWiFi += wifiSSID + ', ' + wifiPassword + ';';\\r\\n AddValue(codeValues, \\\"wifi\\\", homeWiFi);\\r\\n AddValue(configsToUpdate, configIds.ReadWiFiList.WiFiList, homeWiFi);\\r\\n configsToAck.push(configIds.ReadWiFiList.WiFiList);\\r\\n }\\r\\n //AddValue(configsToUpdate, configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings, enalbleDisable);\\r\\n //AddValue(configsToUpdate, configIds.ReadWiFiSettings.SSID, wifiSSID);\\r\\n //AddValue(configsToUpdate, configIds.ReadWiFiSettings.Password, wifiPassword);\\r\\n //configsToAck.push(configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings);\\r\\n //configsToAck.push(configIds.ReadWiFiSettings.SSID);\\r\\n //configsToAck.push(configIds.ReadWiFiSettings.Password);\\r\\n break;\\r\\n case '21': // Speed Dial Settings\\r\\n // [Value]:53 84 {\\\"call1Button\\\":{\\\"mode\\\":0,\\\"feedBack\\\":3,\\\"task\\\":2,\\\"time\\\":20,\\\"status\\\":1}}\\r\\n var status = hexToBin(value.substring(2, 4)); //always pass 2 HEXs to this function\\r\\n var alertSetting = '';\\r\\n var enalbleDisable = '';\\r\\n if (status.substring(0, 1) == '1') {\\r\\n alertSetting = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n alertSetting = 'Disable, '\\r\\n //enableDisable = '0';\\r\\n };\\r\\n //var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\r\\n //alertSetting += time;\\r\\n imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;ACK-SPEED;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"speed\\\", alertSetting);\\r\\n //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\r\\n //AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n //configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n break;\\r\\n }\\r\\n }\\r\\n }\\r\\n if (command == '03') {\\r\\n while (index < total_length + 16) {\\r\\n var keyLengthHex = message.substring(index, index = index + 2);\\r\\n var keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n var key = message.substring(index, index = index + 2);\\r\\n var value = message.substring(index, index = index + keyLength - 2);\\r\\n debug('key = ' + key);\\r\\n debug('value = ' + value);\\r\\n switch (key) {\\r\\n case '01': // Device ID\\r\\n var imei = hexToAscii(value);\\r\\n // create long connection if it is needed\\r\\n if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n //return;\\r\\n }\\r\\n break;\\r\\n case '10': // Heartbeat\\r\\n var heartbeat = hexToAscii(value);\\r\\n event_time = moment.utc().unix();\\r\\n if (index < total_length + 16) {\\r\\n var keyLengthHex = message.substring(index, index = index + 2);\\r\\n keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n key = message.substring(index, index = index + 2);\\r\\n if (key == '24') {\\r\\n // debug('key: ' + key) //comment those out\\r\\n value = message.substring(index, index = index + keyLength - 2);\\r\\n // debug(value)\\r\\n var timestampHex = value.substring(0, 8);\\r\\n // debug('timestampt hex: ' + timestampHex)\\r\\n timestampHex = changeEndianness(timestampHex);\\r\\n timestamp = hexToDecimal(timestampHex);\\r\\n event_time = timestamp;\\r\\n // debug(event_time)\\r\\n var statusHex = changeEndianness(value.substring(8, 16));\\r\\n // debug(statusHex)\\r\\n var statusInt = hexToDecimal(statusHex);\\r\\n var statusDevice = '';\\r\\n if ((statusInt & 1) == 1) {\\r\\n statusDevice += 'GPS,';\\r\\n }\\r\\n if ((statusInt & 2) == 2) {\\r\\n statusDevice += 'WIFISource,';\\r\\n }\\r\\n if ((statusInt & 4) == 4) {\\r\\n statusDevice += 'CellTower,';\\r\\n }\\r\\n if ((statusInt & 8) == 8) {\\r\\n statusDevice += 'BLELocation,';\\r\\n }\\r\\n if ((statusInt & 16) == 16) {\\r\\n statusDevice += 'Charging,';\\r\\n }\\r\\n if ((statusInt & 32) == 32) {\\r\\n statusDevice += 'FUllyCharged,';\\r\\n }\\r\\n if ((statusInt & 64) == 64) {\\r\\n statusDevice += 'Reboot,';\\r\\n }\\r\\n if ((statusInt & 128) == 128) {\\r\\n statusDevice += 'HistoricalData,';\\r\\n }\\r\\n if ((statusInt & 256) == 256) {\\r\\n statusDevice += 'AGPSDataValid,';\\r\\n }\\r\\n if ((statusInt & 512) == 512) {\\r\\n statusDevice += 'Motion,';\\r\\n }\\r\\n if ((statusInt & 1024) == 1024) {\\r\\n statusDevice += 'SmartLocating,';\\r\\n }\\r\\n if ((statusInt & 2048) == 2048) {\\r\\n statusDevice += 'BeaconLocation,';\\r\\n }\\r\\n if ((statusInt & 4096) == 4096) {\\r\\n statusDevice += 'BLEConnected,';\\r\\n }\\r\\n statusDevice = statusDevice.slice(0, -1);\\r\\n // debug('statusHex:' + statusHex)\\r\\n statusHex = (statusHex);\\r\\n statusHex = hexToBin(statusHex);\\r\\n statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\r\\n // debug(statusHex)\\r\\n battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\r\\n // debug(battery_percentage)\\r\\n // debug(battery_percentage)\\r\\n // debug(statusHex.substring(8, 13))\\r\\n cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\r\\n // debug(cellNetworkSignal)\\r\\n workMode = parseInt(statusHex.substring(13, 16), 2);\\r\\n // debug(workMode)\\r\\n general += 'statusDevice:' + statusDevice + ';';\\r\\n if (battery_percentage) {\\r\\n general += 'battery:' + battery_percentage + ';';\\r\\n }\\r\\n if (cellNetworkSignal) {\\r\\n general += 'cellNetworkSignal:' + cellNetworkSignal + ';';\\r\\n }\\r\\n if (workMode) {\\r\\n general += 'workMode:' + workMode + ';';\\r\\n }\\r\\n }\\r\\n }\\r\\n // revisar\\r\\n var gen_location = '0';\\r\\n messageForReceiver = (`Watch-HTB;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n //messageBody = messageBody + keyLengthHex + key + value;\\r\\n break;\\r\\n case '12': // Device requesting timestamp\\r\\n timestamp = moment.utc().unix();\\r\\n timestampHex = decimalToHex(timestamp);\\r\\n timestampHex = changeEndianness(timestampHex);\\r\\n keyLengthHex = ('00' + decimalToHex(1 + (timestampHex.length) / 2)).slice(-2);\\r\\n // respond to device with the timestamp of the server\\r\\n messageBody = messageBody + keyLengthHex + key + timestampHex;\\r\\n messageForReceiver = `Eview;${imei};${sequenceID};Get timestamp`;\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n break;\\r\\n case '21': //Cell Towers\\r\\n var mccHex = value.substring(0, 2);\\r\\n var mncHex = value.substring(2, 3);\\r\\n var mcc = hexToDecimal(mccHex);\\r\\n var mnc = hexToDecimal(mncHex);\\r\\n var numTowers = (keyLength - 4) / 5;\\r\\n var cellTowers = hexToAscii(value);\\r\\n messageBody = messageBody + keyLengthHex + key + value;\\r\\n break;\\r\\n case '22': // WIFI locations \\r\\n location_type = 'WIFI';\\r\\n var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\r\\n //location_time = timestamp;\\r\\n var wifiTowers = value;\\r\\n general += 'wifiTowers:';\\r\\n var indexWifi = 0;\\r\\n var bssid_array = [];\\r\\n gen_location = '';\\r\\n for (let i = 0; i < numWifi; i++) {\\r\\n gen_location += wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\r\\n indexWifi += 14;\\r\\n }\\r\\n gen_location = gen_location.slice(0, -1);\\r\\n general += gen_location;\\r\\n if (alarmCode) {\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch-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 if (typeof configIds !== 'undefined' && configIds && configIds.ConfigureDevice && configIds.ConfigureDevice.LastConfigured) { // when is defined\\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 }\\r\\n if (command == 'FE') {\\r\\n while (index < total_length + 16) {\\r\\n var keyLength = message.substring(index, index = index + 2);\\r\\n keyLength = 2 * hexToDecimal(keyLength);\\r\\n var key = message.substring(index, index = index + 2);\\r\\n var value = message.substring(index, index = index + keyLength - 2);\\r\\n }\\r\\n }\\r\\n // prepare the ACK msg and change config if it is needed\\r\\n lengthAck = messageBody.length / 2;\\r\\n lengthAck = ('0000' + decimalToHex(lengthAck)).slice(-4);\\r\\n lengthAck = lengthAck.toString().substring(2, 4) + lengthAck.toString().substring(0, 2);\\r\\n ////////////checksum CRC 16\\r\\n var checksumAck = byteStringToByteArray(messageBody);\\r\\n checksumAck = crc16byte(checksumAck);\\r\\n checksumAck = decimalToHex(checksumAck);\\r\\n checksumAck = ('0000' + checksumAck).slice(-4);\\r\\n checksumAck = checksumAck.toString().substring(2, 4) + checksumAck.toString().substring(0, 2);\\r\\n prefix = prefix + lengthAck + checksumAck + sequenceID;\\r\\n // To send ACK to the device previous to internal msg with parts\\r\\n if (needsAck == true) {\\r\\n if (messageBody.length <= 2) {\\r\\n ack = 'AB00030008C7' + sequenceID + '7F0100'; // change AB10030008C7 to AB00030008C7\\r\\n } else {\\r\\n ack = prefix + messageBody;\\r\\n }\\r\\n AddValue(codeValues, 'imei', imei);\\r\\n AddValue(codeValues, 'ack', ack);\\r\\n }\\r\\n } else { // checksum was invalid - print out useful debug info and bet quess at imei \\r\\n AddValue(codeValues, \\\"error\\\", \\\"checksum failed for message\\\");\\r\\n AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n i = rawFromBytes.search('3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]');\\r\\n if (i >= 0) {\\r\\n imei = hexToAscii(rawFromBytes.substring(i, i + 30));\\r\\n AddValue(codeValues, \\\"imei\\\", imei);\\r\\n }\\r\\n }\\r\\n }\\r\\n // Auxiliary functions\\r\\n function buildDataToReceiver(codeValues, configsToAck = [], configsToUpdate = [], configsToSend = []) {\\r\\n const dataToReceiver = {\\r\\n values: codeValues\\r\\n };\\r\\n if (configsToAck.length > 0) {\\r\\n dataToReceiver.configsToAck = configsToAck;\\r\\n }\\r\\n if (configsToUpdate.length > 0) {\\r\\n dataToReceiver.configsToUpdate = configsToUpdate;\\r\\n }\\r\\n if (configsToSend.length > 0) {\\r\\n dataToReceiver.configsToSend = configsToSend;\\r\\n }\\r\\n return dataToReceiver;\\r\\n }\\r\\n\\r\\n function AddValue(codeValueArray, p1, p2) { // push code value pair into array\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n codeValueArray.push(cvpair);\\r\\n }\\r\\n // convert functions\\r\\n function asciiToHex(str) { // ascii to hex \\r\\n return [...str].map(char => char.charCodeAt(0).toString(16).padStart(2, '0')).join('');\\r\\n }\\r\\n\\r\\n function byteStringToByteArray(str) { // convierte una cadena hexadecimal en un array de bytes (number[])\\r\\n const bytes = [];\\r\\n for (let i = 0; i < str.length; i += 2) {\\r\\n const byte = parseInt(str.substring(i, i + 2), 16);\\r\\n if (!isNaN(byte) && byte >= 0 && byte <= 255) {\\r\\n bytes.push(byte);\\r\\n }\\r\\n }\\r\\n return bytes;\\r\\n }\\r\\n\\r\\n function decimalToHex(x) {\\r\\n return Number(x).toString(16).toUpperCase();\\r\\n }\\r\\n\\r\\n function hexToBin(hex) { // convierte un valor hexadecimal a su representación binaria, y asegura que tenga al menos 8 bits \\r\\n const bin = parseInt(hex, 16).toString(2);\\r\\n return bin.padStart(hex.length * 4, '0');\\r\\n }\\r\\n\\r\\n function hexToAscii(hex) {\\r\\n if (hex.length % 2 !== 0) {\\r\\n throw new Error(\\\"Hex string length must be even\\\");\\r\\n }\\r\\n let ascii = '';\\r\\n for (let i = 0; i < hex.length; i += 2) {\\r\\n const byte = hex.substr(i, 2);\\r\\n const charCode = parseInt(byte, 16);\\r\\n if (charCode !== 0) { // remove null character (\\\\u0000)\\r\\n ascii += String.fromCharCode(charCode);\\r\\n }\\r\\n }\\r\\n return ascii;\\r\\n //return hex.match(/.{2}/g).map(byte => String.fromCharCode(parseInt(byte, 16))).join('');\\r\\n }\\r\\n\\r\\n function hexToDecimalSigned(hex) { // hex to decimal\\r\\n if (hex.length % 2 !== 0) {\\r\\n hex = '0' + hex;\\r\\n }\\r\\n const num = parseInt(hex, 16);\\r\\n const bits = hex.length * 4;\\r\\n const maxVal = 2 ** bits;\\r\\n return num >= maxVal / 2 ? num - maxVal : num;\\r\\n }\\r\\n\\r\\n function hexToDecimal(hex) {\\r\\n return parseInt(hex, 16);\\r\\n }\\r\\n // CheckSum and debug functions\\r\\n function changeEndianness(hexString) { // changeEndianness\\r\\n if (hexString.length === 0) { //if string is empty or not defined\\r\\n return \\\"\\\";\\r\\n }\\r\\n if (hexString.length % 2 !== 0) {\\r\\n throw new Error(\\\"Hex string length must be even\\\");\\r\\n }\\r\\n return hexString.match(/.{2}/g) // divide in bytes (2 chars)\\r\\n .reverse() // reverse the order\\r\\n .join('');\\r\\n }\\r\\n\\r\\n function calculateCheckSum(payloadData) { // calcula el CRC16 sobre una cadena hexadecimal y devuelve el valor con el endianness invertido\\r\\n const bytes = byteStringToByteArray(payloadData);\\r\\n const crc = crc16byte(bytes);\\r\\n const hex = crc.toString(16).padStart(4, '0').toUpperCase();\\r\\n return changeEndianness(hex);\\r\\n }\\r\\n\\r\\n function crc16byte(byteArray) { // calcula el CRC-16 sobre un array de bytes usando una tabla precalculada (crcTable)\\r\\n let crc = 0x0000;\\r\\n for (const byte of byteArray) {\\r\\n if (byte < 0 || byte > 255 || !Number.isInteger(byte)) {\\r\\n throw new RangeError(\\\"Invalid byte value in input array\\\");\\r\\n }\\r\\n const index = (byte ^ (crc >> 8)) & 0xFF;\\r\\n crc = crcTable[index] ^ (crc << 8);\\r\\n }\\r\\n return crc & 0xFFFF;\\r\\n }\\r\\n\\r\\n function debug(...args) { // write debug info to console log, if localTesting\\r\\n if (localTesting) {\\r\\n console.debug('[DEBUG]', ...args);\\r\\n }\\r\\n }\\r\\n /*\\r\\n function sendMessageToLocalhostNoWait(str) { // sends message to system, closing connection after\\r\\n var server;\\r\\n if (localTesting) {\\r\\n console.log('local testing - sending to protocol-dev server the message ... '); // port 5878\\r\\n console.log(str);\\r\\n server = '52.174.17.77';\\r\\n } else {\\r\\n server = '127.0.0.1';\\r\\n }\\r\\n var c = net.createConnection(5878, server);\\r\\n c.on('error', function(error) {\\r\\n c = net.createConnection(5878, server);\\r\\n });\\r\\n c.write(`${str}`);\\r\\n c.end();\\r\\n }*/\\r\\n function sendMessageToLocalhostNoWait(message) {\\r\\n const server = localTesting ? '52.174.17.77' : '127.0.0.1';\\r\\n //const port = localTesting ? '5878' : ''; //Protocol-dev\\r\\n const port = '5678'; //acceptance-dev\\r\\n if (localTesting) {\\r\\n console.debug('[DEBUG] Sending message to test server:', message);\\r\\n }\\r\\n const client = net.createConnection(port, server, () => {\\r\\n client.write(message);\\r\\n client.end();\\r\\n });\\r\\n client.on('error', (err) => {\\r\\n console.error(`[ERROR] Failed to send message to ${server}:${port}:`, err.message);\\r\\n });\\r\\n client.on('end', () => {\\r\\n if (localTesting) {\\r\\n console.debug('[DEBUG] Connection closed');\\r\\n }\\r\\n });\\r\\n }\\r\\n}\\r\\n// params is not defined locally -> export as module\\r\\nif (typeof(params) === 'undefined') {\\r\\n module.exports = {\\r\\n execute_ops\\r\\n }\\r\\n} else { // on server use local defined vars\\r\\n let return_values = execute_ops(moment, msg, net, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\r\\n // define global returns\\r\\n msg = return_values;\\r\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1750698902},{"Type":1,"NewValue":"{\"Id\":437,\"Name\":\"Access TEC Care Watch\",\"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 // Watch protocol - please see variables and typical values in order below\\r\\n // Watch-CYC;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;SIGNAL=<>;WM=<>;GENERAL=<>\\r\\n // Watch-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\r\\n //\\r\\n // Author: Juanmi Navarro\\r\\n // Created: 01/01/0000\\r\\n // Last modified: 20/05/2025\\r\\n //\\r\\n ///////////////////////////////////////////////////////////////////////////////\\r\\n if (typeof localTesting === \\\"undefined\\\") {\\r\\n let localTesting = \\\"False\\\";\\r\\n }\\r\\n const crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,\\r\\n 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,\\r\\n 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,\\r\\n 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,\\r\\n 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,\\r\\n 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,\\r\\n 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,\\r\\n 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,\\r\\n 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,\\r\\n 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,\\r\\n 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,\\r\\n 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,\\r\\n 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,\\r\\n 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,\\r\\n 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,\\r\\n 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,\\r\\n 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,\\r\\n 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,\\r\\n 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,\\r\\n 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,\\r\\n 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,\\r\\n 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n ];\\r\\n var codeValues = [];\\r\\n AddValue(codeValues, 'protocol_template', 'Watch');\\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 = (`Watch-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 //<>,<>,<> \\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 //<>,<>,<> \\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 Watch-')) {\\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 = (`Watch-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 = (`Watch;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 = (`Watch;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 = (`Watch-RTL;${params.imei};${location_time};${location_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n break;\\r\\n }\\r\\n if (!params.event_time && !event_time) { // if params.event_time undefined - set it to now. \\r\\n var event_time = moment.utc().unix();\\r\\n AddValue(codeValues, 'event_time', event_time);\\r\\n }\\r\\n // if (!params.location_time && !location_time) { // if params.location_time undefined - set it to now. \\r\\n // var location_time = moment.utc().unix();\\r\\n // AddValue(codeValues, 'location_time', location_time);\\r\\n //}\\r\\n }\\r\\n // send data msg to kibana\\r\\n const data = buildDataToReceiver(codeValues, configsToAck, configsToUpdate, configsToSend);\\r\\n console.log(data);\\r\\n return data\\r\\n // end of main operation\\r\\n // define functions used in operation\\r\\n // decode global msg\\r\\n function decoder(str) { // decode rawdata\\r\\n // CARE Decoder\\r\\n AddValue(codeValues, 'Message : ', str);\\r\\n var message = str;\\r\\n // need to check if checksum is correct for possible msg corruption 10/03/23\\r\\n var checksum = message.substring(8, 12);\\r\\n var messageBody = message.substring(16, message.length);\\r\\n debug('message =' + message);\\r\\n debug('checksum =' + checksum);\\r\\n debug('calculateCheckSum =' + calculateCheckSum(messageBody));\\r\\n if (calculateCheckSum(messageBody) == checksum) { // payload is valid\\r\\n debug(\\\"message has valid checksum\\\");\\r\\n var messageBody = command; // update value for the ACK\\r\\n debug('command =' + command);\\r\\n if (command == '01') {\\r\\n while (index < total_length + 16) {\\r\\n var keyLengthHex = message.substring(index, index = index + 2);\\r\\n var keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n var key = message.substring(index, index = index + 2);\\r\\n var value = message.substring(index, index = index + keyLength - 2);\\r\\n debug('key = ' + key);\\r\\n debug('value = ' + value);\\r\\n switch (key) {\\r\\n //Device ID\\r\\n case '01':\\r\\n var imei = hexToAscii(value);\\r\\n // create long connection if it is needed\\r\\n if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n //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\\r\\n if ((alarmCodeExtInt & 1) == 1) {\\r\\n var alarm = 'ALF-C';\\r\\n }\\r\\n // Welfare Check-out\\r\\n else if ((alarmCodeExtInt & 2) == 2) {\\r\\n var alarm = 'ALA-C';\\r\\n }\\r\\n // Standard Alerts\\r\\n //Battery low\\r\\n else if ((alarmCodeInt & 1) == 1) {\\r\\n var alarm = 'BATL';\\r\\n }\\r\\n //Overspeed\\r\\n else if ((alarmCodeInt & 2) == 2) {\\r\\n var alarm = 'ALSP';\\r\\n }\\r\\n //Fall\\r\\n else if ((alarmCodeInt & 4) == 4) {\\r\\n var alarm = 'ALF';\\r\\n }\\r\\n //Tilt\\r\\n else if ((alarmCodeInt & 8) == 8) {\\r\\n var alarm = 'Tilt';\\r\\n } else if ((alarmCodeInt & 16) == 16) {\\r\\n if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n var alarm = 'Geo1-IN';\\r\\n } else {\\r\\n var alarm = 'Geo1-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 32) == 32) {\\r\\n if ((alarmCodeInt & 33554432) == 33554432) {\\r\\n var alarm = 'Geo2-IN';\\r\\n } else {\\r\\n var alarm = 'Geo2-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 64) == 64) {\\r\\n if ((alarmCodeInt & 67108864) == 67108864) {\\r\\n var alarm = 'Geo3-IN';\\r\\n } else {\\r\\n var alarm = 'Geo3-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 128) == 128) {\\r\\n if ((alarmCodeInt & 134217728) == 134217728) {\\r\\n var alarm = 'Geo4-IN';\\r\\n } else {\\r\\n var alarm = 'Geo4-OUT';\\r\\n }\\r\\n }\\r\\n //Power Off\\r\\n else if ((alarmCodeInt & 256) == 256) {\\r\\n var alarm = 'PWRF';\\r\\n }\\r\\n //Power On\\r\\n else if ((alarmCodeInt & 512) == 512) {\\r\\n var alarm = 'PWRN';\\r\\n }\\r\\n //Motion\\r\\n else if ((alarmCodeInt & 1024) == 1024) {\\r\\n var alarm = 'ALMOV';\\r\\n }\\r\\n //No Motion\\r\\n else if ((alarmCodeInt & 2048) == 2048) {\\r\\n var alarm = 'ALNM';\\r\\n }\\r\\n //SOS\\r\\n else if ((alarmCodeInt & 4096) == 4096) {\\r\\n var alarm = 'ALSOS';\\r\\n } else if ((alarmCodeInt & 8192) == 8192) {\\r\\n var alarm = 'Side1';\\r\\n } else if ((alarmCodeInt & 16384) == 16384) {\\r\\n var alarm = 'Side2';\\r\\n }\\r\\n //Battery charging\\r\\n else if ((alarmCodeInt & 32768) == 32768) {\\r\\n var alarm = 'BATCN';\\r\\n }\\r\\n //Battery no charging\\r\\n else if ((alarmCodeInt & 65536) == 65536) {\\r\\n var alarm = 'BATCF';\\r\\n }\\r\\n //SOS Ending\\r\\n // Temporary Commented until we know exactly how it works. 22/09/2022\\r\\n else if ((alarmCodeInt & 131072) == 131072) {\\r\\n var alarm = 'SOSEnding';\\r\\n info = 'Alarm Finished';\\r\\n }\\r\\n //Amber Alert EC03 only\\r\\n else if ((alarmCodeInt & 262144) == 262144) {\\r\\n var alarm = 'ALAO';\\r\\n }\\r\\n // welfare Alert check-in ALA-O\\r\\n else if ((alarmCodeInt & 524288) == 524288) {\\r\\n var alarm = 'ALA-O';\\r\\n }\\r\\n // Amber alert Ending ALA-C\\r\\n else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n var alarm = 'ALA-C';\\r\\n }\\r\\n // Amber alert Ending ALA-C\\r\\n //else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n // var alarm = 'ALA-C';\\r\\n //}\\r\\n // Fall-Down Alert ending\\r\\n else if ((alarmCodeInt & 2097152) == 2097152) {\\r\\n var alarm = 'ALF-C';\\r\\n }\\r\\n // welfare Alert Ending ALA\\r\\n else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n var alarm = 'ALA';\\r\\n }\\r\\n // Beacon absent Alert 11/10/22. Need to be added in msg types\\r\\n //else if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n // var alarm = 'BEA';\\r\\n //}\\r\\n general += 'alarm:' + alarm + ',';\\r\\n break;\\r\\n //Custom ID\\r\\n case '03':\\r\\n customID = value;\\r\\n var allowedCID = ['3036', '06'];\\r\\n if (!allowedCID.includes(value)) {\\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 //<>,<>,<>,<>,<>\\r\\n gps_data = `${latitude},${longitude},${location_accuracy},${speed},${direction},${altitude},${satellites},${mileage}`;\\r\\n general += 'gps location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n break;\\r\\n //WIFI Towers\\r\\n case '22':\\r\\n location_type = 'WIFI';\\r\\n var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\r\\n //location_time = timestamp;\\r\\n var wifiTowers = value;\\r\\n general += 'wifiTowers:';\\r\\n var indexWifi = 0;\\r\\n var bssid_array = [];\\r\\n wifi_data = '';\\r\\n for (let i = 0; i < numWifi; i++) {\\r\\n wifi_data += hexToDecimalSigned(wifiTowers.substring(indexWifi, indexWifi + 2)) + ',' + wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\r\\n indexWifi += 14;\\r\\n }\\r\\n wifi_data = wifi_data.slice(0, -1);\\r\\n general += wifi_data;\\r\\n break;\\r\\n //BLE Location Added 10/10/22\\r\\n case '23':\\r\\n location_type = 'BLE';\\r\\n var mac = value.substring(0, 12);\\r\\n var latitudeHex = value.substring(12, 20);\\r\\n var longitudeHex = value.substring(20, 28);\\r\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n var address = hexToAscii(value.substring(28, value.length));\\r\\n var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n // add : format in MAC\\r\\n mac = mac.match(/.{1,2}/g).join(':');\\r\\n // location_time = timestamp;\\r\\n ble_data = `${latitude},${longitude},${mac},${address}`;\\r\\n general += 'BLE location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n break;\\r\\n //General Data , status_data\\r\\n case '24':\\r\\n //const allowedCID = ['3036', '06'];\\r\\n if (!allowedCID.includes(customID)) {\\r\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n AddValue(codeValues, \\\"customID\\\", customID);\\r\\n return\\r\\n }\\r\\n if (alarmCode) {\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n }\\r\\n //else {\\r\\n // messageForReceiver = (`CareWatch-CYC;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};`);\\r\\n //}\\r\\n // reset variables\\r\\n //alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n var timestampHex = value.substring(0, 8);\\r\\n timestampHex = changeEndianness(timestampHex);\\r\\n timestamp = hexToDecimal(timestampHex);\\r\\n location_time = timestamp;\\r\\n event_time = timestamp;\\r\\n // HardCode to fix possible issue in protocol\\r\\n //event_time = moment.utc().unix();\\r\\n // end of hard code\\r\\n var statusHex = changeEndianness(value.substring(8, 16));\\r\\n var statusInt = hexToDecimal(statusHex);\\r\\n var statusDevice = '';\\r\\n if ((statusInt & 1) == 1) {\\r\\n statusDevice += 'GPS,';\\r\\n }\\r\\n if ((statusInt & 2) == 2) {\\r\\n statusDevice += 'WIFISource,';\\r\\n }\\r\\n if ((statusInt & 4) == 4) {\\r\\n statusDevice += 'CellTower,';\\r\\n }\\r\\n if ((statusInt & 8) == 8) {\\r\\n statusDevice += 'BLELocation,';\\r\\n }\\r\\n //params.BatteryStatus.BatteryStatus = '1';\\r\\n if ((statusInt & 16) == 16) {\\r\\n statusDevice += 'Charging,';\\r\\n // var alarm = 'BATCN';\\r\\n //configs.BatteryStatus.BatteryStatus = '1';\\r\\n /* if (configs.BatteryStatus.BatteryStatus !== '1') {\\r\\n hasConfigs = true;\\r\\n var batteryStatus = '1';\\r\\n var alarm = 'BATCN';\\r\\n let configsToUpdate = [];\\r\\n configsToUpdate.push({\\r\\n 'code': configIds.BatteryStatus.BatteryStatus,\\r\\n 'value': batteryStatus\\r\\n });\\r\\n }*/\\r\\n }\\r\\n if ((statusInt & 32) == 32) {\\r\\n statusDevice += 'FUllyCharged,';\\r\\n //var alarm = 'BATF';\\r\\n // configs.BatteryStatus.BatteryStatus = '3';\\r\\n /* if (configs.BatteryStatus.BatteryStatus !== '3') {\\r\\n hasConfigs = true;\\r\\n var batteryStatus = '3';\\r\\n var alarm = 'BATF';\\r\\n let configsToUpdate = [];\\r\\n configsToUpdate.push({\\r\\n 'code': configIds.BatteryStatus.BatteryStatus,\\r\\n 'value': batteryStatus\\r\\n });\\r\\n }*/\\r\\n }\\r\\n /* if (!((statusInt & 32) == 32) & !((statusInt & 16) == 16)) {\\r\\n statusDevice += 'Not Charging,';\\r\\n var alarm = 'BATCF';\\r\\n //configs.BatteryStatus.BatteryStatus = '2';\\r\\n if (configs.BatteryStatus.BatteryStatus !== '2') {\\r\\n var batteryStatus = '2';\\r\\n var alarm = 'BATCF';\\r\\n let configsToUpdate = [];\\r\\n configsToUpdate.push({\\r\\n 'code': configIds.BatteryStatus.BatteryStatus,\\r\\n 'value': batteryStatus\\r\\n });\\r\\n }\\r\\n }*/\\r\\n if ((statusInt & 64) == 64) {\\r\\n statusDevice += 'Reboot,';\\r\\n }\\r\\n if ((statusInt & 128) == 128) {\\r\\n statusDevice += 'HistoricalData,';\\r\\n }\\r\\n if ((statusInt & 256) == 256) {\\r\\n statusDevice += 'AGPSDataValid,';\\r\\n }\\r\\n if ((statusInt & 512) == 512) {\\r\\n statusDevice += 'Motion,';\\r\\n }\\r\\n if ((statusInt & 1024) == 1024) {\\r\\n statusDevice += 'SmartLocating,';\\r\\n }\\r\\n if ((statusInt & 2048) == 2048) { //isHome\\r\\n statusDevice += 'BeaconLocation,';\\r\\n }\\r\\n if ((statusInt & 4096) == 4096) {\\r\\n statusDevice += 'BLEConnected,';\\r\\n }\\r\\n if ((statusInt & 16384) == 16384) {\\r\\n statusDevice += 'HomeWiFi,';\\r\\n }\\r\\n statusDevice = statusDevice.slice(0, -1);\\r\\n status_data = statusDevice; //to oysta template\\r\\n //statusHex = (statusHex);\\r\\n statusHex = hexToBin(statusHex);\\r\\n statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\r\\n battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\r\\n cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\r\\n workMode = parseInt(statusHex.substring(13, 16), 2);\\r\\n general += 'statusDevice:' + statusDevice + ',';\\r\\n if (battery_percentage) {\\r\\n general += 'battery:' + battery_percentage + ',';\\r\\n }\\r\\n if (cellNetworkSignal) {\\r\\n general += 'cellNetworkSignal:' + cellNetworkSignal + ',';\\r\\n }\\r\\n if (workMode) {\\r\\n general += 'workMode:' + workMode + ',';\\r\\n }\\r\\n //messageForReceiver = (`CareWatch-CYC;${imei};${i};${event_time};${battery_percentage}`);\\r\\n break;\\r\\n //Call Records\\r\\n case '25':\\r\\n //Needed?\\r\\n break;\\r\\n //BLE Location 2\\r\\n case '26':\\r\\n //I don't understand\\r\\n //messageBody = messageBody + keyLengthHex + key + value;\\r\\n break;\\r\\n //Smart Location\\r\\n case '27':\\r\\n location_type = 'SMART';\\r\\n var latitudeHex = value.substring(0, 8);\\r\\n var longitudeHex = value.substring(8, 16);\\r\\n var location_accuracyHex = value.substring(16, 20);\\r\\n var altitudeHex = value.substring(20, 24);\\r\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n var altitude = hexToDecimal(changeEndianness(altitudeHex));\\r\\n //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\r\\n //04/08/2022 se quita el multiplicador por 5 pq ya viene el valor en metros\\r\\n location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\r\\n //location_time = timestamp;\\r\\n smart_data = `${latitude},${longitude},${location_accuracy},${altitude}`;\\r\\n general += 'smart location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n break;\\r\\n //Beacon Location Added 11/10/22\\r\\n case '28':\\r\\n location_type = 'BEACON';\\r\\n // var alarm = 'EBZI';\\r\\n var latitudeHex = '00';\\r\\n var longitudeHex = '00';\\r\\n var descr = 'empty';\\r\\n var flag = hexToDecimal(value.substring(0, 1));\\r\\n var beacId = hexToDecimal(value.substring(1, 2));\\r\\n // msg includes descrip\\r\\n if ((flag & 4) == 4) {\\r\\n descr = hexToAscii(value.substring(18, value.length));\\r\\n }\\r\\n // msg includes lat/lon\\r\\n if ((flag & 8) == 8) {\\r\\n latitudeHex = value.substring(18, 26);\\r\\n longitudeHex = value.substring(26, 34);\\r\\n }\\r\\n // msg includes lat/lon and description\\r\\n if ((flag & 12) == 12) {\\r\\n latitudeHex = value.substring(18, 26);\\r\\n longitudeHex = value.substring(26, 34);\\r\\n descr = hexToAscii(value.substring(34, value.length));\\r\\n }\\r\\n var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n // add : format in MAC\\r\\n mac = mac.match(/.{1,2}/g).join(':');\\r\\n var rssiHex = value.substring(14, 16);\\r\\n var rssi1Hex = value.substring(16, 18);\\r\\n rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\r\\n rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\r\\n // var latitudeHex = value.substring(18, 26);\\r\\n // var longitudeHex = value.substring(26, 34);\\r\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n //location_time = timestamp;\\r\\n beacon_data = `${latitude},${longitude},${mac},${descr}`;\\r\\n general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (listIndex):' + beacId + ',';\\r\\n break;\\r\\n // Beacon V2\\r\\n case '2C':\\r\\n location_type = 'BEACON';\\r\\n // var alarm = 'EBZI';\\r\\n var latitudeHex = '00';\\r\\n var longitudeHex = '00';\\r\\n var descr = 'empty';\\r\\n var flag = hexToDecimal(value.substring(0, 1));\\r\\n var beacId = hexToDecimal(value.substring(1, 2));\\r\\n // msg includes descrip\\r\\n if ((flag & 4) == 4) {\\r\\n let desc_leng = hexToDecimal(value.substring(20, 22));\\r\\n descr = hexToAscii(value.substring(22, 22 + (2 * desc_leng)));\\r\\n //descr = hexToAscii(value.substring(18, value.length));\\r\\n }\\r\\n // msg includes lat/lon\\r\\n if ((flag & 8) == 8) {\\r\\n latitudeHex = value.substring(18, 26);\\r\\n longitudeHex = value.substring(26, 34);\\r\\n }\\r\\n // msg includes lat/lon and description\\r\\n if ((flag & 12) == 12) {\\r\\n latitudeHex = value.substring(20, 28);\\r\\n longitudeHex = value.substring(28, 36);\\r\\n let desc_leng = hexToDecimal(value.substring(36, 38));\\r\\n descr = hexToAscii(value.substring(38, 38 + (2 * desc_leng)));\\r\\n }\\r\\n var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n // add : format in MAC\\r\\n mac = mac.match(/.{1,2}/g).join(':');\\r\\n var rssiHex = value.substring(14, 16);\\r\\n var rssi1Hex = value.substring(16, 18);\\r\\n rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\r\\n rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\r\\n var battery_beacon = hexToDecimal(value.substring(18, 20));\\r\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n //location_time = timestamp;\\r\\n beacon_data = `${latitude},${longitude},${mac},${descr}`;\\r\\n general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (battery):' + battery_beacon + ', (listIndex):' + beacId + ',';\\r\\n break;\\r\\n //Cell Towers Note\\r\\n case '29':\\r\\n location_type = 'LBS';\\r\\n lbs_data = '';\\r\\n var mccHex = changeEndianness(value.substring(0, 4));\\r\\n var mncHex = value.substring(4, 6);\\r\\n var mcc = hexToDecimal(mccHex);\\r\\n lbs_data += mcc + ',';\\r\\n var mnc = hexToDecimal(mncHex);\\r\\n lbs_data += mnc + ',';\\r\\n var indexLbs = 6;\\r\\n var numTowers = (hexToDecimal(keyLengthHex) - 4) / 7;\\r\\n for (let i = 0; i < numTowers; i++) {\\r\\n var rxlHex = changeEndianness(value.substring(indexLbs, indexLbs + 2));\\r\\n var rxl = hexToDecimal(rxlHex);\\r\\n var lacHex = changeEndianness(value.substring(indexLbs + 2, indexLbs + 6));\\r\\n var lac = hexToDecimal(lacHex);\\r\\n var cellTowers = hexToDecimal(changeEndianness(value.substring(indexLbs + 6, indexLbs + 14)));\\r\\n lbs_data += rxl + ',' + lac + ',' + cellTowers + ',';\\r\\n indexLbs += 14;\\r\\n }\\r\\n lbs_data = lbs_data.slice(0, -1);\\r\\n general += lbs_data;\\r\\n break;\\r\\n case '30':\\r\\n //G-sensor.\\r\\n 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 = (`Watch-${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 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 = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n }\\r\\n break;\\r\\n //BLE Connected . For Flic button\\r\\n case '62':\\r\\n location_type = 'BLE';\\r\\n //var alarm = 'EBZI'; \\r\\n //var latitudeHex = '00';\\r\\n //var longitudeHex = '00';\\r\\n //var descr = 'empty';\\r\\n var flag = hexToDecimal(value.substring(0, 2)); // 0= Disconnected, 1= Connected\\r\\n var mac = value.substring(2, 14); // No hace falta darle la vuelta\\r\\n // add : format in MAC\\r\\n mac = mac.match(/.{1,2}/g).join(':');\\r\\n var batLevel = hexToDecimal(value.substring(14, 16)); // 0-100\\r\\n //location_time = timestamp;\\r\\n ble_data = `${flag},${batLevel},${mac}`;\\r\\n general += 'BLE location (State):' + flag + ', (bat):' + batLevel + ', (mac):' + mac + ',';\\r\\n break;\\r\\n }\\r\\n }\\r\\n if (alarmCode) {\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch;ACK-FIRM;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\r\\n //AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\r\\n configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\r\\n //configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\r\\n //messageBody = messageBody + keyLengthHex + key + value;\\r\\n break;\\r\\n case '1A':\\r\\n //no ACK need\\r\\n var fwVersion = hexToAscii(value);\\r\\n imei = serverParams.Imei;\\r\\n AddValue(codeValues, \\\"imei\\\", imei);\\r\\n AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\r\\n messageForReceiver = (`Watch;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 = (`Watch;ACK-VOL;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"Volume\\\", volume);\\r\\n AddValue(configsToUpdate, configIds.ReadSystemSettings.Volume, volume);\\r\\n configsToAck.push(configIds.ReadSystemSettings.Volume);\\r\\n break;\\r\\n case '0A': //Performance mode\\r\\n //var workMode = hexToDecimal(value);\\r\\n //messageBody = messageBody + keyLengthHex + key + value;\\r\\n //AddValue(codeValues, \\\"WorkMode\\\", workMode);\\r\\n //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\r\\n //configsToAck.push(configIds.ReadPerformance`Settings.Mode);\\r\\n //var workMode = hexToAscii(value.substring(0, value.length));\\r\\n //var workMode = hexToDecimal(value);\\r\\n //var workMode = hexToAscii(value.substring(0, value.length));\\r\\n var workMode = 1234; // + value + \\\"end\\\";\\r\\n //var workModeVal = 9;\\r\\n //workMode = 'test10';\\r\\n imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;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 '0F': // Enable control.... Used for STEP COUNTING SETTINGS\\r\\n // 'FF FF 21 80'\\r\\n var StepStatus = hexToBin(value.substring(4, 6));\\r\\n var enalbleDisable = '';\\r\\n if (StepStatus.substring(7, 8) == '1') {\\r\\n var step = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var step = 'Disable, '\\r\\n };\\r\\n //var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n //hrate += detectingInterval;\\r\\n AddValue(codeValues, \\\"step\\\", step);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadStepsSettings.EnableDisableReadStepsSettings, enalbleDisable);\\r\\n //AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadStepsSettings.EnableDisableReadStepsSettings);\\r\\n //configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\r\\n break;\\r\\n case '1B':\\r\\n //Decimal o ascii?\\r\\n var gsmModule = hexToDecimal(value);\\r\\n messageBody = messageBody + keyLengthHex + key + value;\\r\\n break;\\r\\n case '1F':\\r\\n //System Language\\r\\n var systemLanguage = hexToAscii(value.substring(0, value.length));\\r\\n imei = serverParams.Imei;\\r\\n //messageBody = messageBody + keyLengthHex + key + value;\\r\\n messageForReceiver = (`Watch;ACK-LANG;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"SystemLanguage\\\", systemLanguage);\\r\\n AddValue(configsToUpdate, configIds.ReadSystemSettings.SystemLanguage, systemLanguage);\\r\\n configsToAck.push(configIds.ReadSystemSettings.SystemLanguage);\\r\\n break;\\r\\n case '33': // phone option\\r\\n // [Value]:83 0B 00 00 {\\\"phoneOption\\\":{\\\"flag_value\\\":2947,\\\"s3\\\":1,\\\"s4\\\":0,\\\"s5\\\":1,\\\"s6\\\":0,\\\"callIncoming\\\":0,\\\"rings\\\":3,\\\"s7\\\":0,\\\"toneID\\\":0,\\\"s1\\\":1,\\\"s2\\\":1}}\\r\\n var statusPhone = hexToBin(value.substring(0, 2)); // To find autoanswer setup\\r\\n if (statusPhone.substring(0, 1) == '1') { // 1 Enable\\r\\n var auto = 'true';\\r\\n } else var auto = 'false';\\r\\n statusPhone = hexToBin(value.substring(2, 4)); // To find allow list setup\\r\\n if (statusPhone.substring(7, 8) == '1') { // 1 Enable\\r\\n allow = 'true';\\r\\n } else var allow = 'false';\\r\\n //statusPhone = hexToBin(value.substring(0, 2)) + hexToBin(value.substring(2, 4));\\r\\n //AddValue(configsToUpdate, configIds.ReadSystemSettings.Statusphone, statusPhone);\\r\\n AddValue(configsToUpdate, configIds.ReadSystemSettings.AllowList, allow);\\r\\n AddValue(configsToUpdate, configIds.ReadSystemSettings.AutoAnswer, auto);\\r\\n //configsToAck.push(configIds.ReadSystemSettings.Statusphone);\\r\\n configsToAck.push(configIds.ReadSystemSettings.AllowList);\\r\\n configsToAck.push(configIds.ReadSystemSettings.AutoAnswer);\\r\\n break;\\r\\n case '34': //ContactList with name\\r\\n var contactNumber = value.substring(1, 2);\\r\\n var telLength = hexToDecimal(value.substring(2, 4));\\r\\n var tel = '';\\r\\n switch (contactNumber) {\\r\\n // Emergency Number\\r\\n case '0':\\r\\n tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\r\\n AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n break;\\r\\n // Speed Dial Number\\r\\n //case '1':\\r\\n // tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\r\\n // AddValue(codeValues, \\\"SpeedDialNumber\\\", tel);\\r\\n // AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.SpeedDialNumber, tel);\\r\\n // configsToAck.push(configIds.ReadSpeedDialSettings.SpeedDialNumber);\\r\\n // break;\\r\\n // Gateway Number\\r\\n case '9': //00447781482635,Esendex UK 0034627177148,Esendex Spain 00447507288240,Esendex UK Acceptance\\r\\n tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\r\\n if (tel.includes('447781482635') || tel.includes('00447781482635')) {\\r\\n tel = 'Esendex UK'\\r\\n } else if (tel.includes('34627177148') || tel.includes('0034627177148')) {\\r\\n tel = 'Esendex Spain'\\r\\n } else if (tel.includes('447507288240') || tel.includes('00447507288240')) {\\r\\n tel = 'Esendex UK Acceptance'\\r\\n } else {\\r\\n tel = 'Default'\\r\\n }\\r\\n AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n break;\\r\\n default:\\r\\n tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\r\\n if (tel.length < 6) {\\r\\n contacts += '';\\r\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n break;\\r\\n }\\r\\n //contacts += 'A' + (contactNumber - 1) + ': ' + tel + ', ';\\r\\n contacts += tel + ', ';\\r\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n break;\\r\\n }\\r\\n break;\\r\\n case '40': // APN\\r\\n //no ACK need\\r\\n AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'));\\r\\n configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\r\\n var apn = hexToAscii(value.substring(0, value.length));\\r\\n imei = serverParams.Imei;\\r\\n break;\\r\\n case '41': // APN Username\\r\\n //no ACK need\\r\\n //apn = apn + ',' + hexToAscii(value.substring(0, value.length));\\r\\n break;\\r\\n case '42': // APN Password\\r\\n //no ACK need\\r\\n //apn = apn + ',' + hexToAscii(value.substring(0, value.length));\\r\\n messageForReceiver = (`Watch;ACK-GDATA;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"apn\\\", apn);\\r\\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.APN, apn);\\r\\n configsToAck.push(configIds.ReadCommunicationSettings.APN);\\r\\n break;\\r\\n case '43': //Server Details\\r\\n //52.232.85.255,5678 production 52.174.17.77,5678 acceptance\\r\\n var serverDetails = hexToAscii(value.substring(6, value.length)) + ':' + hexToDecimal(value.substring(4, 6) + value.substring(2, 4));\\r\\n if (serverDetails.includes('52.232.85.255:5678')) {\\r\\n serverDetails = 'Production'\\r\\n } else if (serverDetails.includes('52.174.17.77:5678')) {\\r\\n serverDetails = 'Acceptance'\\r\\n } else if (serverDetails.includes('52.174.17.77:5778')) {\\r\\n serverDetails = 'Protocol-Import'\\r\\n } else if (serverDetails.includes('52.174.17.77:5878')) {\\r\\n serverDetails = 'Protocol-Dev'\\r\\n } else {\\r\\n serverDetails = 'Default'\\r\\n }\\r\\n AddValue(codeValues, \\\"server\\\", serverDetails);\\r\\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.Server, serverDetails);\\r\\n configsToAck.push(configIds.ReadCommunicationSettings.Server);\\r\\n break;\\r\\n case '44': //time interval - work mode intervals\\r\\n imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;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 '46': //HeartRate\\r\\n // '10 0E 00 80'\\r\\n var HeartRateStatus = hexToBin(value.substring(6, 8));\\r\\n var enalbleDisable = '';\\r\\n if (HeartRateStatus.substring(0, 1) == '1') {\\r\\n var hrate = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var hrate = 'Disable, '\\r\\n };\\r\\n var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n hrate += detectingInterval;\\r\\n AddValue(codeValues, \\\"hrate\\\", hrate);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings);\\r\\n configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\r\\n break;\\r\\n case '47': // Custom Id\\r\\n imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;ACK-CUSTID;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"customeid\\\", value);\\r\\n AddValue(configsToUpdate, configIds.ReadState.CustomId, hexToAscii(value)); //now it comes \\\"3036\\\"\\r\\n configsToAck.push(configIds.ReadState.CustomId);\\r\\n break;\\r\\n case '53': // Non motion alert\\r\\n //2B020080\\r\\n var status = hexToBin(value.substring(6, 8));\\r\\n var alertSetting = '';\\r\\n var enableDisable = '';\\r\\n if (status.substring(0, 1) == '1') {\\r\\n alertSetting = 'Enable, '\\r\\n enableDisable = '1';\\r\\n } else {\\r\\n alertSetting = 'Disable, '\\r\\n };\\r\\n //if (status.substring(5, 6) == '1') {\\r\\n // alertSetting += 'Dial, '\\r\\n //} else {\\r\\n // alertSetting += 'No Dial, '\\r\\n //};\\r\\n var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\r\\n alertSetting += time;\\r\\n imei = serverParams.Imei;\\r\\n // commented until Eview fixes this function\\r\\n /*\\r\\n messageForReceiver = (`Watch;ACK-NOMOTION;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"nomotion\\\", alertSetting);\\r\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings, enableDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n configsToAck.push(configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings);\\r\\n configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n */\\r\\n break;\\r\\n case '56': //Fall down sensibility\\r\\n // '00001100'\\r\\n var fallStatus = hexToBin(value.substring(0, 2));\\r\\n var enalbleDisable = '';\\r\\n //if (fallStatus.substring(4, 5) == '1') {\\r\\n if (fallStatus.substring(0, 1) == '1') {\\r\\n var sensibility = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var sensibility = 'Disable, '\\r\\n };\\r\\n if (fallStatus.substring(5, 6) == '1') {\\r\\n sensibility += 'Dial, '\\r\\n } else {\\r\\n sensibility += 'No Dial, '\\r\\n };\\r\\n var imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;ACK-FALLALERT;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n var sesibityOptionValue = hexToDecimal(value.substring(1, 2));\\r\\n sensibility += sesibityOptionValue;\\r\\n AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n //AddValue(configsToUpdate, configIds.ReadAlertSettings.FallSettings, sensibility);\\r\\n AddValue(configsToUpdate, configIds.ReadFallSettings.EnableDisableFallSettings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadFallSettings.Sensitivity, sesibityOptionValue);\\r\\n //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n configsToAck.push(configIds.ReadFallSettings.EnableDisableFallSettings);\\r\\n configsToAck.push(configIds.ReadFallSettings.Sensitivity);\\r\\n break;\\r\\n case '73': //BeaconList\\r\\n var beaconNumber = hexToDecimal(value.substring(1, 2));\\r\\n var beaconStatus = hexToBin(value.substring(0, 1));\\r\\n beaconStatus = hexToAscii(value.substring(30, value.length));\\r\\n //beaconStatus = changeEndianness(value.substring(30, value.length));\\r\\n //homeBeacon += 'B' + (beaconNumber + 1) + ': ' + beaconStatus + ', ';\\r\\n homeBeacon += beaconStatus + ', ';\\r\\n AddValue(codeValues, \\\"homeBeacon\\\", homeBeacon);\\r\\n messageForReceiver = (`Watch;ACK-GDATA;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n break;\\r\\n case '4A': //Wifi Network List\\r\\n var wifiSSIDLenght = hexToDecimal(value.substring(2, 4));\\r\\n var wifiPasswordLenght = hexToDecimal(value.substring(4, 6));\\r\\n var wifiIndex = hexToDecimal(value.substring(1, 2));\\r\\n //var wifiStatus = hexToDecimal(value.substring(0, 1));\\r\\n var wifiStatus = value.substring(0, 1);\\r\\n /*var enalbleDisable = wifiSSID = wifiPassword = homeWifi = '';\\r\\n /var homeWifi = '';\\r\\n if (wifiIndex == '0') { // Only first Wifi of the list\\r\\n if (wifiStatus == '8') {\\r\\n homeWifi += ' Enable, '\\r\\n enalbleDisable = '1';\\r\\n } else {\\r\\n homeWifi += ' Disable, '\\r\\n //enalbleDisable = '0';\\r\\n };*/\\r\\n if ((wifiStatus == '8') || (wifiStatus == 'C')) { // 8 == ON OR C== ON and Connected\\r\\n var wifiSSID = hexToAscii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\r\\n var wifiPassword = hexToAscii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\r\\n var imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;ACK-WIFI;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n //homeWiFi += 'W' + (wifiIndex + 1) + ': ' + wifiSSID + ', ' + wifiPassword + ';';\\r\\n homeWiFi += wifiSSID + ', ' + wifiPassword + ';';\\r\\n AddValue(codeValues, \\\"wifi\\\", homeWiFi);\\r\\n AddValue(configsToUpdate, configIds.ReadWiFiList.WiFiList, homeWiFi);\\r\\n configsToAck.push(configIds.ReadWiFiList.WiFiList);\\r\\n }\\r\\n //AddValue(configsToUpdate, configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings, enalbleDisable);\\r\\n //AddValue(configsToUpdate, configIds.ReadWiFiSettings.SSID, wifiSSID);\\r\\n //AddValue(configsToUpdate, configIds.ReadWiFiSettings.Password, wifiPassword);\\r\\n //configsToAck.push(configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings);\\r\\n //configsToAck.push(configIds.ReadWiFiSettings.SSID);\\r\\n //configsToAck.push(configIds.ReadWiFiSettings.Password);\\r\\n break;\\r\\n case '21': // Speed Dial Settings\\r\\n // [Value]:53 84 {\\\"call1Button\\\":{\\\"mode\\\":0,\\\"feedBack\\\":3,\\\"task\\\":2,\\\"time\\\":20,\\\"status\\\":1}}\\r\\n var status = hexToBin(value.substring(2, 4)); //always pass 2 HEXs to this function\\r\\n var alertSetting = '';\\r\\n var enalbleDisable = '';\\r\\n if (status.substring(0, 1) == '1') {\\r\\n alertSetting = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n alertSetting = 'Disable, '\\r\\n //enableDisable = '0';\\r\\n };\\r\\n //var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\r\\n //alertSetting += time;\\r\\n imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;ACK-SPEED;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"speed\\\", alertSetting);\\r\\n AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\r\\n configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n break;\\r\\n }\\r\\n }\\r\\n }\\r\\n if (command == '03') {\\r\\n while (index < total_length + 16) {\\r\\n var keyLengthHex = message.substring(index, index = index + 2);\\r\\n var keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n var key = message.substring(index, index = index + 2);\\r\\n var value = message.substring(index, index = index + keyLength - 2);\\r\\n debug('key = ' + key);\\r\\n debug('value = ' + value);\\r\\n switch (key) {\\r\\n case '01': // Device ID\\r\\n var imei = hexToAscii(value);\\r\\n // create long connection if it is needed\\r\\n if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n //return;\\r\\n }\\r\\n break;\\r\\n case '10': // Heartbeat\\r\\n var heartbeat = hexToAscii(value);\\r\\n event_time = moment.utc().unix();\\r\\n if (index < total_length + 16) {\\r\\n var keyLengthHex = message.substring(index, index = index + 2);\\r\\n keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n key = message.substring(index, index = index + 2);\\r\\n if (key == '24') {\\r\\n // debug('key: ' + key) //comment those out\\r\\n value = message.substring(index, index = index + keyLength - 2);\\r\\n // debug(value)\\r\\n var timestampHex = value.substring(0, 8);\\r\\n // debug('timestampt hex: ' + timestampHex)\\r\\n timestampHex = changeEndianness(timestampHex);\\r\\n timestamp = hexToDecimal(timestampHex);\\r\\n event_time = timestamp;\\r\\n // debug(event_time)\\r\\n var statusHex = changeEndianness(value.substring(8, 16));\\r\\n // debug(statusHex)\\r\\n var statusInt = hexToDecimal(statusHex);\\r\\n var statusDevice = '';\\r\\n if ((statusInt & 1) == 1) {\\r\\n statusDevice += 'GPS,';\\r\\n }\\r\\n if ((statusInt & 2) == 2) {\\r\\n statusDevice += 'WIFISource,';\\r\\n }\\r\\n if ((statusInt & 4) == 4) {\\r\\n statusDevice += 'CellTower,';\\r\\n }\\r\\n if ((statusInt & 8) == 8) {\\r\\n statusDevice += 'BLELocation,';\\r\\n }\\r\\n if ((statusInt & 16) == 16) {\\r\\n statusDevice += 'Charging,';\\r\\n }\\r\\n if ((statusInt & 32) == 32) {\\r\\n statusDevice += 'FUllyCharged,';\\r\\n }\\r\\n if ((statusInt & 64) == 64) {\\r\\n statusDevice += 'Reboot,';\\r\\n }\\r\\n if ((statusInt & 128) == 128) {\\r\\n statusDevice += 'HistoricalData,';\\r\\n }\\r\\n if ((statusInt & 256) == 256) {\\r\\n statusDevice += 'AGPSDataValid,';\\r\\n }\\r\\n if ((statusInt & 512) == 512) {\\r\\n statusDevice += 'Motion,';\\r\\n }\\r\\n if ((statusInt & 1024) == 1024) {\\r\\n statusDevice += 'SmartLocating,';\\r\\n }\\r\\n if ((statusInt & 2048) == 2048) {\\r\\n statusDevice += 'BeaconLocation,';\\r\\n }\\r\\n if ((statusInt & 4096) == 4096) {\\r\\n statusDevice += 'BLEConnected,';\\r\\n }\\r\\n statusDevice = statusDevice.slice(0, -1);\\r\\n // debug('statusHex:' + statusHex)\\r\\n statusHex = (statusHex);\\r\\n statusHex = hexToBin(statusHex);\\r\\n statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\r\\n // debug(statusHex)\\r\\n battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\r\\n // debug(battery_percentage)\\r\\n // debug(battery_percentage)\\r\\n // debug(statusHex.substring(8, 13))\\r\\n cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\r\\n // debug(cellNetworkSignal)\\r\\n workMode = parseInt(statusHex.substring(13, 16), 2);\\r\\n // debug(workMode)\\r\\n general += 'statusDevice:' + statusDevice + ';';\\r\\n if (battery_percentage) {\\r\\n general += 'battery:' + battery_percentage + ';';\\r\\n }\\r\\n if (cellNetworkSignal) {\\r\\n general += 'cellNetworkSignal:' + cellNetworkSignal + ';';\\r\\n }\\r\\n if (workMode) {\\r\\n general += 'workMode:' + workMode + ';';\\r\\n }\\r\\n }\\r\\n }\\r\\n // revisar\\r\\n var gen_location = '0';\\r\\n messageForReceiver = (`Watch-HTB;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n //messageBody = messageBody + keyLengthHex + key + value;\\r\\n break;\\r\\n case '12': // Device requesting timestamp\\r\\n timestamp = moment.utc().unix();\\r\\n timestampHex = decimalToHex(timestamp);\\r\\n timestampHex = changeEndianness(timestampHex);\\r\\n keyLengthHex = ('00' + decimalToHex(1 + (timestampHex.length) / 2)).slice(-2);\\r\\n // respond to device with the timestamp of the server\\r\\n messageBody = messageBody + keyLengthHex + key + timestampHex;\\r\\n messageForReceiver = `Eview;${imei};${sequenceID};Get timestamp`;\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n break;\\r\\n case '21': //Cell Towers\\r\\n var mccHex = value.substring(0, 2);\\r\\n var mncHex = value.substring(2, 3);\\r\\n var mcc = hexToDecimal(mccHex);\\r\\n var mnc = hexToDecimal(mncHex);\\r\\n var numTowers = (keyLength - 4) / 5;\\r\\n var cellTowers = hexToAscii(value);\\r\\n messageBody = messageBody + keyLengthHex + key + value;\\r\\n break;\\r\\n case '22': // WIFI locations \\r\\n location_type = 'WIFI';\\r\\n var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\r\\n //location_time = timestamp;\\r\\n var wifiTowers = value;\\r\\n general += 'wifiTowers:';\\r\\n var indexWifi = 0;\\r\\n var bssid_array = [];\\r\\n gen_location = '';\\r\\n for (let i = 0; i < numWifi; i++) {\\r\\n gen_location += wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\r\\n indexWifi += 14;\\r\\n }\\r\\n gen_location = gen_location.slice(0, -1);\\r\\n general += gen_location;\\r\\n if (alarmCode) {\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch-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 if (typeof configIds !== 'undefined' && configIds && configIds.ConfigureDevice && configIds.ConfigureDevice.LastConfigured) { // when is defined\\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 }\\r\\n if (command == 'FE') {\\r\\n while (index < total_length + 16) {\\r\\n var keyLength = message.substring(index, index = index + 2);\\r\\n keyLength = 2 * hexToDecimal(keyLength);\\r\\n var key = message.substring(index, index = index + 2);\\r\\n var value = message.substring(index, index = index + keyLength - 2);\\r\\n }\\r\\n }\\r\\n // prepare the ACK msg and change config if it is needed\\r\\n lengthAck = messageBody.length / 2;\\r\\n lengthAck = ('0000' + decimalToHex(lengthAck)).slice(-4);\\r\\n lengthAck = lengthAck.toString().substring(2, 4) + lengthAck.toString().substring(0, 2);\\r\\n ////////////checksum CRC 16\\r\\n var checksumAck = byteStringToByteArray(messageBody);\\r\\n checksumAck = crc16byte(checksumAck);\\r\\n checksumAck = decimalToHex(checksumAck);\\r\\n checksumAck = ('0000' + checksumAck).slice(-4);\\r\\n checksumAck = checksumAck.toString().substring(2, 4) + checksumAck.toString().substring(0, 2);\\r\\n prefix = prefix + lengthAck + checksumAck + sequenceID;\\r\\n // To send ACK to the device previous to internal msg with parts\\r\\n if (needsAck == true) {\\r\\n if (messageBody.length <= 2) {\\r\\n ack = 'AB00030008C7' + sequenceID + '7F0100'; // change AB10030008C7 to AB00030008C7\\r\\n } else {\\r\\n ack = prefix + messageBody;\\r\\n }\\r\\n AddValue(codeValues, 'imei', imei);\\r\\n AddValue(codeValues, 'ack', ack);\\r\\n }\\r\\n } else { // checksum was invalid - print out useful debug info and bet quess at imei \\r\\n AddValue(codeValues, \\\"error\\\", \\\"checksum failed for message\\\");\\r\\n AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n i = rawFromBytes.search('3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]');\\r\\n if (i >= 0) {\\r\\n imei = hexToAscii(rawFromBytes.substring(i, i + 30));\\r\\n AddValue(codeValues, \\\"imei\\\", imei);\\r\\n }\\r\\n }\\r\\n }\\r\\n // Auxiliary functions\\r\\n function buildDataToReceiver(codeValues, configsToAck = [], configsToUpdate = [], configsToSend = []) {\\r\\n const dataToReceiver = {\\r\\n values: codeValues\\r\\n };\\r\\n if (configsToAck.length > 0) {\\r\\n dataToReceiver.configsToAck = configsToAck;\\r\\n }\\r\\n if (configsToUpdate.length > 0) {\\r\\n dataToReceiver.configsToUpdate = configsToUpdate;\\r\\n }\\r\\n if (configsToSend.length > 0) {\\r\\n dataToReceiver.configsToSend = configsToSend;\\r\\n }\\r\\n return dataToReceiver;\\r\\n }\\r\\n\\r\\n function AddValue(codeValueArray, p1, p2) { // push code value pair into array\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n codeValueArray.push(cvpair);\\r\\n }\\r\\n // convert functions\\r\\n function asciiToHex(str) { // ascii to hex \\r\\n return [...str].map(char => char.charCodeAt(0).toString(16).padStart(2, '0')).join('');\\r\\n }\\r\\n\\r\\n function byteStringToByteArray(str) { // convierte una cadena hexadecimal en un array de bytes (number[])\\r\\n const bytes = [];\\r\\n for (let i = 0; i < str.length; i += 2) {\\r\\n const byte = parseInt(str.substring(i, i + 2), 16);\\r\\n if (!isNaN(byte) && byte >= 0 && byte <= 255) {\\r\\n bytes.push(byte);\\r\\n }\\r\\n }\\r\\n return bytes;\\r\\n }\\r\\n\\r\\n function decimalToHex(x) {\\r\\n return Number(x).toString(16).toUpperCase();\\r\\n }\\r\\n\\r\\n function hexToBin(hex) { // convierte un valor hexadecimal a su representación binaria, y asegura que tenga al menos 8 bits \\r\\n const bin = parseInt(hex, 16).toString(2);\\r\\n return bin.padStart(hex.length * 4, '0');\\r\\n }\\r\\n\\r\\n function hexToAscii(hex) {\\r\\n if (hex.length % 2 !== 0) {\\r\\n throw new Error(\\\"Hex string length must be even\\\");\\r\\n }\\r\\n let ascii = '';\\r\\n for (let i = 0; i < hex.length; i += 2) {\\r\\n const byte = hex.substr(i, 2);\\r\\n const charCode = parseInt(byte, 16);\\r\\n if (charCode !== 0) { // remove null character (\\\\u0000)\\r\\n ascii += String.fromCharCode(charCode);\\r\\n }\\r\\n }\\r\\n return ascii;\\r\\n //return hex.match(/.{2}/g).map(byte => String.fromCharCode(parseInt(byte, 16))).join('');\\r\\n }\\r\\n\\r\\n function hexToDecimalSigned(hex) { // hex to decimal\\r\\n if (hex.length % 2 !== 0) {\\r\\n hex = '0' + hex;\\r\\n }\\r\\n const num = parseInt(hex, 16);\\r\\n const bits = hex.length * 4;\\r\\n const maxVal = 2 ** bits;\\r\\n return num >= maxVal / 2 ? num - maxVal : num;\\r\\n }\\r\\n\\r\\n function hexToDecimal(hex) {\\r\\n return parseInt(hex, 16);\\r\\n }\\r\\n // CheckSum and debug functions\\r\\n function changeEndianness(hexString) { // changeEndianness\\r\\n if (hexString.length === 0) { //if string is empty or not defined\\r\\n return \\\"\\\";\\r\\n }\\r\\n if (hexString.length % 2 !== 0) {\\r\\n throw new Error(\\\"Hex string length must be even\\\");\\r\\n }\\r\\n return hexString.match(/.{2}/g) // divide in bytes (2 chars)\\r\\n .reverse() // reverse the order\\r\\n .join('');\\r\\n }\\r\\n\\r\\n function calculateCheckSum(payloadData) { // calcula el CRC16 sobre una cadena hexadecimal y devuelve el valor con el endianness invertido\\r\\n const bytes = byteStringToByteArray(payloadData);\\r\\n const crc = crc16byte(bytes);\\r\\n const hex = crc.toString(16).padStart(4, '0').toUpperCase();\\r\\n return changeEndianness(hex);\\r\\n }\\r\\n\\r\\n function crc16byte(byteArray) { // calcula el CRC-16 sobre un array de bytes usando una tabla precalculada (crcTable)\\r\\n let crc = 0x0000;\\r\\n for (const byte of byteArray) {\\r\\n if (byte < 0 || byte > 255 || !Number.isInteger(byte)) {\\r\\n throw new RangeError(\\\"Invalid byte value in input array\\\");\\r\\n }\\r\\n const index = (byte ^ (crc >> 8)) & 0xFF;\\r\\n crc = crcTable[index] ^ (crc << 8);\\r\\n }\\r\\n return crc & 0xFFFF;\\r\\n }\\r\\n\\r\\n function debug(...args) { // write debug info to console log, if localTesting\\r\\n if (localTesting) {\\r\\n console.debug('[DEBUG]', ...args);\\r\\n }\\r\\n }\\r\\n /*\\r\\n function sendMessageToLocalhostNoWait(str) { // sends message to system, closing connection after\\r\\n var server;\\r\\n if (localTesting) {\\r\\n console.log('local testing - sending to protocol-dev server the message ... '); // port 5878\\r\\n console.log(str);\\r\\n server = '52.174.17.77';\\r\\n } else {\\r\\n server = '127.0.0.1';\\r\\n }\\r\\n var c = net.createConnection(5878, server);\\r\\n c.on('error', function(error) {\\r\\n c = net.createConnection(5878, server);\\r\\n });\\r\\n c.write(`${str}`);\\r\\n c.end();\\r\\n }*/\\r\\n function sendMessageToLocalhostNoWait(message) {\\r\\n const server = localTesting ? '52.174.17.77' : '127.0.0.1';\\r\\n //const port = localTesting ? '5878' : ''; //Protocol-dev\\r\\n const port = '5678'; //acceptance-dev\\r\\n if (localTesting) {\\r\\n console.debug('[DEBUG] Sending message to test server:', message);\\r\\n }\\r\\n const client = net.createConnection(port, server, () => {\\r\\n client.write(message);\\r\\n client.end();\\r\\n });\\r\\n client.on('error', (err) => {\\r\\n console.error(`[ERROR] Failed to send message to ${server}:${port}:`, err.message);\\r\\n });\\r\\n client.on('end', () => {\\r\\n if (localTesting) {\\r\\n console.debug('[DEBUG] Connection closed');\\r\\n }\\r\\n });\\r\\n }\\r\\n}\\r\\n// params is not defined locally -> export as module\\r\\nif (typeof(params) === 'undefined') {\\r\\n module.exports = {\\r\\n execute_ops\\r\\n }\\r\\n} else { // on server use local defined vars\\r\\n let return_values = execute_ops(moment, msg, net, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\r\\n // define global returns\\r\\n msg = return_values;\\r\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1751358168},{"Type":1,"NewValue":"{\"Id\":437,\"Name\":\"Access TEC Care Watch\",\"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 // Watch protocol - please see variables and typical values in order below\\n // Watch-CYC;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;SIGNAL=<>;WM=<>;GENERAL=<>\\n // Watch-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\n //\\n // Author: Juanmi Navarro\\n // Created: 01/01/0000\\n // Last modified: 20/05/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', 'Watch');\\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 = (`Watch-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 var allowedCID = ['3036', '06'];\\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 //<>,<>,<> \\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 //<>,<>,<> \\n if (mac2) {\\n AddValue(codeValues, 'beacon_mac', mac2);\\n var simpleQuery2 = [{\\n 'code': 'Mac',\\n 'value': mac2,\\n }];\\n var simpleQueryLabel2 = {\\n 'table': 'beacons',\\n 'select': 'Name',\\n 'query': simpleQuery2\\n };\\n var labels2 = [];\\n labels2.push(JSON.stringify(simpleQueryLabel2));\\n AddValue(codeValues, 'oysta_labels', JSON.stringify(labels2));\\n }\\n if (params.beacon_major) {\\n AddValue(codeValues, 'beacon_major', params.beacon_major);\\n } else {\\n AddValue(codeValues, 'beacon_major', 0);\\n }\\n if (params.beacon_minor) {\\n AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\n } else {\\n AddValue(codeValues, 'beacon_minor', 0);\\n }\\n //AddValue(codeValues,'oysta_labels', label);\\n //AddValue(codeValues,'oysta_value', mac);\\n if (location_time) {\\n AddValue(codeValues, 'location_time', location_time);\\n }\\n }\\n /* meter mas tarde... \\n if (params.smart_data !== 'undefined') {\\n var gen_location = params.smart_data.split(',')\\n var latitude = gen_location[0]\\n var longitude = gen_location[1]\\n var location_accuracy = gen_location[2]\\n var altitude = gen_location[3]\\n AddValue(codeValues,'latitude', latitude);\\n AddValue(codeValues,'longitude', longitude);\\n AddValue(codeValues,'altitude', altitude);\\n AddValue(codeValues,'location_accuracy', location_accuracy);\\n }\\n */\\n /*else if ((params.event_time) && (params.event_time == '')) {\\n var event_time = moment.utc().unix();\\n AddValue(codeValues,'event_time', event_time);\\n } revisar mas adelante*/\\n // to parse SMS info from the device\\n switch (messageTypeLocalCode) {\\n case 'COMM-SMS': // SMS message sent in\\n if (params.data.startsWith('Device location request')) {\\n configsToAck.push(configIds.Controls.RealTimeLocate);\\n } else if (params.data.startsWith('Set IP ok')) {\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\n } else if (params.data.startsWith('IMEI:')) {\\n configsToAck.push(configIds.Controls.GetFirmwareVersion);\\n } else if (params.data.startsWith('Set IP ok')) {\\n configsToAck.push(configIds.Controls.ClearBufferedMessages);\\n } else if (params.data.startsWith('flush ok')) {\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\n } else if (params.data.startsWith('Set Watch-')) {\\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 = (`Watch-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 = (`Watch;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 = (`Watch;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 = (`Watch-RTL;${params.imei};${location_time};${location_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n break;\\n }\\n if (!params.event_time && !event_time) { // if params.event_time undefined - set it to now. \\n var event_time = moment.utc().unix();\\n AddValue(codeValues, 'event_time', event_time);\\n }\\n // if (!params.location_time && !location_time) { // if params.location_time undefined - set it to now. \\n // var location_time = moment.utc().unix();\\n // AddValue(codeValues, 'location_time', location_time);\\n //}\\n }\\n // send data msg to kibana\\n const data = buildDataToReceiver(codeValues, configsToAck, configsToUpdate, configsToSend);\\n console.log(data);\\n return data\\n // end of main operation\\n // define functions used in operation\\n // decode global msg\\n function decoder(str) { // decode rawdata\\n // CARE Decoder\\n AddValue(codeValues, 'Message : ', str);\\n var message = str;\\n // need to check if checksum is correct for possible msg corruption 10/03/23\\n var checksum = message.substring(8, 12);\\n var messageBody = message.substring(16, message.length);\\n debug('message =' + message);\\n debug('checksum =' + checksum);\\n debug('calculateCheckSum =' + calculateCheckSum(messageBody));\\n if (calculateCheckSum(messageBody) == checksum) { // payload is valid\\n debug(\\\"message has valid checksum\\\");\\n var messageBody = command; // update value for the ACK\\n debug('command =' + command);\\n if (command == '01') {\\n while (index < total_length + 16) {\\n var keyLengthHex = message.substring(index, index = index + 2);\\n var keyLength = 2 * hexToDecimal(keyLengthHex);\\n var key = message.substring(index, index = index + 2);\\n var value = message.substring(index, index = index + keyLength - 2);\\n debug('key = ' + key);\\n debug('value = ' + value);\\n switch (key) {\\n //Device ID\\n case '01':\\n var imei = hexToAscii(value);\\n // create long connection if it is needed\\n if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\n //no 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\\n if ((alarmCodeExtInt & 1) == 1) {\\n var alarm = 'ALF-C';\\n }\\n // Welfare Check-out\\n else if ((alarmCodeExtInt & 2) == 2) {\\n var alarm = 'ALA-C';\\n }\\n // Standard Alerts\\n //Battery low\\n else if ((alarmCodeInt & 1) == 1) {\\n var alarm = 'BATL';\\n }\\n //Overspeed\\n else if ((alarmCodeInt & 2) == 2) {\\n var alarm = 'ALSP';\\n }\\n //Fall\\n else if ((alarmCodeInt & 4) == 4) {\\n var alarm = 'ALF';\\n }\\n //Tilt\\n else if ((alarmCodeInt & 8) == 8) {\\n var alarm = 'Tilt';\\n } else if ((alarmCodeInt & 16) == 16) {\\n if ((alarmCodeInt & 16777216) == 16777216) {\\n var alarm = 'Geo1-IN';\\n } else {\\n var alarm = 'Geo1-OUT';\\n }\\n } else if ((alarmCodeInt & 32) == 32) {\\n if ((alarmCodeInt & 33554432) == 33554432) {\\n var alarm = 'Geo2-IN';\\n } else {\\n var alarm = 'Geo2-OUT';\\n }\\n } else if ((alarmCodeInt & 64) == 64) {\\n if ((alarmCodeInt & 67108864) == 67108864) {\\n var alarm = 'Geo3-IN';\\n } else {\\n var alarm = 'Geo3-OUT';\\n }\\n } else if ((alarmCodeInt & 128) == 128) {\\n if ((alarmCodeInt & 134217728) == 134217728) {\\n var alarm = 'Geo4-IN';\\n } else {\\n var alarm = 'Geo4-OUT';\\n }\\n }\\n //Power Off\\n else if ((alarmCodeInt & 256) == 256) {\\n var alarm = 'PWRF';\\n }\\n //Power On\\n else if ((alarmCodeInt & 512) == 512) {\\n var alarm = 'PWRN';\\n }\\n //Motion\\n else if ((alarmCodeInt & 1024) == 1024) {\\n var alarm = 'ALMOV';\\n }\\n //No Motion\\n else if ((alarmCodeInt & 2048) == 2048) {\\n var alarm = 'ALNM';\\n }\\n //SOS\\n else if ((alarmCodeInt & 4096) == 4096) {\\n var alarm = 'ALSOS';\\n } else if ((alarmCodeInt & 8192) == 8192) {\\n var alarm = 'Side1';\\n } else if ((alarmCodeInt & 16384) == 16384) {\\n var alarm = 'Side2';\\n }\\n //Battery charging\\n else if ((alarmCodeInt & 32768) == 32768) {\\n var alarm = 'BATCN';\\n }\\n //Battery no charging\\n else if ((alarmCodeInt & 65536) == 65536) {\\n var alarm = 'BATCF';\\n }\\n //SOS Ending\\n // Temporary Commented until we know exactly how it works. 22/09/2022\\n else if ((alarmCodeInt & 131072) == 131072) {\\n var alarm = 'SOSEnding';\\n info = 'Alarm Finished';\\n }\\n //Amber Alert EC03 only\\n else if ((alarmCodeInt & 262144) == 262144) {\\n var alarm = 'ALAO';\\n }\\n // welfare Alert check-in ALA-O\\n else if ((alarmCodeInt & 524288) == 524288) {\\n var alarm = 'ALA-O';\\n }\\n // Amber alert Ending ALA-C\\n else if ((alarmCodeInt & 1048576) == 1048576) {\\n var alarm = 'ALA-C';\\n }\\n // Amber alert Ending ALA-C\\n //else if ((alarmCodeInt & 1048576) == 1048576) {\\n // var alarm = 'ALA-C';\\n //}\\n // Fall-Down Alert ending\\n else if ((alarmCodeInt & 2097152) == 2097152) {\\n var alarm = 'ALF-C';\\n }\\n // welfare Alert Ending ALA\\n else if ((alarmCodeInt & 4194304) == 4194304) {\\n var alarm = 'ALA';\\n }\\n // Beacon absent Alert 11/10/22. Need to be added in msg types\\n //else if ((alarmCodeInt & 16777216) == 16777216) {\\n // var alarm = 'BEA';\\n //}\\n general += 'alarm:' + alarm + ',';\\n break;\\n //Custom ID\\n case '03':\\n customID = value;\\n if (!allowedCID.includes(value)) {\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\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 //no 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 //<>,<>,<>,<>,<>\\n gps_data = `${latitude},${longitude},${location_accuracy},${speed},${direction},${altitude},${satellites},${mileage}`;\\n general += 'gps location (lat):' + latitude + ', (long):' + longitude + ',';\\n break;\\n //WIFI Towers\\n case '22':\\n location_type = 'WIFI';\\n var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\n //location_time = timestamp;\\n var wifiTowers = value;\\n general += 'wifiTowers:';\\n var indexWifi = 0;\\n var bssid_array = [];\\n wifi_data = '';\\n for (let i = 0; i < numWifi; i++) {\\n wifi_data += hexToDecimalSigned(wifiTowers.substring(indexWifi, indexWifi + 2)) + ',' + wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\n indexWifi += 14;\\n }\\n wifi_data = wifi_data.slice(0, -1);\\n general += wifi_data;\\n break;\\n //BLE Location Added 10/10/22\\n case '23':\\n location_type = 'BLE';\\n var mac = value.substring(0, 12);\\n var latitudeHex = value.substring(12, 20);\\n var longitudeHex = value.substring(20, 28);\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n var address = hexToAscii(value.substring(28, value.length));\\n var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\n // add : format in MAC\\n mac = mac.match(/.{1,2}/g).join(':');\\n // location_time = timestamp;\\n ble_data = `${latitude},${longitude},${mac},${address}`;\\n general += 'BLE location (lat):' + latitude + ', (long):' + longitude + ',';\\n break;\\n //General Data , status_data\\n case '24':\\n if (!allowedCID.includes(customID)) {\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n AddValue(codeValues, \\\"customID\\\", customID);\\n return\\n }\\n if (alarmCode) {\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\n }\\n //else {\\n // messageForReceiver = (`CareWatch-CYC;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};`);\\n //}\\n // reset variables\\n //alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\n var timestampHex = value.substring(0, 8);\\n timestampHex = changeEndianness(timestampHex);\\n timestamp = hexToDecimal(timestampHex);\\n location_time = timestamp;\\n event_time = timestamp;\\n // HardCode to fix possible issue in protocol\\n //event_time = moment.utc().unix();\\n // end of hard code\\n var statusHex = changeEndianness(value.substring(8, 16));\\n var statusInt = hexToDecimal(statusHex);\\n var statusDevice = '';\\n if ((statusInt & 1) == 1) {\\n statusDevice += 'GPS,';\\n }\\n if ((statusInt & 2) == 2) {\\n statusDevice += 'WIFISource,';\\n }\\n if ((statusInt & 4) == 4) {\\n statusDevice += 'CellTower,';\\n }\\n if ((statusInt & 8) == 8) {\\n statusDevice += 'BLELocation,';\\n }\\n //params.BatteryStatus.BatteryStatus = '1';\\n if ((statusInt & 16) == 16) {\\n statusDevice += 'Charging,';\\n // var alarm = 'BATCN';\\n //configs.BatteryStatus.BatteryStatus = '1';\\n /* if (configs.BatteryStatus.BatteryStatus !== '1') {\\n hasConfigs = true;\\n var batteryStatus = '1';\\n var alarm = 'BATCN';\\n let configsToUpdate = [];\\n configsToUpdate.push({\\n 'code': configIds.BatteryStatus.BatteryStatus,\\n 'value': batteryStatus\\n });\\n }*/\\n }\\n if ((statusInt & 32) == 32) {\\n statusDevice += 'FUllyCharged,';\\n //var alarm = 'BATF';\\n // configs.BatteryStatus.BatteryStatus = '3';\\n /* if (configs.BatteryStatus.BatteryStatus !== '3') {\\n hasConfigs = true;\\n var batteryStatus = '3';\\n var alarm = 'BATF';\\n let configsToUpdate = [];\\n configsToUpdate.push({\\n 'code': configIds.BatteryStatus.BatteryStatus,\\n 'value': batteryStatus\\n });\\n }*/\\n }\\n /* if (!((statusInt & 32) == 32) & !((statusInt & 16) == 16)) {\\n statusDevice += 'Not Charging,';\\n var alarm = 'BATCF';\\n //configs.BatteryStatus.BatteryStatus = '2';\\n if (configs.BatteryStatus.BatteryStatus !== '2') {\\n var batteryStatus = '2';\\n var alarm = 'BATCF';\\n let configsToUpdate = [];\\n configsToUpdate.push({\\n 'code': configIds.BatteryStatus.BatteryStatus,\\n 'value': batteryStatus\\n });\\n }\\n }*/\\n if ((statusInt & 64) == 64) {\\n statusDevice += 'Reboot,';\\n }\\n if ((statusInt & 128) == 128) {\\n statusDevice += 'HistoricalData,';\\n }\\n if ((statusInt & 256) == 256) {\\n statusDevice += 'AGPSDataValid,';\\n }\\n if ((statusInt & 512) == 512) {\\n statusDevice += 'Motion,';\\n }\\n if ((statusInt & 1024) == 1024) {\\n statusDevice += 'SmartLocating,';\\n }\\n if ((statusInt & 2048) == 2048) { //isHome\\n statusDevice += 'BeaconLocation,';\\n }\\n if ((statusInt & 4096) == 4096) {\\n statusDevice += 'BLEConnected,';\\n }\\n if ((statusInt & 16384) == 16384) {\\n statusDevice += 'HomeWiFi,';\\n }\\n statusDevice = statusDevice.slice(0, -1);\\n status_data = statusDevice; //to oysta template\\n //statusHex = (statusHex);\\n statusHex = hexToBin(statusHex);\\n statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\n battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\n cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\n workMode = parseInt(statusHex.substring(13, 16), 2);\\n general += 'statusDevice:' + statusDevice + ',';\\n if (battery_percentage) {\\n general += 'battery:' + battery_percentage + ',';\\n }\\n if (cellNetworkSignal) {\\n general += 'cellNetworkSignal:' + cellNetworkSignal + ',';\\n }\\n if (workMode) {\\n general += 'workMode:' + workMode + ',';\\n }\\n //messageForReceiver = (`CareWatch-CYC;${imei};${i};${event_time};${battery_percentage}`);\\n break;\\n //Call Records\\n case '25':\\n //Needed?\\n break;\\n //BLE Location 2\\n case '26':\\n //I don't understand\\n //messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n //Smart Location\\n case '27':\\n location_type = 'SMART';\\n var latitudeHex = value.substring(0, 8);\\n var longitudeHex = value.substring(8, 16);\\n var location_accuracyHex = value.substring(16, 20);\\n var altitudeHex = value.substring(20, 24);\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n var altitude = hexToDecimal(changeEndianness(altitudeHex));\\n //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\n //04/08/2022 se quita el multiplicador por 5 pq ya viene el valor en metros\\n location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\n //location_time = timestamp;\\n smart_data = `${latitude},${longitude},${location_accuracy},${altitude}`;\\n general += 'smart location (lat):' + latitude + ', (long):' + longitude + ',';\\n break;\\n //Beacon Location Added 11/10/22\\n case '28':\\n location_type = 'BEACON';\\n // var alarm = 'EBZI';\\n var latitudeHex = '00';\\n var longitudeHex = '00';\\n var descr = 'empty';\\n var flag = hexToDecimal(value.substring(0, 1));\\n var beacId = hexToDecimal(value.substring(1, 2));\\n // msg includes descrip\\n if ((flag & 4) == 4) {\\n descr = hexToAscii(value.substring(18, value.length));\\n }\\n // msg includes lat/lon\\n if ((flag & 8) == 8) {\\n latitudeHex = value.substring(18, 26);\\n longitudeHex = value.substring(26, 34);\\n }\\n // msg includes lat/lon and description\\n if ((flag & 12) == 12) {\\n latitudeHex = value.substring(18, 26);\\n longitudeHex = value.substring(26, 34);\\n descr = hexToAscii(value.substring(34, value.length));\\n }\\n var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\n // add : format in MAC\\n mac = mac.match(/.{1,2}/g).join(':');\\n var rssiHex = value.substring(14, 16);\\n var rssi1Hex = value.substring(16, 18);\\n rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\n rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\n // var latitudeHex = value.substring(18, 26);\\n // var longitudeHex = value.substring(26, 34);\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n //location_time = timestamp;\\n beacon_data = `${latitude},${longitude},${mac},${descr}`;\\n general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (listIndex):' + beacId + ',';\\n break;\\n // Beacon V2\\n case '2C':\\n location_type = 'BEACON';\\n // var alarm = 'EBZI';\\n var latitudeHex = '00';\\n var longitudeHex = '00';\\n var descr = 'empty';\\n var flag = hexToDecimal(value.substring(0, 1));\\n var beacId = hexToDecimal(value.substring(1, 2));\\n // msg includes descrip\\n if ((flag & 4) == 4) {\\n let desc_leng = hexToDecimal(value.substring(20, 22));\\n descr = hexToAscii(value.substring(22, 22 + (2 * desc_leng)));\\n //descr = hexToAscii(value.substring(18, value.length));\\n }\\n // msg includes lat/lon\\n if ((flag & 8) == 8) {\\n latitudeHex = value.substring(18, 26);\\n longitudeHex = value.substring(26, 34);\\n }\\n // msg includes lat/lon and description\\n if ((flag & 12) == 12) {\\n latitudeHex = value.substring(20, 28);\\n longitudeHex = value.substring(28, 36);\\n let desc_leng = hexToDecimal(value.substring(36, 38));\\n descr = hexToAscii(value.substring(38, 38 + (2 * desc_leng)));\\n }\\n var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\n // add : format in MAC\\n mac = mac.match(/.{1,2}/g).join(':');\\n var rssiHex = value.substring(14, 16);\\n var rssi1Hex = value.substring(16, 18);\\n rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\n rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\n var battery_beacon = hexToDecimal(value.substring(18, 20));\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n //location_time = timestamp;\\n beacon_data = `${latitude},${longitude},${mac},${descr}`;\\n general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (battery):' + battery_beacon + ', (listIndex):' + beacId + ',';\\n break;\\n //Cell Towers Note\\n case '29':\\n location_type = 'LBS';\\n lbs_data = '';\\n var mccHex = changeEndianness(value.substring(0, 4));\\n var mncHex = value.substring(4, 6);\\n var mcc = hexToDecimal(mccHex);\\n lbs_data += mcc + ',';\\n var mnc = hexToDecimal(mncHex);\\n lbs_data += mnc + ',';\\n var indexLbs = 6;\\n var numTowers = (hexToDecimal(keyLengthHex) - 4) / 7;\\n for (let i = 0; i < numTowers; i++) {\\n var rxlHex = changeEndianness(value.substring(indexLbs, indexLbs + 2));\\n var rxl = hexToDecimal(rxlHex);\\n var lacHex = changeEndianness(value.substring(indexLbs + 2, indexLbs + 6));\\n var lac = hexToDecimal(lacHex);\\n var cellTowers = hexToDecimal(changeEndianness(value.substring(indexLbs + 6, indexLbs + 14)));\\n lbs_data += rxl + ',' + lac + ',' + cellTowers + ',';\\n indexLbs += 14;\\n }\\n lbs_data = lbs_data.slice(0, -1);\\n general += lbs_data;\\n break;\\n case '30':\\n //G-sensor.\\n 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 = (`Watch-${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 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 = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n }\\n break;\\n //BLE Connected . For Flic button\\n case '62':\\n location_type = 'BLE';\\n //var alarm = 'EBZI'; \\n //var latitudeHex = '00';\\n //var longitudeHex = '00';\\n //var descr = 'empty';\\n var flag = hexToDecimal(value.substring(0, 2)); // 0= Disconnected, 1= Connected\\n var mac = value.substring(2, 14); // No hace falta darle la vuelta\\n // add : format in MAC\\n mac = mac.match(/.{1,2}/g).join(':');\\n var batLevel = hexToDecimal(value.substring(14, 16)); // 0-100\\n //location_time = timestamp;\\n ble_data = `${flag},${batLevel},${mac}`;\\n general += 'BLE location (State):' + flag + ', (bat):' + batLevel + ', (mac):' + mac + ',';\\n break;\\n }\\n }\\n if (alarmCode) {\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};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 = (`Watch;ACK-FIRM;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\n //AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\n configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\n //configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\n //messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n case '1A':\\n //no ACK need\\n var fwVersion = hexToAscii(value);\\n imei = serverParams.Imei;\\n AddValue(codeValues, \\\"imei\\\", imei);\\n AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\n messageForReceiver = (`Watch;ACK-FIRM;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\n //AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\n configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\n //configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\n break;\\n //IMEI\\n case '03':\\n var imei = hexToDecimal(value);\\n // harcode to avoid conflicts with Rio protocol\\n //if ((imei != '860470063029395') && (imei != '860470063035947')) {\\n // AddValue(codeValues, \\\"error\\\", \\\"device imei is not in this protocol\\\");\\n // AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n //AddValue(codeValues, \\\"IMEI\\\", imei);\\n // return\\n //}\\n if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\n //return;\\n }\\n messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n //ICCID\\n case '04':\\n var iccid = hexToDecimal(value);\\n messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n //BLE-MAC\\n case '05':\\n var bleMac = hexToDecimal(value);\\n messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n //Run Time\\n case '07':\\n var runTime = hexToDecimal(value);\\n messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n case '10': // Ringer Volume\\n var volume = hexToDecimal(value);\\n imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-VOL;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"Volume\\\", volume);\\n AddValue(configsToUpdate, configIds.ReadSystemSettings.Volume, volume);\\n configsToAck.push(configIds.ReadSystemSettings.Volume);\\n break;\\n case '0A': //Performance mode\\n //var workMode = hexToDecimal(value);\\n //messageBody = messageBody + keyLengthHex + key + value;\\n //AddValue(codeValues, \\\"WorkMode\\\", workMode);\\n //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\n //configsToAck.push(configIds.ReadPerformance`Settings.Mode);\\n //var workMode = hexToAscii(value.substring(0, value.length));\\n //var workMode = hexToDecimal(value);\\n //var workMode = hexToAscii(value.substring(0, value.length));\\n var workMode = 1234; // + value + \\\"end\\\";\\n //var workModeVal = 9;\\n //workMode = 'test10';\\n imei = serverParams.Imei;\\n messageForReceiver = (`Watch;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 '0F': // Enable control.... Used for STEP COUNTING SETTINGS\\n // 'FF FF 21 80'\\n var StepStatus = hexToBin(value.substring(4, 6));\\n var enalbleDisable = '';\\n if (StepStatus.substring(7, 8) == '1') {\\n var step = 'Enable, '\\n enalbleDisable = '1'\\n } else {\\n var step = 'Disable, '\\n };\\n //var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\n //hrate += detectingInterval;\\n AddValue(codeValues, \\\"step\\\", step);\\n //var imei = serverParams.Imei;\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(configsToUpdate, configIds.ReadStepsSettings.EnableDisableReadStepsSettings, enalbleDisable);\\n //AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\n configsToAck.push(configIds.ReadStepsSettings.EnableDisableReadStepsSettings);\\n //configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\n break;\\n case '1B':\\n //Decimal o ascii?\\n var gsmModule = hexToDecimal(value);\\n messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n case '1F':\\n //System Language\\n var systemLanguage = hexToAscii(value.substring(0, value.length));\\n imei = serverParams.Imei;\\n //messageBody = messageBody + keyLengthHex + key + value;\\n messageForReceiver = (`Watch;ACK-LANG;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"SystemLanguage\\\", systemLanguage);\\n AddValue(configsToUpdate, configIds.ReadSystemSettings.SystemLanguage, systemLanguage);\\n configsToAck.push(configIds.ReadSystemSettings.SystemLanguage);\\n break;\\n case '33': // phone option\\n // [Value]:83 0B 00 00 {\\\"phoneOption\\\":{\\\"flag_value\\\":2947,\\\"s3\\\":1,\\\"s4\\\":0,\\\"s5\\\":1,\\\"s6\\\":0,\\\"callIncoming\\\":0,\\\"rings\\\":3,\\\"s7\\\":0,\\\"toneID\\\":0,\\\"s1\\\":1,\\\"s2\\\":1}}\\n var statusPhone = hexToBin(value.substring(0, 2)); // To find autoanswer setup\\n if (statusPhone.substring(0, 1) == '1') { // 1 Enable\\n var auto = 'true';\\n } else var auto = 'false';\\n statusPhone = hexToBin(value.substring(2, 4)); // To find allow list setup\\n if (statusPhone.substring(7, 8) == '1') { // 1 Enable\\n allow = 'true';\\n } else var allow = 'false';\\n //statusPhone = hexToBin(value.substring(0, 2)) + hexToBin(value.substring(2, 4));\\n //AddValue(configsToUpdate, configIds.ReadSystemSettings.Statusphone, statusPhone);\\n AddValue(configsToUpdate, configIds.ReadSystemSettings.AllowList, allow);\\n AddValue(configsToUpdate, configIds.ReadSystemSettings.AutoAnswer, auto);\\n //configsToAck.push(configIds.ReadSystemSettings.Statusphone);\\n configsToAck.push(configIds.ReadSystemSettings.AllowList);\\n configsToAck.push(configIds.ReadSystemSettings.AutoAnswer);\\n break;\\n case '34': //ContactList with name\\n var contactNumber = value.substring(1, 2);\\n var telLength = hexToDecimal(value.substring(2, 4));\\n var tel = '';\\n switch (contactNumber) {\\n // Emergency Number\\n case '0':\\n tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\n AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\n AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\n configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\n break;\\n // Speed Dial Number\\n //case '1':\\n // tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\n // AddValue(codeValues, \\\"SpeedDialNumber\\\", tel);\\n // AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.SpeedDialNumber, tel);\\n // configsToAck.push(configIds.ReadSpeedDialSettings.SpeedDialNumber);\\n // break;\\n // Gateway Number\\n case '9': //00447781482635,Esendex UK 0034627177148,Esendex Spain 00447507288240,Esendex UK Acceptance\\n tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\n if (tel.includes('447781482635') || tel.includes('00447781482635')) {\\n tel = 'Esendex UK'\\n } else if (tel.includes('34627177148') || tel.includes('0034627177148')) {\\n tel = 'Esendex Spain'\\n } else if (tel.includes('447507288240') || tel.includes('00447507288240')) {\\n tel = 'Esendex UK Acceptance'\\n } else {\\n tel = 'Default'\\n }\\n AddValue(codeValues, \\\"SMSGateway\\\", tel);\\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\n configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\n break;\\n default:\\n tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\n if (tel.length < 6) {\\n contacts += '';\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\n break;\\n }\\n //contacts += 'A' + (contactNumber - 1) + ': ' + tel + ', ';\\n contacts += tel + ', ';\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\n break;\\n }\\n break;\\n case '40': // APN\\n //no ACK need\\n AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'));\\n configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\n var apn = hexToAscii(value.substring(0, value.length));\\n imei = serverParams.Imei;\\n break;\\n case '41': // APN Username\\n //no ACK need\\n //apn = apn + ',' + hexToAscii(value.substring(0, value.length));\\n break;\\n case '42': // APN Password\\n //no ACK need\\n //apn = apn + ',' + hexToAscii(value.substring(0, value.length));\\n messageForReceiver = (`Watch;ACK-GDATA;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"apn\\\", apn);\\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.APN, apn);\\n configsToAck.push(configIds.ReadCommunicationSettings.APN);\\n break;\\n case '43': //Server Details\\n //52.232.85.255,5678 production 52.174.17.77,5678 acceptance\\n var serverDetails = hexToAscii(value.substring(6, value.length)) + ':' + hexToDecimal(value.substring(4, 6) + value.substring(2, 4));\\n if (serverDetails.includes('52.232.85.255:5678')) {\\n serverDetails = 'Production'\\n } else if (serverDetails.includes('52.174.17.77:5678')) {\\n serverDetails = 'Acceptance'\\n } else if (serverDetails.includes('52.174.17.77:5778')) {\\n serverDetails = 'Protocol-Import'\\n } else if (serverDetails.includes('52.174.17.77:5878')) {\\n serverDetails = 'Protocol-Dev'\\n } else {\\n serverDetails = 'Default'\\n }\\n AddValue(codeValues, \\\"server\\\", serverDetails);\\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.Server, serverDetails);\\n configsToAck.push(configIds.ReadCommunicationSettings.Server);\\n break;\\n case '44': //time interval - work mode intervals\\n imei = serverParams.Imei;\\n messageForReceiver = (`Watch;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 '46': //HeartRate\\n // '10 0E 00 80'\\n var HeartRateStatus = hexToBin(value.substring(6, 8));\\n var enalbleDisable = '';\\n if (HeartRateStatus.substring(0, 1) == '1') {\\n var hrate = 'Enable, '\\n enalbleDisable = '1'\\n } else {\\n var hrate = 'Disable, '\\n };\\n var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\n hrate += detectingInterval;\\n AddValue(codeValues, \\\"hrate\\\", hrate);\\n //var imei = serverParams.Imei;\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings, enalbleDisable);\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\n configsToAck.push(configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings);\\n configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\n break;\\n case '47': // Custom Id\\n imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-CUSTID;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"customeid\\\", value);\\n AddValue(configsToUpdate, configIds.ReadState.CustomId, hexToAscii(value)); //now it comes \\\"3036\\\"\\n configsToAck.push(configIds.ReadState.CustomId);\\n break;\\n case '53': // Non motion alert\\n //2B020080\\n var status = hexToBin(value.substring(6, 8));\\n var alertSetting = '';\\n var enableDisable = '';\\n if (status.substring(0, 1) == '1') {\\n alertSetting = 'Enable, '\\n enableDisable = '1';\\n } else {\\n alertSetting = 'Disable, '\\n };\\n //if (status.substring(5, 6) == '1') {\\n // alertSetting += 'Dial, '\\n //} else {\\n // alertSetting += 'No Dial, '\\n //};\\n var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\n alertSetting += time;\\n imei = serverParams.Imei;\\n // commented until Eview fixes this function\\n /*\\n messageForReceiver = (`Watch;ACK-NOMOTION;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"nomotion\\\", alertSetting);\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings, enableDisable);\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\n configsToAck.push(configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings);\\n configsToAck.push(configIds.ReadNonMovementSettings.Time);\\n */\\n break;\\n case '56': //Fall down sensibility\\n // '00001100'\\n var fallStatus = hexToBin(value.substring(0, 2));\\n var enalbleDisable = '';\\n //if (fallStatus.substring(4, 5) == '1') {\\n if (fallStatus.substring(0, 1) == '1') {\\n var sensibility = 'Enable, '\\n enalbleDisable = '1'\\n } else {\\n var sensibility = 'Disable, '\\n };\\n if (fallStatus.substring(5, 6) == '1') {\\n sensibility += 'Dial, '\\n } else {\\n sensibility += 'No Dial, '\\n };\\n var imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-FALLALERT;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n var sesibityOptionValue = hexToDecimal(value.substring(1, 2));\\n sensibility += sesibityOptionValue;\\n AddValue(codeValues, \\\"sensibility\\\", sensibility);\\n //AddValue(configsToUpdate, configIds.ReadAlertSettings.FallSettings, sensibility);\\n AddValue(configsToUpdate, configIds.ReadFallSettings.EnableDisableFallSettings, enalbleDisable);\\n AddValue(configsToUpdate, configIds.ReadFallSettings.Sensitivity, sesibityOptionValue);\\n //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\n configsToAck.push(configIds.ReadFallSettings.EnableDisableFallSettings);\\n configsToAck.push(configIds.ReadFallSettings.Sensitivity);\\n break;\\n case '73': //BeaconList\\n var beaconNumber = hexToDecimal(value.substring(1, 2));\\n var beaconStatus = hexToBin(value.substring(0, 1));\\n beaconStatus = hexToAscii(value.substring(30, value.length));\\n //beaconStatus = changeEndianness(value.substring(30, value.length));\\n //homeBeacon += 'B' + (beaconNumber + 1) + ': ' + beaconStatus + ', ';\\n homeBeacon += beaconStatus + ', ';\\n AddValue(codeValues, \\\"homeBeacon\\\", homeBeacon);\\n messageForReceiver = (`Watch;ACK-GDATA;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\n configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\n break;\\n case '4A': //Wifi Network List\\n var wifiSSIDLenght = hexToDecimal(value.substring(2, 4));\\n var wifiPasswordLenght = hexToDecimal(value.substring(4, 6));\\n var wifiIndex = hexToDecimal(value.substring(1, 2));\\n //var wifiStatus = hexToDecimal(value.substring(0, 1));\\n var wifiStatus = value.substring(0, 1);\\n /*var enalbleDisable = wifiSSID = wifiPassword = homeWifi = '';\\n /var homeWifi = '';\\n if (wifiIndex == '0') { // Only first Wifi of the list\\n if (wifiStatus == '8') {\\n homeWifi += ' Enable, '\\n enalbleDisable = '1';\\n } else {\\n homeWifi += ' Disable, '\\n //enalbleDisable = '0';\\n };*/\\n if ((wifiStatus == '8') || (wifiStatus == 'C')) { // 8 == ON OR C== ON and Connected\\n var wifiSSID = hexToAscii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\n var wifiPassword = hexToAscii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\n var imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-WIFI;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n //homeWiFi += 'W' + (wifiIndex + 1) + ': ' + wifiSSID + ', ' + wifiPassword + ';';\\n homeWiFi += wifiSSID + ', ' + wifiPassword + ';';\\n AddValue(codeValues, \\\"wifi\\\", homeWiFi);\\n AddValue(configsToUpdate, configIds.ReadWiFiList.WiFiList, homeWiFi);\\n configsToAck.push(configIds.ReadWiFiList.WiFiList);\\n }\\n //AddValue(configsToUpdate, configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings, enalbleDisable);\\n //AddValue(configsToUpdate, configIds.ReadWiFiSettings.SSID, wifiSSID);\\n //AddValue(configsToUpdate, configIds.ReadWiFiSettings.Password, wifiPassword);\\n //configsToAck.push(configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings);\\n //configsToAck.push(configIds.ReadWiFiSettings.SSID);\\n //configsToAck.push(configIds.ReadWiFiSettings.Password);\\n break;\\n case '21': // Speed Dial Settings\\n // [Value]:53 84 {\\\"call1Button\\\":{\\\"mode\\\":0,\\\"feedBack\\\":3,\\\"task\\\":2,\\\"time\\\":20,\\\"status\\\":1}}\\n var status = hexToBin(value.substring(2, 4)); //always pass 2 HEXs to this function\\n var alertSetting = '';\\n var enalbleDisable = '';\\n if (status.substring(0, 1) == '1') {\\n alertSetting = 'Enable, '\\n enalbleDisable = '1'\\n } else {\\n alertSetting = 'Disable, '\\n //enableDisable = '0';\\n };\\n //var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\n //alertSetting += time;\\n imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-SPEED;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"speed\\\", alertSetting);\\n AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\n configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\n break;\\n }\\n }\\n }\\n if (command == '03') {\\n while (index < total_length + 16) {\\n var keyLengthHex = message.substring(index, index = index + 2);\\n var keyLength = 2 * hexToDecimal(keyLengthHex);\\n var key = message.substring(index, index = index + 2);\\n var value = message.substring(index, index = index + keyLength - 2);\\n debug('key = ' + key);\\n debug('value = ' + value);\\n switch (key) {\\n case '01': // Device ID\\n var imei = hexToAscii(value);\\n // create long connection if it is needed\\n if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\n //return;\\n }\\n break;\\n case '10': // Heartbeat\\n var heartbeat = hexToAscii(value);\\n event_time = moment.utc().unix();\\n if (index < total_length + 16) {\\n var keyLengthHex = message.substring(index, index = index + 2);\\n keyLength = 2 * hexToDecimal(keyLengthHex);\\n key = message.substring(index, index = index + 2);\\n if (key == '24') {\\n // debug('key: ' + key) //comment those out\\n value = message.substring(index, index = index + keyLength - 2);\\n // debug(value)\\n var timestampHex = value.substring(0, 8);\\n // debug('timestampt hex: ' + timestampHex)\\n timestampHex = changeEndianness(timestampHex);\\n timestamp = hexToDecimal(timestampHex);\\n event_time = timestamp;\\n // debug(event_time)\\n var statusHex = changeEndianness(value.substring(8, 16));\\n // debug(statusHex)\\n var statusInt = hexToDecimal(statusHex);\\n var statusDevice = '';\\n if ((statusInt & 1) == 1) {\\n statusDevice += 'GPS,';\\n }\\n if ((statusInt & 2) == 2) {\\n statusDevice += 'WIFISource,';\\n }\\n if ((statusInt & 4) == 4) {\\n statusDevice += 'CellTower,';\\n }\\n if ((statusInt & 8) == 8) {\\n statusDevice += 'BLELocation,';\\n }\\n if ((statusInt & 16) == 16) {\\n statusDevice += 'Charging,';\\n }\\n if ((statusInt & 32) == 32) {\\n statusDevice += 'FUllyCharged,';\\n }\\n if ((statusInt & 64) == 64) {\\n statusDevice += 'Reboot,';\\n }\\n if ((statusInt & 128) == 128) {\\n statusDevice += 'HistoricalData,';\\n }\\n if ((statusInt & 256) == 256) {\\n statusDevice += 'AGPSDataValid,';\\n }\\n if ((statusInt & 512) == 512) {\\n statusDevice += 'Motion,';\\n }\\n if ((statusInt & 1024) == 1024) {\\n statusDevice += 'SmartLocating,';\\n }\\n if ((statusInt & 2048) == 2048) {\\n statusDevice += 'BeaconLocation,';\\n }\\n if ((statusInt & 4096) == 4096) {\\n statusDevice += 'BLEConnected,';\\n }\\n statusDevice = statusDevice.slice(0, -1);\\n // debug('statusHex:' + statusHex)\\n statusHex = (statusHex);\\n statusHex = hexToBin(statusHex);\\n statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\n // debug(statusHex)\\n battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\n // debug(battery_percentage)\\n // debug(battery_percentage)\\n // debug(statusHex.substring(8, 13))\\n cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\n // debug(cellNetworkSignal)\\n workMode = parseInt(statusHex.substring(13, 16), 2);\\n // debug(workMode)\\n general += 'statusDevice:' + statusDevice + ';';\\n if (battery_percentage) {\\n general += 'battery:' + battery_percentage + ';';\\n }\\n if (cellNetworkSignal) {\\n general += 'cellNetworkSignal:' + cellNetworkSignal + ';';\\n }\\n if (workMode) {\\n general += 'workMode:' + workMode + ';';\\n }\\n }\\n }\\n // revisar\\n var gen_location = '0';\\n messageForReceiver = (`Watch-HTB;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n //messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n case '12': // Device requesting timestamp\\n timestamp = moment.utc().unix();\\n timestampHex = decimalToHex(timestamp);\\n timestampHex = changeEndianness(timestampHex);\\n keyLengthHex = ('00' + decimalToHex(1 + (timestampHex.length) / 2)).slice(-2);\\n // respond to device with the timestamp of the server\\n messageBody = messageBody + keyLengthHex + key + timestampHex;\\n messageForReceiver = `Eview;${imei};${sequenceID};Get timestamp`;\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n break;\\n case '21': //Cell Towers\\n var mccHex = value.substring(0, 2);\\n var mncHex = value.substring(2, 3);\\n var mcc = hexToDecimal(mccHex);\\n var mnc = hexToDecimal(mncHex);\\n var numTowers = (keyLength - 4) / 5;\\n var cellTowers = hexToAscii(value);\\n messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n case '22': // WIFI locations \\n location_type = 'WIFI';\\n var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\n //location_time = timestamp;\\n var wifiTowers = value;\\n general += 'wifiTowers:';\\n var indexWifi = 0;\\n var bssid_array = [];\\n gen_location = '';\\n for (let i = 0; i < numWifi; i++) {\\n gen_location += wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\n indexWifi += 14;\\n }\\n gen_location = gen_location.slice(0, -1);\\n general += gen_location;\\n if (alarmCode) {\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};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 = (`Watch-ACK;${imei};${message}`); // ${sequenceID}; add ${sequenceID}; 19-07\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n var value = message.substring(index, index = index + keyLength - 2);\\n if (typeof configIds !== 'undefined' && configIds && configIds.ConfigureDevice && configIds.ConfigureDevice.LastConfigured) { // when is defined\\n AddValue(configsToUpdate, configIds.ConfigureDevice.LastConfigured, moment().format('YYYY/MM/DD, HH:mm:ss'));\\n configsToAck.push(configIds.ConfigureDevice.LastConfigured);\\n }\\n //}\\n }\\n if (command == 'FE') {\\n while (index < total_length + 16) {\\n var keyLength = message.substring(index, index = index + 2);\\n keyLength = 2 * hexToDecimal(keyLength);\\n var key = message.substring(index, index = index + 2);\\n var value = message.substring(index, index = index + keyLength - 2);\\n }\\n }\\n // prepare the ACK msg and change config if it is needed\\n lengthAck = messageBody.length / 2;\\n lengthAck = ('0000' + decimalToHex(lengthAck)).slice(-4);\\n lengthAck = lengthAck.toString().substring(2, 4) + lengthAck.toString().substring(0, 2);\\n ////////////checksum CRC 16\\n var checksumAck = byteStringToByteArray(messageBody);\\n checksumAck = crc16byte(checksumAck);\\n checksumAck = decimalToHex(checksumAck);\\n checksumAck = ('0000' + checksumAck).slice(-4);\\n checksumAck = checksumAck.toString().substring(2, 4) + checksumAck.toString().substring(0, 2);\\n prefix = prefix + lengthAck + checksumAck + sequenceID;\\n // To send ACK to the device previous to internal msg with parts\\n if (needsAck == true) {\\n if (messageBody.length <= 2) {\\n ack = 'AB00030008C7' + sequenceID + '7F0100'; // change AB10030008C7 to AB00030008C7\\n } else {\\n ack = prefix + messageBody;\\n }\\n AddValue(codeValues, 'imei', imei);\\n AddValue(codeValues, 'ack', ack);\\n }\\n } else { // checksum was invalid - print out useful debug info and bet quess at imei \\n AddValue(codeValues, \\\"error\\\", \\\"checksum failed for message\\\");\\n AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n i = rawFromBytes.search('3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]');\\n if (i >= 0) {\\n imei = hexToAscii(rawFromBytes.substring(i, i + 30));\\n AddValue(codeValues, \\\"imei\\\", imei);\\n }\\n }\\n }\\n // Auxiliary functions\\n function buildDataToReceiver(codeValues, configsToAck = [], configsToUpdate = [], configsToSend = []) {\\n const dataToReceiver = {\\n values: codeValues\\n };\\n if (configsToAck.length > 0) {\\n dataToReceiver.configsToAck = configsToAck;\\n }\\n if (configsToUpdate.length > 0) {\\n dataToReceiver.configsToUpdate = configsToUpdate;\\n }\\n if (configsToSend.length > 0) {\\n dataToReceiver.configsToSend = configsToSend;\\n }\\n return dataToReceiver;\\n }\\n\\n function AddValue(codeValueArray, p1, p2) { // push code value pair into array\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n codeValueArray.push(cvpair);\\n }\\n // convert functions\\n function asciiToHex(str) { // ascii to hex \\n return [...str].map(char => char.charCodeAt(0).toString(16).padStart(2, '0')).join('');\\n }\\n\\n function byteStringToByteArray(str) { // convierte una cadena hexadecimal en un array de bytes (number[])\\n const bytes = [];\\n for (let i = 0; i < str.length; i += 2) {\\n const byte = parseInt(str.substring(i, i + 2), 16);\\n if (!isNaN(byte) && byte >= 0 && byte <= 255) {\\n bytes.push(byte);\\n }\\n }\\n return bytes;\\n }\\n\\n function decimalToHex(x) {\\n return Number(x).toString(16).toUpperCase();\\n }\\n\\n function hexToBin(hex) { // convierte un valor hexadecimal a su representación binaria, y asegura que tenga al menos 8 bits \\n const bin = parseInt(hex, 16).toString(2);\\n return bin.padStart(hex.length * 4, '0');\\n }\\n\\n function hexToAscii(hex) {\\n if (hex.length % 2 !== 0) {\\n throw new Error(\\\"Hex string length must be even\\\");\\n }\\n let ascii = '';\\n for (let i = 0; i < hex.length; i += 2) {\\n const byte = hex.substr(i, 2);\\n const charCode = parseInt(byte, 16);\\n if (charCode !== 0) { // remove null character (\\\\u0000)\\n ascii += String.fromCharCode(charCode);\\n }\\n }\\n return ascii;\\n //return hex.match(/.{2}/g).map(byte => String.fromCharCode(parseInt(byte, 16))).join('');\\n }\\n\\n function hexToDecimalSigned(hex) { // hex to decimal\\n if (hex.length % 2 !== 0) {\\n hex = '0' + hex;\\n }\\n const num = parseInt(hex, 16);\\n const bits = hex.length * 4;\\n const maxVal = 2 ** bits;\\n return num >= maxVal / 2 ? num - maxVal : num;\\n }\\n\\n function hexToDecimal(hex) {\\n return parseInt(hex, 16);\\n }\\n // CheckSum and debug functions\\n function changeEndianness(hexString) { // changeEndianness\\n if (hexString.length === 0) { //if string is empty or not defined\\n return \\\"\\\";\\n }\\n if (hexString.length % 2 !== 0) {\\n throw new Error(\\\"Hex string length must be even\\\");\\n }\\n return hexString.match(/.{2}/g) // divide in bytes (2 chars)\\n .reverse() // reverse the order\\n .join('');\\n }\\n\\n function calculateCheckSum(payloadData) { // calcula el CRC16 sobre una cadena hexadecimal y devuelve el valor con el endianness invertido\\n const bytes = byteStringToByteArray(payloadData);\\n const crc = crc16byte(bytes);\\n const hex = crc.toString(16).padStart(4, '0').toUpperCase();\\n return changeEndianness(hex);\\n }\\n\\n function crc16byte(byteArray) { // calcula el CRC-16 sobre un array de bytes usando una tabla precalculada (crcTable)\\n let crc = 0x0000;\\n for (const byte of byteArray) {\\n if (byte < 0 || byte > 255 || !Number.isInteger(byte)) {\\n throw new RangeError(\\\"Invalid byte value in input array\\\");\\n }\\n const index = (byte ^ (crc >> 8)) & 0xFF;\\n crc = crcTable[index] ^ (crc << 8);\\n }\\n return crc & 0xFFFF;\\n }\\n\\n function debug(...args) { // write debug info to console log, if localTesting\\n if (localTesting) {\\n console.debug('[DEBUG]', ...args);\\n }\\n }\\n /*\\n function sendMessageToLocalhostNoWait(str) { // sends message to system, closing connection after\\n var server;\\n if (localTesting) {\\n console.log('local testing - sending to protocol-dev server the message ... '); // port 5878\\n console.log(str);\\n server = '52.174.17.77';\\n } else {\\n server = '127.0.0.1';\\n }\\n var c = net.createConnection(5878, server);\\n c.on('error', function(error) {\\n c = net.createConnection(5878, server);\\n });\\n c.write(`${str}`);\\n c.end();\\n }*/\\n function sendMessageToLocalhostNoWait(message) {\\n const server = localTesting ? '52.174.17.77' : '127.0.0.1';\\n //const port = localTesting ? '5878' : ''; //Protocol-dev\\n const port = '5678'; //acceptance-dev\\n if (localTesting) {\\n console.debug('[DEBUG] Sending message to test server:', message);\\n }\\n const client = net.createConnection(port, server, () => {\\n client.write(message);\\n client.end();\\n });\\n client.on('error', (err) => {\\n console.error(`[ERROR] Failed to send message to ${server}:${port}:`, err.message);\\n });\\n client.on('end', () => {\\n if (localTesting) {\\n console.debug('[DEBUG] Connection closed');\\n }\\n });\\n }\\n}\\n// params is not defined locally -> export as module\\nif (typeof(params) === 'undefined') {\\n module.exports = {\\n execute_ops\\n }\\n} else { // on server use local defined vars\\n let return_values = execute_ops(moment, msg, net, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\n // define global returns\\n msg = return_values;\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1751886283},{"Type":1,"NewValue":"{\"Id\":437,\"Name\":\"Access TEC Care Watch\",\"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 // Watch protocol - please see variables and typical values in order below\\n // Watch-CYC;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;SIGNAL=<>;WM=<>;GENERAL=<>\\n // Watch-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\n //\\n // Author: Juanmi Navarro\\n // Created: 01/01/0000\\n // Last modified: 20/05/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', 'Watch');\\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 = (`Watch-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 var allowedCID = ['3036', '06'];\\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 //<>,<>,<> \\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 //<>,<>,<> \\n if (mac2) {\\n AddValue(codeValues, 'beacon_mac', mac2);\\n var simpleQuery2 = [{\\n 'code': 'Mac',\\n 'value': mac2,\\n }];\\n var simpleQueryLabel2 = {\\n 'table': 'beacons',\\n 'select': 'Name',\\n 'query': simpleQuery2\\n };\\n var labels2 = [];\\n labels2.push(JSON.stringify(simpleQueryLabel2));\\n AddValue(codeValues, 'oysta_labels', JSON.stringify(labels2));\\n }\\n if (params.beacon_major) {\\n AddValue(codeValues, 'beacon_major', params.beacon_major);\\n } else {\\n AddValue(codeValues, 'beacon_major', 0);\\n }\\n if (params.beacon_minor) {\\n AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\n } else {\\n AddValue(codeValues, 'beacon_minor', 0);\\n }\\n //AddValue(codeValues,'oysta_labels', label);\\n //AddValue(codeValues,'oysta_value', mac);\\n if (location_time) {\\n AddValue(codeValues, 'location_time', location_time);\\n }\\n }\\n /* meter mas tarde... \\n if (params.smart_data !== 'undefined') {\\n var gen_location = params.smart_data.split(',')\\n var latitude = gen_location[0]\\n var longitude = gen_location[1]\\n var location_accuracy = gen_location[2]\\n var altitude = gen_location[3]\\n AddValue(codeValues,'latitude', latitude);\\n AddValue(codeValues,'longitude', longitude);\\n AddValue(codeValues,'altitude', altitude);\\n AddValue(codeValues,'location_accuracy', location_accuracy);\\n }\\n */\\n /*else if ((params.event_time) && (params.event_time == '')) {\\n var event_time = moment.utc().unix();\\n AddValue(codeValues,'event_time', event_time);\\n } revisar mas adelante*/\\n // to parse SMS info from the device\\n switch (messageTypeLocalCode) {\\n case 'COMM-SMS': // SMS message sent in\\n if (params.data.startsWith('Device location request')) {\\n configsToAck.push(configIds.Controls.RealTimeLocate);\\n } else if (params.data.startsWith('Set IP ok')) {\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\n } else if (params.data.startsWith('IMEI:')) {\\n configsToAck.push(configIds.Controls.GetFirmwareVersion);\\n } else if (params.data.startsWith('Set IP ok')) {\\n configsToAck.push(configIds.Controls.ClearBufferedMessages);\\n } else if (params.data.startsWith('flush ok')) {\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\n } else if (params.data.startsWith('Set Watch-')) {\\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 = (`Watch-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 = (`Watch;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 = (`Watch;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 = (`Watch-RTL;${params.imei};${location_time};${location_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n break;\\n }\\n if (!params.event_time && !event_time) { // if params.event_time undefined - set it to now. \\n var event_time = moment.utc().unix();\\n AddValue(codeValues, 'event_time', event_time);\\n }\\n // if (!params.location_time && !location_time) { // if params.location_time undefined - set it to now. \\n // var location_time = moment.utc().unix();\\n // AddValue(codeValues, 'location_time', location_time);\\n //}\\n }\\n // send data msg to kibana\\n const data = buildDataToReceiver(codeValues, configsToAck, configsToUpdate, configsToSend);\\n console.log(data);\\n return data\\n // end of main operation\\n // define functions used in operation\\n // decode global msg\\n function decoder(str) { // decode rawdata\\n // CARE Decoder\\n AddValue(codeValues, 'Message : ', str);\\n var message = str;\\n // need to check if checksum is correct for possible msg corruption 10/03/23\\n var checksum = message.substring(8, 12);\\n var messageBody = message.substring(16, message.length);\\n debug('message =' + message);\\n debug('checksum =' + checksum);\\n debug('calculateCheckSum =' + calculateCheckSum(messageBody));\\n if (calculateCheckSum(messageBody) == checksum) { // payload is valid\\n debug(\\\"message has valid checksum\\\");\\n var messageBody = command; // update value for the ACK\\n debug('command =' + command);\\n if (command == '01') {\\n while (index < total_length + 16) {\\n var keyLengthHex = message.substring(index, index = index + 2);\\n var keyLength = 2 * hexToDecimal(keyLengthHex);\\n var key = message.substring(index, index = index + 2);\\n var value = message.substring(index, index = index + keyLength - 2);\\n debug('key = ' + key);\\n debug('value = ' + value);\\n switch (key) {\\n //Device ID\\n case '01':\\n var imei = hexToAscii(value);\\n // create long connection if it is needed\\n if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\n //no 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\\n if ((alarmCodeExtInt & 1) == 1) {\\n var alarm = 'ALF-C';\\n }\\n // Welfare Check-out\\n else if ((alarmCodeExtInt & 2) == 2) {\\n var alarm = 'ALA-C';\\n }\\n // Standard Alerts\\n //Battery low\\n else if ((alarmCodeInt & 1) == 1) {\\n var alarm = 'BATL';\\n }\\n //Overspeed\\n else if ((alarmCodeInt & 2) == 2) {\\n var alarm = 'ALSP';\\n }\\n //Fall\\n else if ((alarmCodeInt & 4) == 4) {\\n var alarm = 'ALF';\\n }\\n //Tilt\\n else if ((alarmCodeInt & 8) == 8) {\\n var alarm = 'Tilt';\\n } else if ((alarmCodeInt & 16) == 16) {\\n if ((alarmCodeInt & 16777216) == 16777216) {\\n var alarm = 'Geo1-IN';\\n } else {\\n var alarm = 'Geo1-OUT';\\n }\\n } else if ((alarmCodeInt & 32) == 32) {\\n if ((alarmCodeInt & 33554432) == 33554432) {\\n var alarm = 'Geo2-IN';\\n } else {\\n var alarm = 'Geo2-OUT';\\n }\\n } else if ((alarmCodeInt & 64) == 64) {\\n if ((alarmCodeInt & 67108864) == 67108864) {\\n var alarm = 'Geo3-IN';\\n } else {\\n var alarm = 'Geo3-OUT';\\n }\\n } else if ((alarmCodeInt & 128) == 128) {\\n if ((alarmCodeInt & 134217728) == 134217728) {\\n var alarm = 'Geo4-IN';\\n } else {\\n var alarm = 'Geo4-OUT';\\n }\\n }\\n //Power Off\\n else if ((alarmCodeInt & 256) == 256) {\\n var alarm = 'PWRF';\\n }\\n //Power On\\n else if ((alarmCodeInt & 512) == 512) {\\n var alarm = 'PWRN';\\n }\\n //Motion\\n else if ((alarmCodeInt & 1024) == 1024) {\\n var alarm = 'ALMOV';\\n }\\n //No Motion\\n else if ((alarmCodeInt & 2048) == 2048) {\\n var alarm = 'ALNM';\\n }\\n //SOS\\n else if ((alarmCodeInt & 4096) == 4096) {\\n var alarm = 'ALSOS';\\n } else if ((alarmCodeInt & 8192) == 8192) {\\n var alarm = 'Side1';\\n } else if ((alarmCodeInt & 16384) == 16384) {\\n var alarm = 'Side2';\\n }\\n //Battery charging\\n else if ((alarmCodeInt & 32768) == 32768) {\\n var alarm = 'BATCN';\\n }\\n //Battery no charging\\n else if ((alarmCodeInt & 65536) == 65536) {\\n var alarm = 'BATCF';\\n }\\n //SOS Ending\\n // Temporary Commented until we know exactly how it works. 22/09/2022\\n else if ((alarmCodeInt & 131072) == 131072) {\\n var alarm = 'SOSEnding';\\n info = 'Alarm Finished';\\n }\\n //Amber Alert EC03 only\\n else if ((alarmCodeInt & 262144) == 262144) {\\n var alarm = 'ALAO';\\n }\\n // welfare Alert check-in ALA-O\\n else if ((alarmCodeInt & 524288) == 524288) {\\n var alarm = 'ALA-O';\\n }\\n // Amber alert Ending ALA-C\\n else if ((alarmCodeInt & 1048576) == 1048576) {\\n var alarm = 'ALA-C';\\n }\\n // Amber alert Ending ALA-C\\n //else if ((alarmCodeInt & 1048576) == 1048576) {\\n // var alarm = 'ALA-C';\\n //}\\n // Fall-Down Alert ending\\n else if ((alarmCodeInt & 2097152) == 2097152) {\\n var alarm = 'ALF-C';\\n }\\n // welfare Alert Ending ALA\\n else if ((alarmCodeInt & 4194304) == 4194304) {\\n var alarm = 'ALA';\\n }\\n // Beacon absent Alert 11/10/22. Need to be added in msg types\\n //else if ((alarmCodeInt & 16777216) == 16777216) {\\n // var alarm = 'BEA';\\n //}\\n general += 'alarm:' + alarm + ',';\\n break;\\n //Custom ID\\n case '03':\\n customID = value;\\n if (!allowedCID.includes(value)) {\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\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 //no 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 //<>,<>,<>,<>,<>\\n gps_data = `${latitude},${longitude},${location_accuracy},${speed},${direction},${altitude},${satellites},${mileage}`;\\n general += 'gps location (lat):' + latitude + ', (long):' + longitude + ',';\\n break;\\n //WIFI Towers\\n case '22':\\n location_type = 'WIFI';\\n var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\n //location_time = timestamp;\\n var wifiTowers = value;\\n general += 'wifiTowers:';\\n var indexWifi = 0;\\n var bssid_array = [];\\n wifi_data = '';\\n for (let i = 0; i < numWifi; i++) {\\n wifi_data += hexToDecimalSigned(wifiTowers.substring(indexWifi, indexWifi + 2)) + ',' + wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\n indexWifi += 14;\\n }\\n wifi_data = wifi_data.slice(0, -1);\\n general += wifi_data;\\n break;\\n //BLE Location Added 10/10/22\\n case '23':\\n location_type = 'BLE';\\n var mac = value.substring(0, 12);\\n var latitudeHex = value.substring(12, 20);\\n var longitudeHex = value.substring(20, 28);\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n var address = hexToAscii(value.substring(28, value.length));\\n var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\n // add : format in MAC\\n mac = mac.match(/.{1,2}/g).join(':');\\n // location_time = timestamp;\\n ble_data = `${latitude},${longitude},${mac},${address}`;\\n general += 'BLE location (lat):' + latitude + ', (long):' + longitude + ',';\\n break;\\n //General Data , status_data\\n case '24':\\n if (!allowedCID.includes(customID)) {\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n AddValue(codeValues, \\\"customID\\\", customID);\\n return\\n }\\n if (alarmCode) {\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = '';\\n //= gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\n } else if (statusDevice) {\\n messageForReceiver = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};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 = '';\\n //= gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\n }\\n //else {\\n // messageForReceiver = (`CareWatch-CYC;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};`);\\n //}\\n // reset variables\\n //alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\n var timestampHex = value.substring(0, 8);\\n timestampHex = changeEndianness(timestampHex);\\n timestamp = hexToDecimal(timestampHex);\\n location_time = timestamp;\\n event_time = timestamp;\\n // HardCode to fix possible issue in protocol\\n //event_time = moment.utc().unix();\\n // end of hard code\\n var statusHex = changeEndianness(value.substring(8, 16));\\n var statusInt = hexToDecimal(statusHex);\\n var statusDevice = '';\\n if ((statusInt & 1) == 1) {\\n statusDevice += 'GPS,';\\n }\\n if ((statusInt & 2) == 2) {\\n statusDevice += 'WIFISource,';\\n }\\n if ((statusInt & 4) == 4) {\\n statusDevice += 'CellTower,';\\n }\\n if ((statusInt & 8) == 8) {\\n statusDevice += 'BLELocation,';\\n }\\n //params.BatteryStatus.BatteryStatus = '1';\\n if ((statusInt & 16) == 16) {\\n statusDevice += 'Charging,';\\n // var alarm = 'BATCN';\\n //configs.BatteryStatus.BatteryStatus = '1';\\n /* if (configs.BatteryStatus.BatteryStatus !== '1') {\\n hasConfigs = true;\\n var batteryStatus = '1';\\n var alarm = 'BATCN';\\n let configsToUpdate = [];\\n configsToUpdate.push({\\n 'code': configIds.BatteryStatus.BatteryStatus,\\n 'value': batteryStatus\\n });\\n }*/\\n }\\n if ((statusInt & 32) == 32) {\\n statusDevice += 'FUllyCharged,';\\n //var alarm = 'BATF';\\n // configs.BatteryStatus.BatteryStatus = '3';\\n /* if (configs.BatteryStatus.BatteryStatus !== '3') {\\n hasConfigs = true;\\n var batteryStatus = '3';\\n var alarm = 'BATF';\\n let configsToUpdate = [];\\n configsToUpdate.push({\\n 'code': configIds.BatteryStatus.BatteryStatus,\\n 'value': batteryStatus\\n });\\n }*/\\n }\\n /* if (!((statusInt & 32) == 32) & !((statusInt & 16) == 16)) {\\n statusDevice += 'Not Charging,';\\n var alarm = 'BATCF';\\n //configs.BatteryStatus.BatteryStatus = '2';\\n if (configs.BatteryStatus.BatteryStatus !== '2') {\\n var batteryStatus = '2';\\n var alarm = 'BATCF';\\n let configsToUpdate = [];\\n configsToUpdate.push({\\n 'code': configIds.BatteryStatus.BatteryStatus,\\n 'value': batteryStatus\\n });\\n }\\n }*/\\n if ((statusInt & 64) == 64) {\\n statusDevice += 'Reboot,';\\n }\\n if ((statusInt & 128) == 128) {\\n statusDevice += 'HistoricalData,';\\n }\\n if ((statusInt & 256) == 256) {\\n statusDevice += 'AGPSDataValid,';\\n }\\n if ((statusInt & 512) == 512) {\\n statusDevice += 'Motion,';\\n }\\n if ((statusInt & 1024) == 1024) {\\n statusDevice += 'SmartLocating,';\\n }\\n if ((statusInt & 2048) == 2048) { //isHome\\n statusDevice += 'BeaconLocation,';\\n }\\n if ((statusInt & 4096) == 4096) {\\n statusDevice += 'BLEConnected,';\\n }\\n if ((statusInt & 16384) == 16384) {\\n statusDevice += 'HomeWiFi,';\\n }\\n statusDevice = statusDevice.slice(0, -1);\\n status_data = statusDevice; //to oysta template\\n //statusHex = (statusHex);\\n statusHex = hexToBin(statusHex);\\n statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\n battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\n cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\n workMode = parseInt(statusHex.substring(13, 16), 2);\\n general += 'statusDevice:' + statusDevice + ',';\\n if (battery_percentage) {\\n general += 'battery:' + battery_percentage + ',';\\n }\\n if (cellNetworkSignal) {\\n general += 'cellNetworkSignal:' + cellNetworkSignal + ',';\\n }\\n if (workMode) {\\n general += 'workMode:' + workMode + ',';\\n }\\n //messageForReceiver = (`CareWatch-CYC;${imei};${i};${event_time};${battery_percentage}`);\\n break;\\n //Call Records\\n case '25':\\n //Needed?\\n break;\\n //BLE Location 2\\n case '26':\\n //I don't understand\\n //messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n //Smart Location\\n case '27':\\n location_type = 'SMART';\\n var latitudeHex = value.substring(0, 8);\\n var longitudeHex = value.substring(8, 16);\\n var location_accuracyHex = value.substring(16, 20);\\n var altitudeHex = value.substring(20, 24);\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n var altitude = hexToDecimal(changeEndianness(altitudeHex));\\n //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\n //04/08/2022 se quita el multiplicador por 5 pq ya viene el valor en metros\\n location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\n //location_time = timestamp;\\n smart_data = `${latitude},${longitude},${location_accuracy},${altitude}`;\\n general += 'smart location (lat):' + latitude + ', (long):' + longitude + ',';\\n break;\\n //Beacon Location Added 11/10/22\\n case '28':\\n location_type = 'BEACON';\\n // var alarm = 'EBZI';\\n var latitudeHex = '00';\\n var longitudeHex = '00';\\n var descr = 'empty';\\n var flag = hexToDecimal(value.substring(0, 1));\\n var beacId = hexToDecimal(value.substring(1, 2));\\n // msg includes descrip\\n if ((flag & 4) == 4) {\\n descr = hexToAscii(value.substring(18, value.length));\\n }\\n // msg includes lat/lon\\n if ((flag & 8) == 8) {\\n latitudeHex = value.substring(18, 26);\\n longitudeHex = value.substring(26, 34);\\n }\\n // msg includes lat/lon and description\\n if ((flag & 12) == 12) {\\n latitudeHex = value.substring(18, 26);\\n longitudeHex = value.substring(26, 34);\\n descr = hexToAscii(value.substring(34, value.length));\\n }\\n var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\n // add : format in MAC\\n mac = mac.match(/.{1,2}/g).join(':');\\n var rssiHex = value.substring(14, 16);\\n var rssi1Hex = value.substring(16, 18);\\n rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\n rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\n // var latitudeHex = value.substring(18, 26);\\n // var longitudeHex = value.substring(26, 34);\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n //location_time = timestamp;\\n beacon_data = `${latitude},${longitude},${mac},${descr}`;\\n general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (listIndex):' + beacId + ',';\\n break;\\n // Beacon V2\\n case '2C':\\n location_type = 'BEACON';\\n // var alarm = 'EBZI';\\n var latitudeHex = '00';\\n var longitudeHex = '00';\\n var descr = 'empty';\\n var flag = hexToDecimal(value.substring(0, 1));\\n var beacId = hexToDecimal(value.substring(1, 2));\\n // msg includes descrip\\n if ((flag & 4) == 4) {\\n let desc_leng = hexToDecimal(value.substring(20, 22));\\n descr = hexToAscii(value.substring(22, 22 + (2 * desc_leng)));\\n //descr = hexToAscii(value.substring(18, value.length));\\n }\\n // msg includes lat/lon\\n if ((flag & 8) == 8) {\\n latitudeHex = value.substring(18, 26);\\n longitudeHex = value.substring(26, 34);\\n }\\n // msg includes lat/lon and description\\n if ((flag & 12) == 12) {\\n latitudeHex = value.substring(20, 28);\\n longitudeHex = value.substring(28, 36);\\n let desc_leng = hexToDecimal(value.substring(36, 38));\\n descr = hexToAscii(value.substring(38, 38 + (2 * desc_leng)));\\n }\\n var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\n // add : format in MAC\\n mac = mac.match(/.{1,2}/g).join(':');\\n var rssiHex = value.substring(14, 16);\\n var rssi1Hex = value.substring(16, 18);\\n rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\n rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\n var battery_beacon = hexToDecimal(value.substring(18, 20));\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n //location_time = timestamp;\\n beacon_data = `${latitude},${longitude},${mac},${descr}`;\\n general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (battery):' + battery_beacon + ', (listIndex):' + beacId + ',';\\n break;\\n //Cell Towers Note\\n case '29':\\n location_type = 'LBS';\\n lbs_data = '';\\n var mccHex = changeEndianness(value.substring(0, 4));\\n var mncHex = value.substring(4, 6);\\n var mcc = hexToDecimal(mccHex);\\n lbs_data += mcc + ',';\\n var mnc = hexToDecimal(mncHex);\\n lbs_data += mnc + ',';\\n var indexLbs = 6;\\n var numTowers = (hexToDecimal(keyLengthHex) - 4) / 7;\\n for (let i = 0; i < numTowers; i++) {\\n var rxlHex = changeEndianness(value.substring(indexLbs, indexLbs + 2));\\n var rxl = hexToDecimal(rxlHex);\\n var lacHex = changeEndianness(value.substring(indexLbs + 2, indexLbs + 6));\\n var lac = hexToDecimal(lacHex);\\n var cellTowers = hexToDecimal(changeEndianness(value.substring(indexLbs + 6, indexLbs + 14)));\\n lbs_data += rxl + ',' + lac + ',' + cellTowers + ',';\\n indexLbs += 14;\\n }\\n lbs_data = lbs_data.slice(0, -1);\\n general += lbs_data;\\n break;\\n case '30':\\n //G-sensor.\\n 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 = (`Watch-${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 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 = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n }\\n break;\\n //BLE Connected . For Flic button\\n case '62':\\n location_type = 'BLE';\\n //var alarm = 'EBZI'; \\n //var latitudeHex = '00';\\n //var longitudeHex = '00';\\n //var descr = 'empty';\\n var flag = hexToDecimal(value.substring(0, 2)); // 0= Disconnected, 1= Connected\\n var mac = value.substring(2, 14); // No hace falta darle la vuelta\\n // add : format in MAC\\n mac = mac.match(/.{1,2}/g).join(':');\\n var batLevel = hexToDecimal(value.substring(14, 16)); // 0-100\\n //location_time = timestamp;\\n ble_data = `${flag},${batLevel},${mac}`;\\n general += 'BLE location (State):' + flag + ', (bat):' + batLevel + ', (mac):' + mac + ',';\\n break;\\n }\\n }\\n if (alarmCode) {\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};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 = (`Watch;ACK-FIRM;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\n //AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\n configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\n //configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\n //messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n case '1A':\\n //no ACK need\\n var fwVersion = hexToAscii(value);\\n imei = serverParams.Imei;\\n AddValue(codeValues, \\\"imei\\\", imei);\\n AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\n messageForReceiver = (`Watch;ACK-FIRM;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\n //AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\n configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\n //configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\n break;\\n //IMEI\\n case '03':\\n var imei = hexToDecimal(value);\\n // harcode to avoid conflicts with Rio protocol\\n //if ((imei != '860470063029395') && (imei != '860470063035947')) {\\n // AddValue(codeValues, \\\"error\\\", \\\"device imei is not in this protocol\\\");\\n // AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n //AddValue(codeValues, \\\"IMEI\\\", imei);\\n // return\\n //}\\n if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\n //return;\\n }\\n messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n //ICCID\\n case '04':\\n var iccid = hexToDecimal(value);\\n messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n //BLE-MAC\\n case '05':\\n var bleMac = hexToDecimal(value);\\n messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n //Run Time\\n case '07':\\n var runTime = hexToDecimal(value);\\n messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n case '10': // Ringer Volume\\n var volume = hexToDecimal(value);\\n imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-VOL;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"Volume\\\", volume);\\n AddValue(configsToUpdate, configIds.ReadSystemSettings.Volume, volume);\\n configsToAck.push(configIds.ReadSystemSettings.Volume);\\n break;\\n case '0A': //Performance mode\\n //var workMode = hexToDecimal(value);\\n //messageBody = messageBody + keyLengthHex + key + value;\\n //AddValue(codeValues, \\\"WorkMode\\\", workMode);\\n //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\n //configsToAck.push(configIds.ReadPerformance`Settings.Mode);\\n //var workMode = hexToAscii(value.substring(0, value.length));\\n //var workMode = hexToDecimal(value);\\n //var workMode = hexToAscii(value.substring(0, value.length));\\n var workMode = 1234; // + value + \\\"end\\\";\\n //var workModeVal = 9;\\n //workMode = 'test10';\\n imei = serverParams.Imei;\\n messageForReceiver = (`Watch;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 '0F': // Enable control.... Used for STEP COUNTING SETTINGS\\n // 'FF FF 21 80'\\n var StepStatus = hexToBin(value.substring(4, 6));\\n var enalbleDisable = '';\\n if (StepStatus.substring(7, 8) == '1') {\\n var step = 'Enable, '\\n enalbleDisable = '1'\\n } else {\\n var step = 'Disable, '\\n };\\n //var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\n //hrate += detectingInterval;\\n AddValue(codeValues, \\\"step\\\", step);\\n //var imei = serverParams.Imei;\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(configsToUpdate, configIds.ReadStepsSettings.EnableDisableReadStepsSettings, enalbleDisable);\\n //AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\n configsToAck.push(configIds.ReadStepsSettings.EnableDisableReadStepsSettings);\\n //configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\n break;\\n case '1B':\\n //Decimal o ascii?\\n var gsmModule = hexToDecimal(value);\\n messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n case '1F':\\n //System Language\\n var systemLanguage = hexToAscii(value.substring(0, value.length));\\n imei = serverParams.Imei;\\n //messageBody = messageBody + keyLengthHex + key + value;\\n messageForReceiver = (`Watch;ACK-LANG;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"SystemLanguage\\\", systemLanguage);\\n AddValue(configsToUpdate, configIds.ReadSystemSettings.SystemLanguage, systemLanguage);\\n configsToAck.push(configIds.ReadSystemSettings.SystemLanguage);\\n break;\\n case '33': // phone option\\n // [Value]:83 0B 00 00 {\\\"phoneOption\\\":{\\\"flag_value\\\":2947,\\\"s3\\\":1,\\\"s4\\\":0,\\\"s5\\\":1,\\\"s6\\\":0,\\\"callIncoming\\\":0,\\\"rings\\\":3,\\\"s7\\\":0,\\\"toneID\\\":0,\\\"s1\\\":1,\\\"s2\\\":1}}\\n var statusPhone = hexToBin(value.substring(0, 2)); // To find autoanswer setup\\n if (statusPhone.substring(0, 1) == '1') { // 1 Enable\\n var auto = 'true';\\n } else var auto = 'false';\\n statusPhone = hexToBin(value.substring(2, 4)); // To find allow list setup\\n if (statusPhone.substring(7, 8) == '1') { // 1 Enable\\n allow = 'true';\\n } else var allow = 'false';\\n //statusPhone = hexToBin(value.substring(0, 2)) + hexToBin(value.substring(2, 4));\\n //AddValue(configsToUpdate, configIds.ReadSystemSettings.Statusphone, statusPhone);\\n AddValue(configsToUpdate, configIds.ReadSystemSettings.AllowList, allow);\\n AddValue(configsToUpdate, configIds.ReadSystemSettings.AutoAnswer, auto);\\n //configsToAck.push(configIds.ReadSystemSettings.Statusphone);\\n configsToAck.push(configIds.ReadSystemSettings.AllowList);\\n configsToAck.push(configIds.ReadSystemSettings.AutoAnswer);\\n break;\\n case '34': //ContactList with name\\n var contactNumber = value.substring(1, 2);\\n var telLength = hexToDecimal(value.substring(2, 4));\\n var tel = '';\\n switch (contactNumber) {\\n // Emergency Number\\n case '0':\\n tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\n AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\n AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\n configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\n break;\\n // Speed Dial Number\\n //case '1':\\n // tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\n // AddValue(codeValues, \\\"SpeedDialNumber\\\", tel);\\n // AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.SpeedDialNumber, tel);\\n // configsToAck.push(configIds.ReadSpeedDialSettings.SpeedDialNumber);\\n // break;\\n // Gateway Number\\n case '9': //00447781482635,Esendex UK 0034627177148,Esendex Spain 00447507288240,Esendex UK Acceptance\\n tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\n if (tel.includes('447781482635') || tel.includes('00447781482635')) {\\n tel = 'Esendex UK'\\n } else if (tel.includes('34627177148') || tel.includes('0034627177148')) {\\n tel = 'Esendex Spain'\\n } else if (tel.includes('447507288240') || tel.includes('00447507288240')) {\\n tel = 'Esendex UK Acceptance'\\n } else {\\n tel = 'Default'\\n }\\n AddValue(codeValues, \\\"SMSGateway\\\", tel);\\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\n configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\n break;\\n default:\\n tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\n if (tel.length < 6) {\\n contacts += '';\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\n break;\\n }\\n //contacts += 'A' + (contactNumber - 1) + ': ' + tel + ', ';\\n contacts += tel + ', ';\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\n break;\\n }\\n break;\\n case '40': // APN\\n //no ACK need\\n AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'));\\n configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\n var apn = hexToAscii(value.substring(0, value.length));\\n imei = serverParams.Imei;\\n break;\\n case '41': // APN Username\\n //no ACK need\\n //apn = apn + ',' + hexToAscii(value.substring(0, value.length));\\n break;\\n case '42': // APN Password\\n //no ACK need\\n //apn = apn + ',' + hexToAscii(value.substring(0, value.length));\\n messageForReceiver = (`Watch;ACK-GDATA;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"apn\\\", apn);\\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.APN, apn);\\n configsToAck.push(configIds.ReadCommunicationSettings.APN);\\n break;\\n case '43': //Server Details\\n //52.232.85.255,5678 production 52.174.17.77,5678 acceptance\\n var serverDetails = hexToAscii(value.substring(6, value.length)) + ':' + hexToDecimal(value.substring(4, 6) + value.substring(2, 4));\\n if (serverDetails.includes('52.232.85.255:5678')) {\\n serverDetails = 'Production'\\n } else if (serverDetails.includes('52.174.17.77:5678')) {\\n serverDetails = 'Acceptance'\\n } else if (serverDetails.includes('52.174.17.77:5778')) {\\n serverDetails = 'Protocol-Import'\\n } else if (serverDetails.includes('52.174.17.77:5878')) {\\n serverDetails = 'Protocol-Dev'\\n } else {\\n serverDetails = 'Default'\\n }\\n AddValue(codeValues, \\\"server\\\", serverDetails);\\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.Server, serverDetails);\\n configsToAck.push(configIds.ReadCommunicationSettings.Server);\\n break;\\n case '44': //time interval - work mode intervals\\n imei = serverParams.Imei;\\n messageForReceiver = (`Watch;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 '46': //HeartRate\\n // '10 0E 00 80'\\n var HeartRateStatus = hexToBin(value.substring(6, 8));\\n var enalbleDisable = '';\\n if (HeartRateStatus.substring(0, 1) == '1') {\\n var hrate = 'Enable, '\\n enalbleDisable = '1'\\n } else {\\n var hrate = 'Disable, '\\n };\\n var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\n hrate += detectingInterval;\\n AddValue(codeValues, \\\"hrate\\\", hrate);\\n //var imei = serverParams.Imei;\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings, enalbleDisable);\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\n configsToAck.push(configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings);\\n configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\n break;\\n case '47': // Custom Id\\n imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-CUSTID;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"customeid\\\", value);\\n AddValue(configsToUpdate, configIds.ReadState.CustomId, hexToAscii(value)); //now it comes \\\"3036\\\"\\n configsToAck.push(configIds.ReadState.CustomId);\\n break;\\n case '53': // Non motion alert\\n //2B020080\\n var status = hexToBin(value.substring(6, 8));\\n var alertSetting = '';\\n var enableDisable = '';\\n if (status.substring(0, 1) == '1') {\\n alertSetting = 'Enable, '\\n enableDisable = '1';\\n } else {\\n alertSetting = 'Disable, '\\n };\\n //if (status.substring(5, 6) == '1') {\\n // alertSetting += 'Dial, '\\n //} else {\\n // alertSetting += 'No Dial, '\\n //};\\n var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\n alertSetting += time;\\n imei = serverParams.Imei;\\n // commented until Eview fixes this function\\n /*\\n messageForReceiver = (`Watch;ACK-NOMOTION;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"nomotion\\\", alertSetting);\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings, enableDisable);\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\n configsToAck.push(configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings);\\n configsToAck.push(configIds.ReadNonMovementSettings.Time);\\n */\\n break;\\n case '56': //Fall down sensibility\\n // '00001100'\\n var fallStatus = hexToBin(value.substring(0, 2));\\n var enalbleDisable = '';\\n //if (fallStatus.substring(4, 5) == '1') {\\n if (fallStatus.substring(0, 1) == '1') {\\n var sensibility = 'Enable, '\\n enalbleDisable = '1'\\n } else {\\n var sensibility = 'Disable, '\\n };\\n if (fallStatus.substring(5, 6) == '1') {\\n sensibility += 'Dial, '\\n } else {\\n sensibility += 'No Dial, '\\n };\\n var imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-FALLALERT;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n var sesibityOptionValue = hexToDecimal(value.substring(1, 2));\\n sensibility += sesibityOptionValue;\\n AddValue(codeValues, \\\"sensibility\\\", sensibility);\\n //AddValue(configsToUpdate, configIds.ReadAlertSettings.FallSettings, sensibility);\\n AddValue(configsToUpdate, configIds.ReadFallSettings.EnableDisableFallSettings, enalbleDisable);\\n AddValue(configsToUpdate, configIds.ReadFallSettings.Sensitivity, sesibityOptionValue);\\n //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\n configsToAck.push(configIds.ReadFallSettings.EnableDisableFallSettings);\\n configsToAck.push(configIds.ReadFallSettings.Sensitivity);\\n break;\\n case '73': //BeaconList\\n var beaconNumber = hexToDecimal(value.substring(1, 2));\\n var beaconStatus = hexToBin(value.substring(0, 1));\\n beaconStatus = hexToAscii(value.substring(30, value.length));\\n //beaconStatus = changeEndianness(value.substring(30, value.length));\\n //homeBeacon += 'B' + (beaconNumber + 1) + ': ' + beaconStatus + ', ';\\n homeBeacon += beaconStatus + ', ';\\n AddValue(codeValues, \\\"homeBeacon\\\", homeBeacon);\\n messageForReceiver = (`Watch;ACK-GDATA;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\n configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\n break;\\n case '4A': //Wifi Network List\\n var wifiSSIDLenght = hexToDecimal(value.substring(2, 4));\\n var wifiPasswordLenght = hexToDecimal(value.substring(4, 6));\\n var wifiIndex = hexToDecimal(value.substring(1, 2));\\n //var wifiStatus = hexToDecimal(value.substring(0, 1));\\n var wifiStatus = value.substring(0, 1);\\n /*var enalbleDisable = wifiSSID = wifiPassword = homeWifi = '';\\n /var homeWifi = '';\\n if (wifiIndex == '0') { // Only first Wifi of the list\\n if (wifiStatus == '8') {\\n homeWifi += ' Enable, '\\n enalbleDisable = '1';\\n } else {\\n homeWifi += ' Disable, '\\n //enalbleDisable = '0';\\n };*/\\n if ((wifiStatus == '8') || (wifiStatus == 'C')) { // 8 == ON OR C== ON and Connected\\n var wifiSSID = hexToAscii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\n var wifiPassword = hexToAscii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\n var imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-WIFI;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n //homeWiFi += 'W' + (wifiIndex + 1) + ': ' + wifiSSID + ', ' + wifiPassword + ';';\\n homeWiFi += wifiSSID + ', ' + wifiPassword + ';';\\n AddValue(codeValues, \\\"wifi\\\", homeWiFi);\\n AddValue(configsToUpdate, configIds.ReadWiFiList.WiFiList, homeWiFi);\\n configsToAck.push(configIds.ReadWiFiList.WiFiList);\\n }\\n //AddValue(configsToUpdate, configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings, enalbleDisable);\\n //AddValue(configsToUpdate, configIds.ReadWiFiSettings.SSID, wifiSSID);\\n //AddValue(configsToUpdate, configIds.ReadWiFiSettings.Password, wifiPassword);\\n //configsToAck.push(configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings);\\n //configsToAck.push(configIds.ReadWiFiSettings.SSID);\\n //configsToAck.push(configIds.ReadWiFiSettings.Password);\\n break;\\n case '21': // Speed Dial Settings\\n // [Value]:53 84 {\\\"call1Button\\\":{\\\"mode\\\":0,\\\"feedBack\\\":3,\\\"task\\\":2,\\\"time\\\":20,\\\"status\\\":1}}\\n var status = hexToBin(value.substring(2, 4)); //always pass 2 HEXs to this function\\n var alertSetting = '';\\n var enalbleDisable = '';\\n if (status.substring(0, 1) == '1') {\\n alertSetting = 'Enable, '\\n enalbleDisable = '1'\\n } else {\\n alertSetting = 'Disable, '\\n //enableDisable = '0';\\n };\\n //var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\n //alertSetting += time;\\n imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-SPEED;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"speed\\\", alertSetting);\\n AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\n configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\n break;\\n }\\n }\\n }\\n if (command == '03') {\\n while (index < total_length + 16) {\\n var keyLengthHex = message.substring(index, index = index + 2);\\n var keyLength = 2 * hexToDecimal(keyLengthHex);\\n var key = message.substring(index, index = index + 2);\\n var value = message.substring(index, index = index + keyLength - 2);\\n debug('key = ' + key);\\n debug('value = ' + value);\\n switch (key) {\\n case '01': // Device ID\\n var imei = hexToAscii(value);\\n // create long connection if it is needed\\n if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\n //return;\\n }\\n break;\\n case '10': // Heartbeat\\n var heartbeat = hexToAscii(value);\\n event_time = moment.utc().unix();\\n if (index < total_length + 16) {\\n var keyLengthHex = message.substring(index, index = index + 2);\\n keyLength = 2 * hexToDecimal(keyLengthHex);\\n key = message.substring(index, index = index + 2);\\n if (key == '24') {\\n // debug('key: ' + key) //comment those out\\n value = message.substring(index, index = index + keyLength - 2);\\n // debug(value)\\n var timestampHex = value.substring(0, 8);\\n // debug('timestampt hex: ' + timestampHex)\\n timestampHex = changeEndianness(timestampHex);\\n timestamp = hexToDecimal(timestampHex);\\n event_time = timestamp;\\n // debug(event_time)\\n var statusHex = changeEndianness(value.substring(8, 16));\\n // debug(statusHex)\\n var statusInt = hexToDecimal(statusHex);\\n var statusDevice = '';\\n if ((statusInt & 1) == 1) {\\n statusDevice += 'GPS,';\\n }\\n if ((statusInt & 2) == 2) {\\n statusDevice += 'WIFISource,';\\n }\\n if ((statusInt & 4) == 4) {\\n statusDevice += 'CellTower,';\\n }\\n if ((statusInt & 8) == 8) {\\n statusDevice += 'BLELocation,';\\n }\\n if ((statusInt & 16) == 16) {\\n statusDevice += 'Charging,';\\n }\\n if ((statusInt & 32) == 32) {\\n statusDevice += 'FUllyCharged,';\\n }\\n if ((statusInt & 64) == 64) {\\n statusDevice += 'Reboot,';\\n }\\n if ((statusInt & 128) == 128) {\\n statusDevice += 'HistoricalData,';\\n }\\n if ((statusInt & 256) == 256) {\\n statusDevice += 'AGPSDataValid,';\\n }\\n if ((statusInt & 512) == 512) {\\n statusDevice += 'Motion,';\\n }\\n if ((statusInt & 1024) == 1024) {\\n statusDevice += 'SmartLocating,';\\n }\\n if ((statusInt & 2048) == 2048) {\\n statusDevice += 'BeaconLocation,';\\n }\\n if ((statusInt & 4096) == 4096) {\\n statusDevice += 'BLEConnected,';\\n }\\n statusDevice = statusDevice.slice(0, -1);\\n // debug('statusHex:' + statusHex)\\n statusHex = (statusHex);\\n statusHex = hexToBin(statusHex);\\n statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\n // debug(statusHex)\\n battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\n // debug(battery_percentage)\\n // debug(battery_percentage)\\n // debug(statusHex.substring(8, 13))\\n cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\n // debug(cellNetworkSignal)\\n workMode = parseInt(statusHex.substring(13, 16), 2);\\n // debug(workMode)\\n general += 'statusDevice:' + statusDevice + ';';\\n if (battery_percentage) {\\n general += 'battery:' + battery_percentage + ';';\\n }\\n if (cellNetworkSignal) {\\n general += 'cellNetworkSignal:' + cellNetworkSignal + ';';\\n }\\n if (workMode) {\\n general += 'workMode:' + workMode + ';';\\n }\\n }\\n }\\n // revisar\\n var gen_location = '0';\\n messageForReceiver = (`Watch-HTB;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n //messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n case '12': // Device requesting timestamp\\n timestamp = moment.utc().unix();\\n timestampHex = decimalToHex(timestamp);\\n timestampHex = changeEndianness(timestampHex);\\n keyLengthHex = ('00' + decimalToHex(1 + (timestampHex.length) / 2)).slice(-2);\\n // respond to device with the timestamp of the server\\n messageBody = messageBody + keyLengthHex + key + timestampHex;\\n messageForReceiver = `Eview;${imei};${sequenceID};Get timestamp`;\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n break;\\n case '21': //Cell Towers\\n var mccHex = value.substring(0, 2);\\n var mncHex = value.substring(2, 3);\\n var mcc = hexToDecimal(mccHex);\\n var mnc = hexToDecimal(mncHex);\\n var numTowers = (keyLength - 4) / 5;\\n var cellTowers = hexToAscii(value);\\n messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n case '22': // WIFI locations \\n location_type = 'WIFI';\\n var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\n //location_time = timestamp;\\n var wifiTowers = value;\\n general += 'wifiTowers:';\\n var indexWifi = 0;\\n var bssid_array = [];\\n gen_location = '';\\n for (let i = 0; i < numWifi; i++) {\\n gen_location += wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\n indexWifi += 14;\\n }\\n gen_location = gen_location.slice(0, -1);\\n general += gen_location;\\n if (alarmCode) {\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};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 = (`Watch-ACK;${imei};${message}`); // ${sequenceID}; add ${sequenceID}; 19-07\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n var value = message.substring(index, index = index + keyLength - 2);\\n if (typeof configIds !== 'undefined' && configIds && configIds.ConfigureDevice && configIds.ConfigureDevice.LastConfigured) { // when is defined\\n AddValue(configsToUpdate, configIds.ConfigureDevice.LastConfigured, moment().format('YYYY/MM/DD, HH:mm:ss'));\\n configsToAck.push(configIds.ConfigureDevice.LastConfigured);\\n }\\n //}\\n }\\n if (command == 'FE') {\\n while (index < total_length + 16) {\\n var keyLength = message.substring(index, index = index + 2);\\n keyLength = 2 * hexToDecimal(keyLength);\\n var key = message.substring(index, index = index + 2);\\n var value = message.substring(index, index = index + keyLength - 2);\\n }\\n }\\n // prepare the ACK msg and change config if it is needed\\n lengthAck = messageBody.length / 2;\\n lengthAck = ('0000' + decimalToHex(lengthAck)).slice(-4);\\n lengthAck = lengthAck.toString().substring(2, 4) + lengthAck.toString().substring(0, 2);\\n ////////////checksum CRC 16\\n var checksumAck = byteStringToByteArray(messageBody);\\n checksumAck = crc16byte(checksumAck);\\n checksumAck = decimalToHex(checksumAck);\\n checksumAck = ('0000' + checksumAck).slice(-4);\\n checksumAck = checksumAck.toString().substring(2, 4) + checksumAck.toString().substring(0, 2);\\n prefix = prefix + lengthAck + checksumAck + sequenceID;\\n // To send ACK to the device previous to internal msg with parts\\n if (needsAck == true) {\\n if (messageBody.length <= 2) {\\n ack = 'AB00030008C7' + sequenceID + '7F0100'; // change AB10030008C7 to AB00030008C7\\n } else {\\n ack = prefix + messageBody;\\n }\\n AddValue(codeValues, 'imei', imei);\\n AddValue(codeValues, 'ack', ack);\\n }\\n } else { // checksum was invalid - print out useful debug info and bet quess at imei \\n AddValue(codeValues, \\\"error\\\", \\\"checksum failed for message\\\");\\n AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n i = rawFromBytes.search('3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]');\\n if (i >= 0) {\\n imei = hexToAscii(rawFromBytes.substring(i, i + 30));\\n AddValue(codeValues, \\\"imei\\\", imei);\\n }\\n }\\n }\\n // Auxiliary functions\\n function buildDataToReceiver(codeValues, configsToAck = [], configsToUpdate = [], configsToSend = []) {\\n const dataToReceiver = {\\n values: codeValues\\n };\\n if (configsToAck.length > 0) {\\n dataToReceiver.configsToAck = configsToAck;\\n }\\n if (configsToUpdate.length > 0) {\\n dataToReceiver.configsToUpdate = configsToUpdate;\\n }\\n if (configsToSend.length > 0) {\\n dataToReceiver.configsToSend = configsToSend;\\n }\\n return dataToReceiver;\\n }\\n\\n function AddValue(codeValueArray, p1, p2) { // push code value pair into array\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n codeValueArray.push(cvpair);\\n }\\n // convert functions\\n function asciiToHex(str) { // ascii to hex \\n return [...str].map(char => char.charCodeAt(0).toString(16).padStart(2, '0')).join('');\\n }\\n\\n function byteStringToByteArray(str) { // convierte una cadena hexadecimal en un array de bytes (number[])\\n const bytes = [];\\n for (let i = 0; i < str.length; i += 2) {\\n const byte = parseInt(str.substring(i, i + 2), 16);\\n if (!isNaN(byte) && byte >= 0 && byte <= 255) {\\n bytes.push(byte);\\n }\\n }\\n return bytes;\\n }\\n\\n function decimalToHex(x) {\\n return Number(x).toString(16).toUpperCase();\\n }\\n\\n function hexToBin(hex) { // convierte un valor hexadecimal a su representación binaria, y asegura que tenga al menos 8 bits \\n const bin = parseInt(hex, 16).toString(2);\\n return bin.padStart(hex.length * 4, '0');\\n }\\n\\n function hexToAscii(hex) {\\n if (hex.length % 2 !== 0) {\\n throw new Error(\\\"Hex string length must be even\\\");\\n }\\n let ascii = '';\\n for (let i = 0; i < hex.length; i += 2) {\\n const byte = hex.substr(i, 2);\\n const charCode = parseInt(byte, 16);\\n if (charCode !== 0) { // remove null character (\\\\u0000)\\n ascii += String.fromCharCode(charCode);\\n }\\n }\\n return ascii;\\n //return hex.match(/.{2}/g).map(byte => String.fromCharCode(parseInt(byte, 16))).join('');\\n }\\n\\n function hexToDecimalSigned(hex) { // hex to decimal\\n if (hex.length % 2 !== 0) {\\n hex = '0' + hex;\\n }\\n const num = parseInt(hex, 16);\\n const bits = hex.length * 4;\\n const maxVal = 2 ** bits;\\n return num >= maxVal / 2 ? num - maxVal : num;\\n }\\n\\n function hexToDecimal(hex) {\\n return parseInt(hex, 16);\\n }\\n // CheckSum and debug functions\\n function changeEndianness(hexString) { // changeEndianness\\n if (hexString.length === 0) { //if string is empty or not defined\\n return \\\"\\\";\\n }\\n if (hexString.length % 2 !== 0) {\\n throw new Error(\\\"Hex string length must be even\\\");\\n }\\n return hexString.match(/.{2}/g) // divide in bytes (2 chars)\\n .reverse() // reverse the order\\n .join('');\\n }\\n\\n function calculateCheckSum(payloadData) { // calcula el CRC16 sobre una cadena hexadecimal y devuelve el valor con el endianness invertido\\n const bytes = byteStringToByteArray(payloadData);\\n const crc = crc16byte(bytes);\\n const hex = crc.toString(16).padStart(4, '0').toUpperCase();\\n return changeEndianness(hex);\\n }\\n\\n function crc16byte(byteArray) { // calcula el CRC-16 sobre un array de bytes usando una tabla precalculada (crcTable)\\n let crc = 0x0000;\\n for (const byte of byteArray) {\\n if (byte < 0 || byte > 255 || !Number.isInteger(byte)) {\\n throw new RangeError(\\\"Invalid byte value in input array\\\");\\n }\\n const index = (byte ^ (crc >> 8)) & 0xFF;\\n crc = crcTable[index] ^ (crc << 8);\\n }\\n return crc & 0xFFFF;\\n }\\n\\n function debug(...args) { // write debug info to console log, if localTesting\\n if (localTesting) {\\n console.debug('[DEBUG]', ...args);\\n }\\n }\\n /*\\n function sendMessageToLocalhostNoWait(str) { // sends message to system, closing connection after\\n var server;\\n if (localTesting) {\\n console.log('local testing - sending to protocol-dev server the message ... '); // port 5878\\n console.log(str);\\n server = '52.174.17.77';\\n } else {\\n server = '127.0.0.1';\\n }\\n var c = net.createConnection(5878, server);\\n c.on('error', function(error) {\\n c = net.createConnection(5878, server);\\n });\\n c.write(`${str}`);\\n c.end();\\n }*/\\n function sendMessageToLocalhostNoWait(message) {\\n const server = localTesting ? '52.174.17.77' : '127.0.0.1';\\n //const port = localTesting ? '5878' : ''; //Protocol-dev\\n const port = '5678'; //acceptance-dev\\n if (localTesting) {\\n console.debug('[DEBUG] Sending message to test server:', message);\\n }\\n const client = net.createConnection(port, server, () => {\\n client.write(message);\\n client.end();\\n });\\n client.on('error', (err) => {\\n console.error(`[ERROR] Failed to send message to ${server}:${port}:`, err.message);\\n });\\n client.on('end', () => {\\n if (localTesting) {\\n console.debug('[DEBUG] Connection closed');\\n }\\n });\\n }\\n}\\n// params is not defined locally -> export as module\\nif (typeof(params) === 'undefined') {\\n module.exports = {\\n execute_ops\\n }\\n} else { // on server use local defined vars\\n let return_values = execute_ops(moment, msg, net, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\n // define global returns\\n msg = return_values;\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1754555071},{"Type":1,"NewValue":"{\"Id\":437,\"Name\":\"Access TEC Care Watch\",\"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 // Watch protocol - please see variables and typical values in order below\\r\\n // Watch-CYC;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;SIGNAL=<>;WM=<>;GENERAL=<>\\r\\n // Watch-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\r\\n //\\r\\n // Author: Juanmi Navarro\\r\\n // Created: 01/01/0000\\r\\n // Last modified: 18/09/2025\\r\\n //\\r\\n ///////////////////////////////////////////////////////////////////////////////\\r\\n if (typeof localTesting === \\\"undefined\\\") {\\r\\n let localTesting = false;\\r\\n }\\r\\n const crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,\\r\\n 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,\\r\\n 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,\\r\\n 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,\\r\\n 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,\\r\\n 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,\\r\\n 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,\\r\\n 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,\\r\\n 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,\\r\\n 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,\\r\\n 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,\\r\\n 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,\\r\\n 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,\\r\\n 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,\\r\\n 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,\\r\\n 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,\\r\\n 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,\\r\\n 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,\\r\\n 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,\\r\\n 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,\\r\\n 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,\\r\\n 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n ];\\r\\n var codeValues = [];\\r\\n AddValue(codeValues, 'protocol_template', 'Watch');\\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 = (`Watch-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 var allowedCID = ['3036', '06'];\\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 } 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 }\\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 //<>,<>,<> \\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];\\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 //<>,<>,<> \\r\\n if (mac2) {\\r\\n AddValue(codeValues, 'beacon_mac', mac2);\\r\\n var simpleQuery2 = [{\\r\\n 'code': 'Mac',\\r\\n 'value': mac2,\\r\\n }];\\r\\n var simpleQueryLabel2 = {\\r\\n 'table': 'beacons',\\r\\n 'select': 'Name',\\r\\n 'query': simpleQuery2\\r\\n };\\r\\n var labels2 = [];\\r\\n labels2.push(JSON.stringify(simpleQueryLabel2));\\r\\n AddValue(codeValues, 'oysta_labels', JSON.stringify(labels2));\\r\\n }\\r\\n if (params.beacon_major) {\\r\\n AddValue(codeValues, 'beacon_major', params.beacon_major);\\r\\n } else {\\r\\n AddValue(codeValues, 'beacon_major', 0);\\r\\n }\\r\\n if (params.beacon_minor) {\\r\\n AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\r\\n } else {\\r\\n AddValue(codeValues, 'beacon_minor', 0);\\r\\n }\\r\\n //AddValue(codeValues,'oysta_labels', label);\\r\\n //AddValue(codeValues,'oysta_value', mac);\\r\\n }\\r\\n /* meter mas tarde... \\r\\n if (params.smart_data !== 'undefined') {\\r\\n var gen_location = params.smart_data.split(',')\\r\\n var latitude = gen_location[0]\\r\\n var longitude = gen_location[1]\\r\\n var location_accuracy = gen_location[2]\\r\\n var altitude = gen_location[3]\\r\\n AddValue(codeValues,'latitude', latitude);\\r\\n AddValue(codeValues,'longitude', longitude);\\r\\n AddValue(codeValues,'altitude', altitude);\\r\\n AddValue(codeValues,'location_accuracy', location_accuracy);\\r\\n }\\r\\n */\\r\\n /*else if ((params.event_time) && (params.event_time == '')) {\\r\\n var event_time = moment.utc().unix();\\r\\n AddValue(codeValues,'event_time', event_time);\\r\\n } revisar mas adelante*/\\r\\n if (params.location_time) {\\r\\n AddValue(codeValues, 'location_time', params.location_time);\\r\\n }\\r\\n if (params.event_time) {\\r\\n AddValue(codeValues, 'event_time', params.event_time);\\r\\n }\\r\\n // to parse SMS info from the device\\r\\n switch (messageTypeLocalCode) {\\r\\n case 'COMM-SMS': // SMS message sent in\\r\\n if (params.data.startsWith('Device location request')) {\\r\\n configsToAck.push(configIds.Controls.RealTimeLocate);\\r\\n } else if (params.data.startsWith('Set IP ok')) {\\r\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n } else if (params.data.startsWith('IMEI:')) {\\r\\n configsToAck.push(configIds.Controls.GetFirmwareVersion);\\r\\n } else if (params.data.startsWith('Set IP ok')) {\\r\\n configsToAck.push(configIds.Controls.ClearBufferedMessages);\\r\\n } else if (params.data.startsWith('flush ok')) {\\r\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n } else if (params.data.startsWith('Set Watch-')) {\\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 = (`Watch-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 = (`Watch;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 = (`Watch;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 = (`Watch-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 // decode global msg\\r\\n function decoder(str) { // decode rawdata\\r\\n // CARE Decoder\\r\\n //AddValue(codeValues, 'Message : ', str);\\r\\n var message = str;\\r\\n var index = 18;\\r\\n //parse header & properties\\r\\n var properties = message.substring(2, 4);\\r\\n var lengthLittleEndian = message.substring(4, 8);\\r\\n var total_length = lengthLittleEndian.substring(2, 4) + lengthLittleEndian.substring(0, 2);\\r\\n total_length = 2 * hexToDecimal(total_length.substring(0, 4));\\r\\n var sequenceID = message.substring(12, 16);\\r\\n var command = message.substring(16, 18);\\r\\n //mask bitwise (properties should be '10')\\r\\n if ((parseInt(properties) & 8) == 8) {\\r\\n needsAck = true;\\r\\n } else needsAck = false;\\r\\n // need to check if checksum is correct for possible msg corruption 10/03/23\\r\\n var checksum = message.substring(8, 12);\\r\\n var messageBody = message.substring(16, message.length);\\r\\n debug('message =' + message);\\r\\n debug('checksum =' + checksum);\\r\\n debug('calculateCheckSum =' + calculateCheckSum(messageBody));\\r\\n if (calculateCheckSum(messageBody) == checksum) { // payload is valid\\r\\n debug(\\\"message has valid checksum\\\");\\r\\n var messageBody = command; // update value for the ACK\\r\\n debug('command =' + command);\\r\\n if (command == '01') {\\r\\n while (index < total_length + 16) {\\r\\n 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\\r\\n if ((alarmCodeExtInt & 1) == 1) {\\r\\n var alarm = 'ALF-C';\\r\\n }\\r\\n // Welfare Check-out\\r\\n else if ((alarmCodeExtInt & 2) == 2) {\\r\\n var alarm = 'ALA-C';\\r\\n }\\r\\n // Standard Alerts\\r\\n //Battery low\\r\\n else if ((alarmCodeInt & 1) == 1) {\\r\\n var alarm = 'BATL';\\r\\n }\\r\\n //Overspeed\\r\\n else if ((alarmCodeInt & 2) == 2) {\\r\\n var alarm = 'ALSP';\\r\\n }\\r\\n //Fall\\r\\n else if ((alarmCodeInt & 4) == 4) {\\r\\n var alarm = 'ALF';\\r\\n }\\r\\n //Tilt\\r\\n else if ((alarmCodeInt & 8) == 8) {\\r\\n var alarm = 'TLT';\\r\\n } else if ((alarmCodeInt & 16) == 16) {\\r\\n if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n var alarm = 'Geo1-IN';\\r\\n } else {\\r\\n var alarm = 'Geo1-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 32) == 32) {\\r\\n if ((alarmCodeInt & 33554432) == 33554432) {\\r\\n var alarm = 'Geo2-IN';\\r\\n } else {\\r\\n var alarm = 'Geo2-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 64) == 64) {\\r\\n if ((alarmCodeInt & 67108864) == 67108864) {\\r\\n var alarm = 'Geo3-IN';\\r\\n } else {\\r\\n var alarm = 'Geo3-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 128) == 128) {\\r\\n if ((alarmCodeInt & 134217728) == 134217728) {\\r\\n var alarm = 'Geo4-IN';\\r\\n } else {\\r\\n var alarm = 'Geo4-OUT';\\r\\n }\\r\\n }\\r\\n //Power Off\\r\\n else if ((alarmCodeInt & 256) == 256) {\\r\\n var alarm = 'PWRF';\\r\\n }\\r\\n //Power On\\r\\n else if ((alarmCodeInt & 512) == 512) {\\r\\n var alarm = 'PWRN';\\r\\n }\\r\\n //Motion\\r\\n else if ((alarmCodeInt & 1024) == 1024) {\\r\\n var alarm = 'ALMOV';\\r\\n }\\r\\n //No Motion\\r\\n else if ((alarmCodeInt & 2048) == 2048) {\\r\\n var alarm = 'ALNM';\\r\\n }\\r\\n //SOS\\r\\n else if ((alarmCodeInt & 4096) == 4096) {\\r\\n var alarm = 'ALSOS';\\r\\n } else if ((alarmCodeInt & 8192) == 8192) {\\r\\n var alarm = 'Side1';\\r\\n } else if ((alarmCodeInt & 16384) == 16384) {\\r\\n var alarm = 'Side2';\\r\\n }\\r\\n //Battery charging\\r\\n else if ((alarmCodeInt & 32768) == 32768) {\\r\\n var alarm = 'BATCN';\\r\\n }\\r\\n //Battery no charging\\r\\n else if ((alarmCodeInt & 65536) == 65536) {\\r\\n var alarm = 'BATCF';\\r\\n }\\r\\n //SOS Ending\\r\\n // Temporary Commented until we know exactly how it works. 22/09/2022\\r\\n else if ((alarmCodeInt & 131072) == 131072) {\\r\\n var alarm = 'ALA-F';\\r\\n info = 'Alarm Finished';\\r\\n }\\r\\n //Amber Alert EC03 only\\r\\n else if ((alarmCodeInt & 262144) == 262144) {\\r\\n var alarm = 'ALA';\\r\\n }\\r\\n // welfare Alert check-in ALA-O\\r\\n else if ((alarmCodeInt & 524288) == 524288) {\\r\\n var alarm = 'ALA-O';\\r\\n }\\r\\n // Amber alert Ending ALA-C\\r\\n else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n var alarm = 'ALA-C';\\r\\n }\\r\\n // Amber alert Ending ALA-C\\r\\n //else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n // var alarm = 'ALA-C';\\r\\n //}\\r\\n // Fall-Down Alert ending\\r\\n else if ((alarmCodeInt & 2097152) == 2097152) {\\r\\n var alarm = 'ALF-C';\\r\\n }\\r\\n // welfare Alert Ending ALA\\r\\n else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n var alarm = 'ALA';\\r\\n }\\r\\n // Beacon absent Alert 11/10/22. Need to be added in msg types\\r\\n //else if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n // var alarm = 'BEA';\\r\\n //}\\r\\n general += 'alarm:' + alarm + ',';\\r\\n break;\\r\\n //Custom ID\\r\\n case '03':\\r\\n customID = value;\\r\\n if (!allowedCID.includes(value)) {\\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 //<>,<>,<>,<>,<>\\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 if (!allowedCID.includes(customID)) {\\r\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n AddValue(codeValues, \\\"customID\\\", customID);\\r\\n return\\r\\n }\\r\\n if (alarmCode) {\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = '';\\r\\n //= gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n } else if (statusDevice) {\\r\\n messageForReceiver = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = '';\\r\\n //= 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 = '';\\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;\\r\\n var statusHex = changeEndianness(value.substring(8, 16));\\r\\n var statusInt = hexToDecimal(statusHex);\\r\\n var statusDevice = '';\\r\\n if ((statusInt & 1) == 1) {\\r\\n statusDevice += 'GPS,';\\r\\n }\\r\\n if ((statusInt & 2) == 2) {\\r\\n statusDevice += 'WIFISource,';\\r\\n }\\r\\n if ((statusInt & 4) == 4) {\\r\\n statusDevice += 'CellTower,';\\r\\n }\\r\\n if ((statusInt & 8) == 8) {\\r\\n statusDevice += 'BLELocation,';\\r\\n }\\r\\n //params.BatteryStatus.BatteryStatus = '1';\\r\\n if ((statusInt & 16) == 16) {\\r\\n statusDevice += 'Charging,';\\r\\n // var alarm = 'BATCN';\\r\\n //configs.BatteryStatus.BatteryStatus = '1';\\r\\n /* if (configs.BatteryStatus.BatteryStatus !== '1') {\\r\\n hasConfigs = true;\\r\\n var batteryStatus = '1';\\r\\n var alarm = 'BATCN';\\r\\n let configsToUpdate = [];\\r\\n configsToUpdate.push({\\r\\n 'code': configIds.BatteryStatus.BatteryStatus,\\r\\n 'value': batteryStatus\\r\\n });\\r\\n }*/\\r\\n }\\r\\n if ((statusInt & 32) == 32) {\\r\\n statusDevice += 'FUllyCharged,';\\r\\n //var alarm = 'BATF';\\r\\n // configs.BatteryStatus.BatteryStatus = '3';\\r\\n /* if (configs.BatteryStatus.BatteryStatus !== '3') {\\r\\n hasConfigs = true;\\r\\n var batteryStatus = '3';\\r\\n var alarm = 'BATF';\\r\\n let configsToUpdate = [];\\r\\n configsToUpdate.push({\\r\\n 'code': configIds.BatteryStatus.BatteryStatus,\\r\\n 'value': batteryStatus\\r\\n });\\r\\n }*/\\r\\n }\\r\\n /* if (!((statusInt & 32) == 32) & !((statusInt & 16) == 16)) {\\r\\n statusDevice += 'Not Charging,';\\r\\n var alarm = 'BATCF';\\r\\n //configs.BatteryStatus.BatteryStatus = '2';\\r\\n if (configs.BatteryStatus.BatteryStatus !== '2') {\\r\\n var batteryStatus = '2';\\r\\n var alarm = 'BATCF';\\r\\n let configsToUpdate = [];\\r\\n configsToUpdate.push({\\r\\n 'code': configIds.BatteryStatus.BatteryStatus,\\r\\n 'value': batteryStatus\\r\\n });\\r\\n }\\r\\n }*/\\r\\n if ((statusInt & 64) == 64) {\\r\\n statusDevice += 'Reboot,';\\r\\n }\\r\\n if ((statusInt & 128) == 128) {\\r\\n statusDevice += 'HistoricalData,';\\r\\n }\\r\\n if ((statusInt & 256) == 256) {\\r\\n statusDevice += 'AGPSDataValid,';\\r\\n }\\r\\n if ((statusInt & 512) == 512) {\\r\\n statusDevice += 'Motion,';\\r\\n }\\r\\n if ((statusInt & 1024) == 1024) {\\r\\n statusDevice += 'SmartLocating,';\\r\\n }\\r\\n if ((statusInt & 2048) == 2048) { //isHome\\r\\n statusDevice += 'BeaconLocation,';\\r\\n }\\r\\n if ((statusInt & 4096) == 4096) {\\r\\n statusDevice += 'BLEConnected,';\\r\\n }\\r\\n if ((statusInt & 16384) == 16384) {\\r\\n statusDevice += 'HomeWiFi,';\\r\\n }\\r\\n statusDevice = statusDevice.slice(0, -1);\\r\\n status_data = statusDevice; //to oysta template\\r\\n //statusHex = (statusHex);\\r\\n statusHex = hex2bin(statusHex);\\r\\n statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\r\\n battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\r\\n cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\r\\n workMode = parseInt(statusHex.substring(13, 16), 2);\\r\\n general += 'statusDevice:' + statusDevice + ',';\\r\\n if (battery_percentage) {\\r\\n general += 'battery:' + battery_percentage + ',';\\r\\n }\\r\\n if (cellNetworkSignal) {\\r\\n general += 'cellNetworkSignal:' + cellNetworkSignal + ',';\\r\\n }\\r\\n if (workMode) {\\r\\n general += 'workMode:' + workMode + ',';\\r\\n }\\r\\n //messageForReceiver = (`CareWatch-CYC;${imei};${i};${event_time};${battery_percentage}`);\\r\\n break;\\r\\n //Call Records\\r\\n case '25':\\r\\n //Needed?\\r\\n break;\\r\\n //BLE Location 2\\r\\n case '26':\\r\\n //I don't understand\\r\\n //messageBody = messageBody + keyLengthHex + key + value;\\r\\n break;\\r\\n //Smart Location\\r\\n case '27':\\r\\n location_type = 'SMART';\\r\\n var latitudeHex = value.substring(0, 8);\\r\\n var longitudeHex = value.substring(8, 16);\\r\\n var location_accuracyHex = value.substring(16, 20);\\r\\n var altitudeHex = value.substring(20, 24);\\r\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n var altitude = hexToDecimal(changeEndianness(altitudeHex));\\r\\n //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\r\\n //04/08/2022 se quita el multiplicador por 5 pq ya viene el valor en metros\\r\\n location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\r\\n //location_time = timestamp;\\r\\n smart_data = `${latitude},${longitude},${location_accuracy},${altitude}`;\\r\\n general += 'smart location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n break;\\r\\n //Beacon Location Added 11/10/22\\r\\n case '28':\\r\\n location_type = 'BEACON';\\r\\n // var alarm = 'EBZI';\\r\\n var latitudeHex = '00';\\r\\n var longitudeHex = '00';\\r\\n var descr = 'empty';\\r\\n var flag = hexToDecimal(value.substring(0, 1));\\r\\n var beacId = hexToDecimal(value.substring(1, 2));\\r\\n // msg includes descrip\\r\\n if ((flag & 4) == 4) {\\r\\n descr = hex_to_ascii(value.substring(18, value.length));\\r\\n }\\r\\n // msg includes lat/lon\\r\\n if ((flag & 8) == 8) {\\r\\n latitudeHex = value.substring(18, 26);\\r\\n longitudeHex = value.substring(26, 34);\\r\\n }\\r\\n // msg includes lat/lon and description\\r\\n if ((flag & 12) == 12) {\\r\\n latitudeHex = value.substring(18, 26);\\r\\n longitudeHex = value.substring(26, 34);\\r\\n descr = hex_to_ascii(value.substring(34, value.length));\\r\\n }\\r\\n var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n // add : format in MAC\\r\\n mac = mac.match(/.{1,2}/g).join(':');\\r\\n var rssiHex = value.substring(14, 16);\\r\\n var rssi1Hex = value.substring(16, 18);\\r\\n rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\r\\n rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\r\\n // var latitudeHex = value.substring(18, 26);\\r\\n // var longitudeHex = value.substring(26, 34);\\r\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n //location_time = timestamp;\\r\\n beacon_data = `${latitude},${longitude},${mac},${descr}`;\\r\\n general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (listIndex):' + beacId + ',';\\r\\n break;\\r\\n // Beacon V2\\r\\n case '2C':\\r\\n location_type = 'BEACON';\\r\\n // var alarm = 'EBZI';\\r\\n var latitudeHex = '00';\\r\\n var longitudeHex = '00';\\r\\n var descr = 'empty';\\r\\n var flag = hexToDecimal(value.substring(0, 1));\\r\\n var beacId = hexToDecimal(value.substring(1, 2));\\r\\n // msg includes descrip\\r\\n if ((flag & 4) == 4) {\\r\\n let desc_leng = hexToDecimal(value.substring(20, 22));\\r\\n descr = hex_to_ascii(value.substring(22, 22 + (2 * desc_leng)));\\r\\n //descr = hex_to_ascii(value.substring(18, value.length));\\r\\n }\\r\\n // msg includes lat/lon\\r\\n if ((flag & 8) == 8) {\\r\\n latitudeHex = value.substring(18, 26);\\r\\n longitudeHex = value.substring(26, 34);\\r\\n }\\r\\n // msg includes lat/lon and description\\r\\n if ((flag & 12) == 12) {\\r\\n latitudeHex = value.substring(20, 28);\\r\\n longitudeHex = value.substring(28, 36);\\r\\n let desc_leng = hexToDecimal(value.substring(36, 38));\\r\\n descr = hex_to_ascii(value.substring(38, 38 + (2 * desc_leng)));\\r\\n }\\r\\n var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n // add : format in MAC\\r\\n mac = mac.match(/.{1,2}/g).join(':');\\r\\n var rssiHex = value.substring(14, 16);\\r\\n var rssi1Hex = value.substring(16, 18);\\r\\n rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\r\\n rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\r\\n var battery_beacon = hexToDecimal(value.substring(18, 20));\\r\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n //location_time = timestamp;\\r\\n beacon_data = `${latitude},${longitude},${mac},${descr}`;\\r\\n general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (battery):' + battery_beacon + ', (listIndex):' + beacId + ',';\\r\\n break;\\r\\n //Cell Towers Note\\r\\n case '29':\\r\\n location_type = 'LBS';\\r\\n lbs_data = '';\\r\\n var mccHex = changeEndianness(value.substring(0, 4));\\r\\n var mncHex = value.substring(4, 6);\\r\\n var mcc = hexToDecimal(mccHex);\\r\\n lbs_data += mcc + ',';\\r\\n var mnc = hexToDecimal(mncHex);\\r\\n lbs_data += mnc + ',';\\r\\n var indexLbs = 6;\\r\\n var numTowers = (hexToDecimal(keyLengthHex) - 4) / 7;\\r\\n for (let i = 0; i < numTowers; i++) {\\r\\n var rxlHex = changeEndianness(value.substring(indexLbs, indexLbs + 2));\\r\\n var rxl = hexToDecimal(rxlHex);\\r\\n var lacHex = changeEndianness(value.substring(indexLbs + 2, indexLbs + 6));\\r\\n var lac = hexToDecimal(lacHex);\\r\\n var cellTowers = hexToDecimal(changeEndianness(value.substring(indexLbs + 6, indexLbs + 14)));\\r\\n lbs_data += rxl + ',' + lac + ',' + cellTowers + ',';\\r\\n indexLbs += 14;\\r\\n }\\r\\n lbs_data = lbs_data.slice(0, -1);\\r\\n general += lbs_data;\\r\\n break;\\r\\n case '30':\\r\\n //G-sensor.\\r\\n 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 = (`Watch-${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 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 = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n }\\r\\n break;\\r\\n //BLE Connected . For Flic button\\r\\n case '62':\\r\\n location_type = 'BLE';\\r\\n //var alarm = 'EBZI'; \\r\\n //var latitudeHex = '00';\\r\\n //var longitudeHex = '00';\\r\\n //var descr = 'empty';\\r\\n var flag = hexToDecimal(value.substring(0, 2)); // 0= Disconnected, 1= Connected\\r\\n var mac = value.substring(2, 14); // No hace falta darle la vuelta\\r\\n // add : format in MAC\\r\\n mac = mac.match(/.{1,2}/g).join(':');\\r\\n var batLevel = hexToDecimal(value.substring(14, 16)); // 0-100\\r\\n //location_time = timestamp;\\r\\n ble_data = `${flag},${batLevel},${mac}`;\\r\\n general += 'BLE location (State):' + flag + ', (bat):' + batLevel + ', (mac):' + mac + ',';\\r\\n break;\\r\\n }\\r\\n }\\r\\n if (alarmCode) {\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch;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 = (`Watch;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': // Ringer Volume\\r\\n var volume = hexToDecimal(value);\\r\\n imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;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 = (`Watch;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 '0F': // Enable control.... Used for STEP COUNTING SETTINGS\\r\\n // 'FF FF 21 80'\\r\\n var StepStatus = hex2bin(value.substring(4, 6));\\r\\n var enalbleDisable = '';\\r\\n if (StepStatus.substring(7, 8) == '1') {\\r\\n var step = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var step = 'Disable, '\\r\\n };\\r\\n //var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n //hrate += detectingInterval;\\r\\n AddValue(codeValues, \\\"step\\\", step);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadStepsSettings.EnableDisableReadStepsSettings, enalbleDisable);\\r\\n //AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadStepsSettings.EnableDisableReadStepsSettings);\\r\\n //configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\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 = (`Watch;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 '34': //ContactList with name\\r\\n var contactNumber = value.substring(1, 2);\\r\\n var telLength = hexToDecimal(value.substring(2, 4));\\r\\n var tel = '';\\r\\n switch (contactNumber) {\\r\\n // Emergency Number\\r\\n case '0':\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n break;\\r\\n // Speed Dial Number\\r\\n //case '1':\\r\\n // tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n // AddValue(codeValues, \\\"SpeedDialNumber\\\", tel);\\r\\n // AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.SpeedDialNumber, tel);\\r\\n // configsToAck.push(configIds.ReadSpeedDialSettings.SpeedDialNumber);\\r\\n // break;\\r\\n // Gateway Number\\r\\n case '9': //00447781482635,Esendex UK 0034627177148,Esendex Spain 00447507288240,Esendex UK Acceptance\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n if (tel.includes('447781482635') || tel.includes('00447781482635')) {\\r\\n tel = 'Esendex UK'\\r\\n } else if (tel.includes('34627177148') || tel.includes('0034627177148')) {\\r\\n tel = 'Esendex Spain'\\r\\n } else if (tel.includes('447507288240') || tel.includes('00447507288240')) {\\r\\n tel = 'Esendex UK Acceptance'\\r\\n } else {\\r\\n tel = 'Default'\\r\\n }\\r\\n AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n break;\\r\\n default:\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n if (tel.length < 6) {\\r\\n contacts += '';\\r\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n break;\\r\\n }\\r\\n //contacts += 'A' + (contactNumber - 1) + ': ' + tel + ', ';\\r\\n contacts += tel + ', ';\\r\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n break;\\r\\n }\\r\\n break;\\r\\n case '40': // APN\\r\\n //no ACK need\\r\\n AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'));\\r\\n configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\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 = (`Watch;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 = (`Watch;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 '46': //HeartRate\\r\\n // '10 0E 00 80'\\r\\n var HeartRateStatus = hex2bin(value.substring(6, 8));\\r\\n var enalbleDisable = '';\\r\\n if (HeartRateStatus.substring(0, 1) == '1') {\\r\\n var hrate = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var hrate = 'Disable, '\\r\\n };\\r\\n var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n hrate += detectingInterval;\\r\\n AddValue(codeValues, \\\"hrate\\\", hrate);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings);\\r\\n configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\r\\n break;\\r\\n case '47': // Custom Id\\r\\n imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;ACK-CUSTID;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"customeid\\\", value);\\r\\n AddValue(configsToUpdate, configIds.ReadState.CustomId, hex_to_ascii(value)); //now it comes \\\"3036\\\"\\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 // commented until Eview fixes this function\\r\\n /*\\r\\n messageForReceiver = (`Watch;ACK-NOMOTION;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"nomotion\\\", alertSetting);\\r\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings, enableDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n configsToAck.push(configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings);\\r\\n configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n */\\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 = (`Watch;ACK-FALLALERT;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n var sesibityOptionValue = hexToDecimal(value.substring(1, 2));\\r\\n sensibility += sesibityOptionValue;\\r\\n AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n //AddValue(configsToUpdate, configIds.ReadAlertSettings.FallSettings, sensibility);\\r\\n AddValue(configsToUpdate, configIds.ReadFallSettings.EnableDisableFallSettings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadFallSettings.Sensitivity, sesibityOptionValue);\\r\\n //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n configsToAck.push(configIds.ReadFallSettings.EnableDisableFallSettings);\\r\\n configsToAck.push(configIds.ReadFallSettings.Sensitivity);\\r\\n break;\\r\\n case '73': //BeaconList\\r\\n var beaconNumber = hexToDecimal(value.substring(1, 2));\\r\\n var beaconStatus = hex2bin(value.substring(0, 1));\\r\\n beaconStatus = hex_to_ascii(value.substring(30, value.length));\\r\\n //beaconStatus = changeEndianness(value.substring(30, value.length));\\r\\n //homeBeacon += 'B' + (beaconNumber + 1) + ': ' + beaconStatus + ', ';\\r\\n homeBeacon += beaconStatus + ', ';\\r\\n AddValue(codeValues, \\\"homeBeacon\\\", homeBeacon);\\r\\n messageForReceiver = (`Watch;ACK-GDATA;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n break;\\r\\n case '4A': //Wifi Network List\\r\\n var wifiSSIDLenght = hexToDecimal(value.substring(2, 4));\\r\\n var wifiPasswordLenght = hexToDecimal(value.substring(4, 6));\\r\\n var wifiIndex = hexToDecimal(value.substring(1, 2));\\r\\n //var wifiStatus = hexToDecimal(value.substring(0, 1));\\r\\n var wifiStatus = value.substring(0, 1);\\r\\n /*var enalbleDisable = wifiSSID = wifiPassword = homeWifi = '';\\r\\n /var homeWifi = '';\\r\\n if (wifiIndex == '0') { // Only first Wifi of the list\\r\\n if (wifiStatus == '8') {\\r\\n homeWifi += ' Enable, '\\r\\n enalbleDisable = '1';\\r\\n } else {\\r\\n homeWifi += ' Disable, '\\r\\n //enalbleDisable = '0';\\r\\n };*/\\r\\n if ((wifiStatus == '8') || (wifiStatus == 'C')) { // 8 == ON OR C== ON and Connected\\r\\n var wifiSSID = hex_to_ascii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\r\\n var wifiPassword = hex_to_ascii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\r\\n var imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;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 = (`Watch;ACK-SPEED;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"speed\\\", alertSetting);\\r\\n AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\r\\n configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\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 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 = (`Watch-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 = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch-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 if (typeof configIds !== 'undefined' && configIds && configIds.ConfigureDevice && configIds.ConfigureDevice.LastConfigured) { // when is defined\\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 }\\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":1758223135},{"Type":1,"NewValue":"{\"Id\":437,\"Name\":\"Access TEC Care Watch\",\"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 // Watch protocol - please see variables and typical values in order below\\n // Watch-CYC;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;SIGNAL=<>;WM=<>;GENERAL=<>\\n // Watch-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\n //\\n // Author: Juanmi Navarro\\n // Created: 01/01/0000\\n // Last modified: 18/09/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', 'Watch');\\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 = (`Watch-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 var allowedCID = ['3036', '06'];\\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 debug(message);\\n decodeHexStream(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 }\\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 }\\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 }\\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 //<>,<>,<> \\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 }\\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 //<>,<>,<> \\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 }\\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 if (params.location_time) {\\n AddValue(codeValues, 'location_time', params.location_time);\\n }\\n if (params.event_time) {\\n AddValue(codeValues, 'event_time', params.event_time);\\n }\\n // to parse SMS info from the device\\n switch (messageTypeLocalCode) {\\n case 'COMM-SMS': // SMS message sent in\\n if (params.data.startsWith('Device location request')) {\\n configsToAck.push(configIds.Controls.RealTimeLocate);\\n } else if (params.data.startsWith('Set IP ok')) {\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\n } else if (params.data.startsWith('IMEI:')) {\\n configsToAck.push(configIds.Controls.GetFirmwareVersion);\\n } else if (params.data.startsWith('Set IP ok')) {\\n configsToAck.push(configIds.Controls.ClearBufferedMessages);\\n } else if (params.data.startsWith('flush ok')) {\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\n } else if (params.data.startsWith('Set Watch-')) {\\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 = (`Watch-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 = (`Watch;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 = (`Watch;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 = (`Watch-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 // decode global msg\\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 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 //no 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 // if timestamp is older than 1 year, update it (AGPS bug)\\n if (timestamp < moment.utc().subtract(1, \\\"year\\\").unix()) {\\n timestamp += 619315200; //moment.utc().unix();\\n }\\n event_time = timestamp;\\n var alarmCodeInt = hexToDecimal(alarmCode);\\n var alarmCodeExt = value.substring(16, 24);\\n alarmCodeExt = changeEndianness(alarmCodeExt);\\n var alarmCodeExtInt = hexToDecimal(alarmCodeExt);\\n //Extended Alerts\\n // Fall off\\n if ((alarmCodeExtInt & 1) == 1) {\\n var alarm = 'ALF-C';\\n }\\n // Welfare Check-out\\n else if ((alarmCodeExtInt & 2) == 2) {\\n var alarm = 'ALA-C';\\n }\\n // Standard Alerts\\n //Battery low\\n else if ((alarmCodeInt & 1) == 1) {\\n var alarm = 'BATL';\\n }\\n //Overspeed\\n else if ((alarmCodeInt & 2) == 2) {\\n var alarm = 'ALSP';\\n }\\n //Fall\\n else if ((alarmCodeInt & 4) == 4) {\\n var alarm = 'ALF';\\n }\\n //Tilt\\n else if ((alarmCodeInt & 8) == 8) {\\n var alarm = 'TLT';\\n } else if ((alarmCodeInt & 16) == 16) {\\n if ((alarmCodeInt & 16777216) == 16777216) {\\n var alarm = 'Geo1-IN';\\n } else {\\n var alarm = 'Geo1-OUT';\\n }\\n } else if ((alarmCodeInt & 32) == 32) {\\n if ((alarmCodeInt & 33554432) == 33554432) {\\n var alarm = 'Geo2-IN';\\n } else {\\n var alarm = 'Geo2-OUT';\\n }\\n } else if ((alarmCodeInt & 64) == 64) {\\n if ((alarmCodeInt & 67108864) == 67108864) {\\n var alarm = 'Geo3-IN';\\n } else {\\n var alarm = 'Geo3-OUT';\\n }\\n } else if ((alarmCodeInt & 128) == 128) {\\n if ((alarmCodeInt & 134217728) == 134217728) {\\n var alarm = 'Geo4-IN';\\n } else {\\n var alarm = 'Geo4-OUT';\\n }\\n }\\n //Power Off\\n else if ((alarmCodeInt & 256) == 256) {\\n var alarm = 'PWRF';\\n }\\n //Power On\\n else if ((alarmCodeInt & 512) == 512) {\\n var alarm = 'PWRN';\\n }\\n //Motion\\n else if ((alarmCodeInt & 1024) == 1024) {\\n var alarm = 'ALMOV';\\n }\\n //No Motion\\n else if ((alarmCodeInt & 2048) == 2048) {\\n var alarm = 'ALNM';\\n }\\n //SOS\\n else if ((alarmCodeInt & 4096) == 4096) {\\n var alarm = 'ALSOS';\\n } else if ((alarmCodeInt & 8192) == 8192) {\\n var alarm = 'Side1';\\n } else if ((alarmCodeInt & 16384) == 16384) {\\n var alarm = 'Side2';\\n }\\n //Battery charging\\n else if ((alarmCodeInt & 32768) == 32768) {\\n var alarm = 'BATCN';\\n }\\n //Battery no charging\\n else if ((alarmCodeInt & 65536) == 65536) {\\n var alarm = 'BATCF';\\n }\\n //SOS Ending\\n // Temporary Commented until we know exactly how it works. 22/09/2022\\n else if ((alarmCodeInt & 131072) == 131072) {\\n var alarm = 'ALA-F';\\n info = 'Alarm Finished';\\n }\\n //Amber Alert EC03 only\\n else if ((alarmCodeInt & 262144) == 262144) {\\n var alarm = 'ALA';\\n }\\n // welfare Alert check-in ALA-O\\n else if ((alarmCodeInt & 524288) == 524288) {\\n var alarm = 'ALA-O';\\n }\\n // Amber alert Ending ALA-C\\n else if ((alarmCodeInt & 1048576) == 1048576) {\\n var alarm = 'ALA-C';\\n }\\n // Amber alert Ending ALA-C\\n //else if ((alarmCodeInt & 1048576) == 1048576) {\\n // var alarm = 'ALA-C';\\n //}\\n // Fall-Down Alert ending\\n else if ((alarmCodeInt & 2097152) == 2097152) {\\n var alarm = 'ALF-C';\\n }\\n // welfare Alert Ending ALA\\n else if ((alarmCodeInt & 4194304) == 4194304) {\\n var alarm = 'ALA';\\n }\\n // Beacon absent Alert 11/10/22. Need to be added in msg types\\n //else if ((alarmCodeInt & 16777216) == 16777216) {\\n // var alarm = 'BEA';\\n //}\\n general += 'alarm:' + alarm + ',';\\n break;\\n //Custom ID\\n case '03':\\n customID = value;\\n if (!allowedCID.includes(value)) {\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\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 //no 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 //<>,<>,<>,<>,<>\\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 if (!allowedCID.includes(customID)) {\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n AddValue(codeValues, \\\"customID\\\", customID);\\n return\\n }\\n if (alarmCode) {\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = '';\\n //= gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\n } else if (statusDevice) {\\n messageForReceiver = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};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 = '';\\n //= 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 = '';\\n //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 // if timestamp is older than 1 year, update it (AGPS bug)\\n if (timestamp < moment.utc().subtract(1, \\\"year\\\").unix()) {\\n timestamp += 619315200; //moment.utc().unix();\\n }\\n location_time = timestamp;\\n event_time = timestamp;\\n var statusHex = changeEndianness(value.substring(8, 16));\\n var statusInt = hexToDecimal(statusHex);\\n var statusDevice = '';\\n if ((statusInt & 1) == 1) {\\n statusDevice += 'GPS,';\\n }\\n if ((statusInt & 2) == 2) {\\n statusDevice += 'WIFISource,';\\n }\\n if ((statusInt & 4) == 4) {\\n statusDevice += 'CellTower,';\\n }\\n if ((statusInt & 8) == 8) {\\n statusDevice += 'BLELocation,';\\n }\\n //params.BatteryStatus.BatteryStatus = '1';\\n if ((statusInt & 16) == 16) {\\n statusDevice += 'Charging,';\\n // var alarm = 'BATCN';\\n //configs.BatteryStatus.BatteryStatus = '1';\\n /* if (configs.BatteryStatus.BatteryStatus !== '1') {\\n hasConfigs = true;\\n var batteryStatus = '1';\\n var alarm = 'BATCN';\\n let configsToUpdate = [];\\n configsToUpdate.push({\\n 'code': configIds.BatteryStatus.BatteryStatus,\\n 'value': batteryStatus\\n });\\n }*/\\n }\\n if ((statusInt & 32) == 32) {\\n statusDevice += 'FUllyCharged,';\\n //var alarm = 'BATF';\\n // configs.BatteryStatus.BatteryStatus = '3';\\n /* if (configs.BatteryStatus.BatteryStatus !== '3') {\\n hasConfigs = true;\\n var batteryStatus = '3';\\n var alarm = 'BATF';\\n let configsToUpdate = [];\\n configsToUpdate.push({\\n 'code': configIds.BatteryStatus.BatteryStatus,\\n 'value': batteryStatus\\n });\\n }*/\\n }\\n /* if (!((statusInt & 32) == 32) & !((statusInt & 16) == 16)) {\\n statusDevice += 'Not Charging,';\\n var alarm = 'BATCF';\\n //configs.BatteryStatus.BatteryStatus = '2';\\n if (configs.BatteryStatus.BatteryStatus !== '2') {\\n var batteryStatus = '2';\\n var alarm = 'BATCF';\\n let configsToUpdate = [];\\n configsToUpdate.push({\\n 'code': configIds.BatteryStatus.BatteryStatus,\\n 'value': batteryStatus\\n });\\n }\\n }*/\\n if ((statusInt & 64) == 64) {\\n statusDevice += 'Reboot,';\\n }\\n if ((statusInt & 128) == 128) {\\n statusDevice += 'HistoricalData,';\\n }\\n if ((statusInt & 256) == 256) {\\n statusDevice += 'AGPSDataValid,';\\n }\\n if ((statusInt & 512) == 512) {\\n statusDevice += 'Motion,';\\n }\\n if ((statusInt & 1024) == 1024) {\\n statusDevice += 'SmartLocating,';\\n }\\n if ((statusInt & 2048) == 2048) { //isHome\\n statusDevice += 'BeaconLocation,';\\n }\\n if ((statusInt & 4096) == 4096) {\\n statusDevice += 'BLEConnected,';\\n }\\n if ((statusInt & 16384) == 16384) {\\n statusDevice += 'HomeWiFi,';\\n }\\n statusDevice = statusDevice.slice(0, -1);\\n status_data = statusDevice; //to oysta template\\n //statusHex = (statusHex);\\n statusHex = 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 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 = (`Watch-${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 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 = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n }\\n break;\\n //BLE Connected . For Flic button\\n case '62':\\n location_type = 'BLE';\\n //var alarm = 'EBZI'; \\n //var latitudeHex = '00';\\n //var longitudeHex = '00';\\n //var descr = 'empty';\\n var flag = hexToDecimal(value.substring(0, 2)); // 0= Disconnected, 1= Connected\\n var mac = value.substring(2, 14); // No hace falta darle la vuelta\\n // add : format in MAC\\n mac = mac.match(/.{1,2}/g).join(':');\\n var batLevel = hexToDecimal(value.substring(14, 16)); // 0-100\\n //location_time = timestamp;\\n ble_data = `${flag},${batLevel},${mac}`;\\n general += 'BLE location (State):' + flag + ', (bat):' + batLevel + ', (mac):' + mac + ',';\\n break;\\n }\\n }\\n if (alarmCode) {\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};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 = (`Watch;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 = (`Watch;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 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 = (`Watch;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 = (`Watch;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 '0F': // Enable control.... Used for STEP COUNTING SETTINGS\\n // 'FF FF 21 80'\\n var StepStatus = hex2bin(value.substring(4, 6));\\n var enalbleDisable = '';\\n if (StepStatus.substring(7, 8) == '1') {\\n var step = 'Enable, '\\n enalbleDisable = '1'\\n } else {\\n var step = 'Disable, '\\n };\\n //var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\n //hrate += detectingInterval;\\n AddValue(codeValues, \\\"step\\\", step);\\n //var imei = serverParams.Imei;\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(configsToUpdate, configIds.ReadStepsSettings.EnableDisableReadStepsSettings, enalbleDisable);\\n //AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\n configsToAck.push(configIds.ReadStepsSettings.EnableDisableReadStepsSettings);\\n //configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\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 = (`Watch;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 '34': //ContactList with name\\n var contactNumber = value.substring(1, 2);\\n var telLength = hexToDecimal(value.substring(2, 4));\\n var tel = '';\\n switch (contactNumber) {\\n // Emergency Number\\n case '0':\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\n AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\n AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\n configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\n break;\\n // Speed Dial Number\\n //case '1':\\n // tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\n // AddValue(codeValues, \\\"SpeedDialNumber\\\", tel);\\n // AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.SpeedDialNumber, tel);\\n // configsToAck.push(configIds.ReadSpeedDialSettings.SpeedDialNumber);\\n // break;\\n // Gateway Number\\n case '9': //00447781482635,Esendex UK 0034627177148,Esendex Spain 00447507288240,Esendex UK Acceptance\\n tel = 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 AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'));\\n configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\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 = (`Watch;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 = (`Watch;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 '46': //HeartRate\\n // '10 0E 00 80'\\n var HeartRateStatus = hex2bin(value.substring(6, 8));\\n var enalbleDisable = '';\\n if (HeartRateStatus.substring(0, 1) == '1') {\\n var hrate = 'Enable, '\\n enalbleDisable = '1'\\n } else {\\n var hrate = 'Disable, '\\n };\\n var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\n hrate += detectingInterval;\\n AddValue(codeValues, \\\"hrate\\\", hrate);\\n //var imei = serverParams.Imei;\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings, enalbleDisable);\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\n configsToAck.push(configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings);\\n configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\n break;\\n case '47': // Custom Id\\n imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-CUSTID;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"customeid\\\", value);\\n AddValue(configsToUpdate, configIds.ReadState.CustomId, hex_to_ascii(value)); //now it comes \\\"3036\\\"\\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 // commented until Eview fixes this function\\n /*\\n messageForReceiver = (`Watch;ACK-NOMOTION;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"nomotion\\\", alertSetting);\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings, enableDisable);\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\n configsToAck.push(configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings);\\n configsToAck.push(configIds.ReadNonMovementSettings.Time);\\n */\\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 = (`Watch;ACK-FALLALERT;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n var sesibityOptionValue = hexToDecimal(value.substring(1, 2));\\n sensibility += sesibityOptionValue;\\n AddValue(codeValues, \\\"sensibility\\\", sensibility);\\n //AddValue(configsToUpdate, configIds.ReadAlertSettings.FallSettings, sensibility);\\n AddValue(configsToUpdate, configIds.ReadFallSettings.EnableDisableFallSettings, enalbleDisable);\\n AddValue(configsToUpdate, configIds.ReadFallSettings.Sensitivity, sesibityOptionValue);\\n //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\n configsToAck.push(configIds.ReadFallSettings.EnableDisableFallSettings);\\n configsToAck.push(configIds.ReadFallSettings.Sensitivity);\\n break;\\n case '73': //BeaconList\\n var beaconNumber = hexToDecimal(value.substring(1, 2));\\n var beaconStatus = hex2bin(value.substring(0, 1));\\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 = (`Watch;ACK-GDATA;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\n configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\n break;\\n case '4A': //Wifi Network List\\n var wifiSSIDLenght = hexToDecimal(value.substring(2, 4));\\n var wifiPasswordLenght = hexToDecimal(value.substring(4, 6));\\n var wifiIndex = hexToDecimal(value.substring(1, 2));\\n //var wifiStatus = hexToDecimal(value.substring(0, 1));\\n var wifiStatus = value.substring(0, 1);\\n /*var enalbleDisable = wifiSSID = wifiPassword = homeWifi = '';\\n /var homeWifi = '';\\n if (wifiIndex == '0') { // Only first Wifi of the list\\n if (wifiStatus == '8') {\\n homeWifi += ' Enable, '\\n enalbleDisable = '1';\\n } else {\\n homeWifi += ' Disable, '\\n //enalbleDisable = '0';\\n };*/\\n if ((wifiStatus == '8') || (wifiStatus == 'C')) { // 8 == ON OR C== ON and Connected\\n var wifiSSID = 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 = (`Watch;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 = (`Watch;ACK-SPEED;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"speed\\\", alertSetting);\\n AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\n configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\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 //return;\\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 messageForReceiver = (`Watch-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 if (alarmCode) {\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};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 = (`Watch-ACK;${imei};${message}`); // ${sequenceID}; add ${sequenceID}; 19-07\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n var value = message.substring(index, index = index + keyLength - 2);\\n if (typeof configIds !== 'undefined' && configIds && configIds.ConfigureDevice && configIds.ConfigureDevice.LastConfigured) { // when is defined\\n AddValue(configsToUpdate, configIds.ConfigureDevice.LastConfigured, moment().format('YYYY/MM/DD, HH:mm:ss'));\\n configsToAck.push(configIds.ConfigureDevice.LastConfigured);\\n }\\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 // operation functions\\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 // Utils functions\\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(hex) { // Hex to Ascii \\n if (hex.length % 2 !== 0) {\\n throw new Error(\\\"Hex string length must be even\\\");\\n }\\n let ascii = '';\\n for (let i = 0; i < hex.length; i += 2) {\\n const byte = hex.substr(i, 2);\\n const charCode = parseInt(byte, 16);\\n if (charCode !== 0) { // remove null character (\\\\u0000)\\n ascii += String.fromCharCode(charCode);\\n }\\n }\\n return ascii;\\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 hexToBytes(hex) {\\n return Uint8Array.from(hex.replace(/[^0-9a-f]/gi, \\\"\\\").match(/.{1,2}/g).map(b => parseInt(b, 16)));\\n }\\n\\n function bytesToHex(bytes) {\\n return Array.from(bytes, b => b.toString(16).padStart(2, \\\"0\\\").toUpperCase()).join(\\\"\\\");\\n }\\n // --- Multimsg splitter ---\\n function splitFramesFromHexStream(hex) {\\n const buf = hexToBytes(hex);\\n const frames = [];\\n const errors = [];\\n let i = 0;\\n while (i < buf.length) {\\n // Search header 0xAB\\n while (i < buf.length && buf[i] !== 0xAB) i++;\\n if (i >= buf.length) break;\\n const start = i;\\n // necesitamos al menos cabecera mínima: H(1)+Prop(1)+Len(2)+CRC(2)+Seq(2)=8\\n if (buf.length - i < 8) {\\n errors.push({\\n offset: i,\\n reason: \\\"Quedan menos de 8 bytes para cabecera\\\"\\n });\\n break; // incompleto al final del stream\\n }\\n const props = buf[i + 1];\\n const len = buf[i + 2] | (buf[i + 3] << 8); // Length LE (solo body)\\n const total = 1 + 1 + 2 + 2 + 2 + len;\\n if (len > 1024) {\\n errors.push({\\n offset: i,\\n reason: `Length fuera de rango (${len})`\\n });\\n i++; // re-sync: avanzar 1 y seguir buscando siguiente 0xAB\\n continue;\\n }\\n if (buf.length - i < total) {\\n errors.push({\\n offset: i,\\n reason: `Frame incompleto: requiere ${total} bytes`\\n });\\n break; // final del stream sin completar\\n }\\n const frameBytes = buf.slice(i, i + total);\\n frames.push(bytesToHex(frameBytes));\\n i += total; // saltar al siguiente posible frame\\n }\\n return {\\n frames,\\n errors\\n };\\n }\\n // --- Decodificador de stream (N frames concatenados) ---\\n function decodeHexStream(hex) {\\n const {\\n frames,\\n errors\\n } = splitFramesFromHexStream(hex);\\n const decoded = frames.map(h => {\\n try {\\n return {\\n ok: true,\\n ...decoder(h)\\n };\\n } catch (e) {\\n return {\\n ok: false,\\n error: e.message,\\n rawHex: h\\n };\\n }\\n });\\n return {\\n decoded,\\n splitErrors: errors\\n };\\n }\\n\\n function sendMessageToLocalhostNoWait(str) { // sends message to system, closing connection after\\n var server;\\n if (localTesting) {\\n console.log('local testing - sending to 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":1758638721},{"Type":1,"NewValue":"{\"Id\":437,\"Name\":\"Access TEC Care Watch\",\"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 // Watch protocol - please see variables and typical values in order below\\r\\n // Watch-CYC;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;SIGNAL=<>;WM=<>;GENERAL=<>\\r\\n // Watch-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\r\\n //\\r\\n // Author: Juanmi Navarro\\r\\n // Created: 01/01/0000\\r\\n // Last modified: 18/09/2025\\r\\n //\\r\\n ///////////////////////////////////////////////////////////////////////////////\\r\\n if (typeof localTesting === \\\"undefined\\\") {\\r\\n let localTesting = false;\\r\\n }\\r\\n const crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,\\r\\n 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,\\r\\n 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,\\r\\n 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,\\r\\n 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,\\r\\n 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,\\r\\n 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,\\r\\n 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,\\r\\n 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,\\r\\n 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,\\r\\n 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,\\r\\n 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,\\r\\n 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,\\r\\n 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,\\r\\n 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,\\r\\n 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,\\r\\n 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,\\r\\n 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,\\r\\n 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,\\r\\n 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,\\r\\n 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,\\r\\n 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n ];\\r\\n var codeValues = [];\\r\\n AddValue(codeValues, 'protocol_template', 'Watch');\\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 = (`Watch-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 var allowedCID = ['3036', '06'];\\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 } 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 }\\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 //<>,<>,<> \\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];\\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 //<>,<>,<> \\r\\n if (mac2) {\\r\\n AddValue(codeValues, 'beacon_mac', mac2);\\r\\n var simpleQuery2 = [{\\r\\n 'code': 'Mac',\\r\\n 'value': mac2,\\r\\n }];\\r\\n var simpleQueryLabel2 = {\\r\\n 'table': 'beacons',\\r\\n 'select': 'Name',\\r\\n 'query': simpleQuery2\\r\\n };\\r\\n var labels2 = [];\\r\\n labels2.push(JSON.stringify(simpleQueryLabel2));\\r\\n AddValue(codeValues, 'oysta_labels', JSON.stringify(labels2));\\r\\n }\\r\\n if (params.beacon_major) {\\r\\n AddValue(codeValues, 'beacon_major', params.beacon_major);\\r\\n } else {\\r\\n AddValue(codeValues, 'beacon_major', 0);\\r\\n }\\r\\n if (params.beacon_minor) {\\r\\n AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\r\\n } else {\\r\\n AddValue(codeValues, 'beacon_minor', 0);\\r\\n }\\r\\n //AddValue(codeValues,'oysta_labels', label);\\r\\n //AddValue(codeValues,'oysta_value', mac);\\r\\n }\\r\\n /* meter mas tarde... \\r\\n if (params.smart_data !== 'undefined') {\\r\\n var gen_location = params.smart_data.split(',')\\r\\n var latitude = gen_location[0]\\r\\n var longitude = gen_location[1]\\r\\n var location_accuracy = gen_location[2]\\r\\n var altitude = gen_location[3]\\r\\n AddValue(codeValues,'latitude', latitude);\\r\\n AddValue(codeValues,'longitude', longitude);\\r\\n AddValue(codeValues,'altitude', altitude);\\r\\n AddValue(codeValues,'location_accuracy', location_accuracy);\\r\\n }\\r\\n */\\r\\n /*else if ((params.event_time) && (params.event_time == '')) {\\r\\n var event_time = moment.utc().unix();\\r\\n AddValue(codeValues,'event_time', event_time);\\r\\n } revisar mas adelante*/\\r\\n if (params.location_time) {\\r\\n AddValue(codeValues, 'location_time', params.location_time);\\r\\n }\\r\\n if (params.event_time) {\\r\\n AddValue(codeValues, 'event_time', params.event_time);\\r\\n }\\r\\n // to parse SMS info from the device\\r\\n switch (messageTypeLocalCode) {\\r\\n case 'COMM-SMS': // SMS message sent in\\r\\n if (params.data.startsWith('Device location request')) {\\r\\n configsToAck.push(configIds.Controls.RealTimeLocate);\\r\\n } else if (params.data.startsWith('Set IP ok')) {\\r\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n } else if (params.data.startsWith('IMEI:')) {\\r\\n configsToAck.push(configIds.Controls.GetFirmwareVersion);\\r\\n } else if (params.data.startsWith('Set IP ok')) {\\r\\n configsToAck.push(configIds.Controls.ClearBufferedMessages);\\r\\n } else if (params.data.startsWith('flush ok')) {\\r\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n } else if (params.data.startsWith('Set Watch-')) {\\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 = (`Watch-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 = (`Watch;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 = (`Watch;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 = (`Watch-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 // decode global msg\\r\\n function decoder(str) { // decode rawdata\\r\\n // CARE Decoder\\r\\n //AddValue(codeValues, 'Message : ', str);\\r\\n var message = str;\\r\\n var index = 18;\\r\\n //parse header & properties\\r\\n var properties = message.substring(2, 4);\\r\\n var lengthLittleEndian = message.substring(4, 8);\\r\\n var total_length = lengthLittleEndian.substring(2, 4) + lengthLittleEndian.substring(0, 2);\\r\\n total_length = 2 * hexToDecimal(total_length.substring(0, 4));\\r\\n var sequenceID = message.substring(12, 16);\\r\\n var command = message.substring(16, 18);\\r\\n //mask bitwise (properties should be '10')\\r\\n if ((parseInt(properties) & 8) == 8) {\\r\\n needsAck = true;\\r\\n } else needsAck = false;\\r\\n // need to check if checksum is correct for possible msg corruption 10/03/23\\r\\n var checksum = message.substring(8, 12);\\r\\n var messageBody = message.substring(16, message.length);\\r\\n debug('message =' + message);\\r\\n debug('checksum =' + checksum);\\r\\n debug('calculateCheckSum =' + calculateCheckSum(messageBody));\\r\\n if (calculateCheckSum(messageBody) == checksum) { // payload is valid\\r\\n debug(\\\"message has valid checksum\\\");\\r\\n var messageBody = command; // update value for the ACK\\r\\n debug('command =' + command);\\r\\n if (command == '01') {\\r\\n while (index < total_length + 16) {\\r\\n 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\\r\\n if ((alarmCodeExtInt & 1) == 1) {\\r\\n var alarm = 'ALF-C';\\r\\n }\\r\\n // Welfare Check-out\\r\\n else if ((alarmCodeExtInt & 2) == 2) {\\r\\n var alarm = 'ALA-C';\\r\\n }\\r\\n // Standard Alerts\\r\\n //Battery low\\r\\n else if ((alarmCodeInt & 1) == 1) {\\r\\n var alarm = 'BATL';\\r\\n }\\r\\n //Overspeed\\r\\n else if ((alarmCodeInt & 2) == 2) {\\r\\n var alarm = 'ALSP';\\r\\n }\\r\\n //Fall\\r\\n else if ((alarmCodeInt & 4) == 4) {\\r\\n var alarm = 'ALF';\\r\\n }\\r\\n //Tilt\\r\\n else if ((alarmCodeInt & 8) == 8) {\\r\\n var alarm = 'TLT';\\r\\n } else if ((alarmCodeInt & 16) == 16) {\\r\\n if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n var alarm = 'Geo1-IN';\\r\\n } else {\\r\\n var alarm = 'Geo1-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 32) == 32) {\\r\\n if ((alarmCodeInt & 33554432) == 33554432) {\\r\\n var alarm = 'Geo2-IN';\\r\\n } else {\\r\\n var alarm = 'Geo2-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 64) == 64) {\\r\\n if ((alarmCodeInt & 67108864) == 67108864) {\\r\\n var alarm = 'Geo3-IN';\\r\\n } else {\\r\\n var alarm = 'Geo3-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 128) == 128) {\\r\\n if ((alarmCodeInt & 134217728) == 134217728) {\\r\\n var alarm = 'Geo4-IN';\\r\\n } else {\\r\\n var alarm = 'Geo4-OUT';\\r\\n }\\r\\n }\\r\\n //Power Off\\r\\n else if ((alarmCodeInt & 256) == 256) {\\r\\n var alarm = 'PWRF';\\r\\n }\\r\\n //Power On\\r\\n else if ((alarmCodeInt & 512) == 512) {\\r\\n var alarm = 'PWRN';\\r\\n }\\r\\n //Motion\\r\\n else if ((alarmCodeInt & 1024) == 1024) {\\r\\n var alarm = 'ALMOV';\\r\\n }\\r\\n //No Motion\\r\\n else if ((alarmCodeInt & 2048) == 2048) {\\r\\n var alarm = 'ALNM';\\r\\n }\\r\\n //SOS\\r\\n else if ((alarmCodeInt & 4096) == 4096) {\\r\\n var alarm = 'ALSOS';\\r\\n } else if ((alarmCodeInt & 8192) == 8192) {\\r\\n var alarm = 'Side1';\\r\\n } else if ((alarmCodeInt & 16384) == 16384) {\\r\\n var alarm = 'Side2';\\r\\n }\\r\\n //Battery charging\\r\\n else if ((alarmCodeInt & 32768) == 32768) {\\r\\n var alarm = 'BATCN';\\r\\n }\\r\\n //Battery no charging\\r\\n else if ((alarmCodeInt & 65536) == 65536) {\\r\\n var alarm = 'BATCF';\\r\\n }\\r\\n //SOS Ending\\r\\n // Temporary Commented until we know exactly how it works. 22/09/2022\\r\\n else if ((alarmCodeInt & 131072) == 131072) {\\r\\n var alarm = 'ALA-F';\\r\\n info = 'Alarm Finished';\\r\\n }\\r\\n //Amber Alert EC03 only\\r\\n else if ((alarmCodeInt & 262144) == 262144) {\\r\\n var alarm = 'ALA';\\r\\n }\\r\\n // welfare Alert check-in ALA-O\\r\\n else if ((alarmCodeInt & 524288) == 524288) {\\r\\n var alarm = 'ALA-O';\\r\\n }\\r\\n // Amber alert Ending ALA-C\\r\\n else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n var alarm = 'ALA-C';\\r\\n }\\r\\n // Amber alert Ending ALA-C\\r\\n //else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n // var alarm = 'ALA-C';\\r\\n //}\\r\\n // Fall-Down Alert ending\\r\\n else if ((alarmCodeInt & 2097152) == 2097152) {\\r\\n var alarm = 'ALF-C';\\r\\n }\\r\\n // welfare Alert Ending ALA\\r\\n else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n var alarm = 'ALA';\\r\\n }\\r\\n // Beacon absent Alert 11/10/22. Need to be added in msg types\\r\\n //else if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n // var alarm = 'BEA';\\r\\n //}\\r\\n general += 'alarm:' + alarm + ',';\\r\\n break;\\r\\n //Custom ID\\r\\n case '03':\\r\\n customID = value;\\r\\n if (!allowedCID.includes(value)) {\\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 //<>,<>,<>,<>,<>\\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 if (!allowedCID.includes(customID)) {\\r\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n AddValue(codeValues, \\\"customID\\\", customID);\\r\\n return\\r\\n }\\r\\n //if (alarmCode) {\\r\\n // messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = '';\\r\\n //= gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n //} else \\r\\n if (statusDevice) {\\r\\n messageForReceiver = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = '';\\r\\n 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 alarm = alarmCode =\\r\\n //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;\\r\\n var statusHex = changeEndianness(value.substring(8, 16));\\r\\n var statusInt = hexToDecimal(statusHex);\\r\\n var statusDevice = '';\\r\\n if ((statusInt & 1) == 1) {\\r\\n statusDevice += 'GPS,';\\r\\n }\\r\\n if ((statusInt & 2) == 2) {\\r\\n statusDevice += 'WIFISource,';\\r\\n }\\r\\n if ((statusInt & 4) == 4) {\\r\\n statusDevice += 'CellTower,';\\r\\n }\\r\\n if ((statusInt & 8) == 8) {\\r\\n statusDevice += 'BLELocation,';\\r\\n }\\r\\n //params.BatteryStatus.BatteryStatus = '1';\\r\\n if ((statusInt & 16) == 16) {\\r\\n statusDevice += 'Charging,';\\r\\n // var alarm = 'BATCN';\\r\\n //configs.BatteryStatus.BatteryStatus = '1';\\r\\n /* if (configs.BatteryStatus.BatteryStatus !== '1') {\\r\\n hasConfigs = true;\\r\\n var batteryStatus = '1';\\r\\n var alarm = 'BATCN';\\r\\n let configsToUpdate = [];\\r\\n configsToUpdate.push({\\r\\n 'code': configIds.BatteryStatus.BatteryStatus,\\r\\n 'value': batteryStatus\\r\\n });\\r\\n }*/\\r\\n }\\r\\n if ((statusInt & 32) == 32) {\\r\\n statusDevice += 'FUllyCharged,';\\r\\n //var alarm = 'BATF';\\r\\n // configs.BatteryStatus.BatteryStatus = '3';\\r\\n /* if (configs.BatteryStatus.BatteryStatus !== '3') {\\r\\n hasConfigs = true;\\r\\n var batteryStatus = '3';\\r\\n var alarm = 'BATF';\\r\\n let configsToUpdate = [];\\r\\n configsToUpdate.push({\\r\\n 'code': configIds.BatteryStatus.BatteryStatus,\\r\\n 'value': batteryStatus\\r\\n });\\r\\n }*/\\r\\n }\\r\\n /* if (!((statusInt & 32) == 32) & !((statusInt & 16) == 16)) {\\r\\n statusDevice += 'Not Charging,';\\r\\n var alarm = 'BATCF';\\r\\n //configs.BatteryStatus.BatteryStatus = '2';\\r\\n if (configs.BatteryStatus.BatteryStatus !== '2') {\\r\\n var batteryStatus = '2';\\r\\n var alarm = 'BATCF';\\r\\n let configsToUpdate = [];\\r\\n configsToUpdate.push({\\r\\n 'code': configIds.BatteryStatus.BatteryStatus,\\r\\n 'value': batteryStatus\\r\\n });\\r\\n }\\r\\n }*/\\r\\n if ((statusInt & 64) == 64) {\\r\\n statusDevice += 'Reboot,';\\r\\n }\\r\\n if ((statusInt & 128) == 128) {\\r\\n statusDevice += 'HistoricalData,';\\r\\n }\\r\\n if ((statusInt & 256) == 256) {\\r\\n statusDevice += 'AGPSDataValid,';\\r\\n }\\r\\n if ((statusInt & 512) == 512) {\\r\\n statusDevice += 'Motion,';\\r\\n }\\r\\n if ((statusInt & 1024) == 1024) {\\r\\n statusDevice += 'SmartLocating,';\\r\\n }\\r\\n if ((statusInt & 2048) == 2048) { //isHome\\r\\n statusDevice += 'BeaconLocation,';\\r\\n }\\r\\n if ((statusInt & 4096) == 4096) {\\r\\n statusDevice += 'BLEConnected,';\\r\\n }\\r\\n if ((statusInt & 16384) == 16384) {\\r\\n statusDevice += 'HomeWiFi,';\\r\\n }\\r\\n statusDevice = statusDevice.slice(0, -1);\\r\\n status_data = statusDevice; //to oysta template\\r\\n //statusHex = (statusHex);\\r\\n statusHex = hex2bin(statusHex);\\r\\n statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\r\\n battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\r\\n cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\r\\n workMode = parseInt(statusHex.substring(13, 16), 2);\\r\\n general += 'statusDevice:' + statusDevice + ',';\\r\\n if (battery_percentage) {\\r\\n general += 'battery:' + battery_percentage + ',';\\r\\n }\\r\\n if (cellNetworkSignal) {\\r\\n general += 'cellNetworkSignal:' + cellNetworkSignal + ',';\\r\\n }\\r\\n if (workMode) {\\r\\n general += 'workMode:' + workMode + ',';\\r\\n }\\r\\n //messageForReceiver = (`CareWatch-CYC;${imei};${i};${event_time};${battery_percentage}`);\\r\\n break;\\r\\n //Call Records\\r\\n case '25':\\r\\n //Needed?\\r\\n break;\\r\\n //BLE Location 2\\r\\n case '26':\\r\\n //I don't understand\\r\\n //messageBody = messageBody + keyLengthHex + key + value;\\r\\n break;\\r\\n //Smart Location\\r\\n case '27':\\r\\n location_type = 'SMART';\\r\\n var latitudeHex = value.substring(0, 8);\\r\\n var longitudeHex = value.substring(8, 16);\\r\\n var location_accuracyHex = value.substring(16, 20);\\r\\n var altitudeHex = value.substring(20, 24);\\r\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n var altitude = hexToDecimal(changeEndianness(altitudeHex));\\r\\n //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\r\\n //04/08/2022 se quita el multiplicador por 5 pq ya viene el valor en metros\\r\\n location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\r\\n //location_time = timestamp;\\r\\n smart_data = `${latitude},${longitude},${location_accuracy},${altitude}`;\\r\\n general += 'smart location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n break;\\r\\n //Beacon Location Added 11/10/22\\r\\n case '28':\\r\\n location_type = 'BEACON';\\r\\n // var alarm = 'EBZI';\\r\\n var latitudeHex = '00';\\r\\n var longitudeHex = '00';\\r\\n var descr = 'empty';\\r\\n var flag = hexToDecimal(value.substring(0, 1));\\r\\n var beacId = hexToDecimal(value.substring(1, 2));\\r\\n // msg includes descrip\\r\\n if ((flag & 4) == 4) {\\r\\n descr = hex_to_ascii(value.substring(18, value.length));\\r\\n }\\r\\n // msg includes lat/lon\\r\\n if ((flag & 8) == 8) {\\r\\n latitudeHex = value.substring(18, 26);\\r\\n longitudeHex = value.substring(26, 34);\\r\\n }\\r\\n // msg includes lat/lon and description\\r\\n if ((flag & 12) == 12) {\\r\\n latitudeHex = value.substring(18, 26);\\r\\n longitudeHex = value.substring(26, 34);\\r\\n descr = hex_to_ascii(value.substring(34, value.length));\\r\\n }\\r\\n var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n // add : format in MAC\\r\\n mac = mac.match(/.{1,2}/g).join(':');\\r\\n var rssiHex = value.substring(14, 16);\\r\\n var rssi1Hex = value.substring(16, 18);\\r\\n rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\r\\n rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\r\\n // var latitudeHex = value.substring(18, 26);\\r\\n // var longitudeHex = value.substring(26, 34);\\r\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n //location_time = timestamp;\\r\\n beacon_data = `${latitude},${longitude},${mac},${descr}`;\\r\\n general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (listIndex):' + beacId + ',';\\r\\n break;\\r\\n // Beacon V2\\r\\n case '2C':\\r\\n location_type = 'BEACON';\\r\\n // var alarm = 'EBZI';\\r\\n var latitudeHex = '00';\\r\\n var longitudeHex = '00';\\r\\n var descr = 'empty';\\r\\n var flag = hexToDecimal(value.substring(0, 1));\\r\\n var beacId = hexToDecimal(value.substring(1, 2));\\r\\n // msg includes descrip\\r\\n if ((flag & 4) == 4) {\\r\\n let desc_leng = hexToDecimal(value.substring(20, 22));\\r\\n descr = hex_to_ascii(value.substring(22, 22 + (2 * desc_leng)));\\r\\n //descr = hex_to_ascii(value.substring(18, value.length));\\r\\n }\\r\\n // msg includes lat/lon\\r\\n if ((flag & 8) == 8) {\\r\\n latitudeHex = value.substring(18, 26);\\r\\n longitudeHex = value.substring(26, 34);\\r\\n }\\r\\n // msg includes lat/lon and description\\r\\n if ((flag & 12) == 12) {\\r\\n latitudeHex = value.substring(20, 28);\\r\\n longitudeHex = value.substring(28, 36);\\r\\n let desc_leng = hexToDecimal(value.substring(36, 38));\\r\\n descr = hex_to_ascii(value.substring(38, 38 + (2 * desc_leng)));\\r\\n }\\r\\n var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n // add : format in MAC\\r\\n mac = mac.match(/.{1,2}/g).join(':');\\r\\n var rssiHex = value.substring(14, 16);\\r\\n var rssi1Hex = value.substring(16, 18);\\r\\n rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\r\\n rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\r\\n var battery_beacon = hexToDecimal(value.substring(18, 20));\\r\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n //location_time = timestamp;\\r\\n beacon_data = `${latitude},${longitude},${mac},${descr}`;\\r\\n general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (battery):' + battery_beacon + ', (listIndex):' + beacId + ',';\\r\\n break;\\r\\n //Cell Towers Note\\r\\n case '29':\\r\\n location_type = 'LBS';\\r\\n lbs_data = '';\\r\\n var mccHex = changeEndianness(value.substring(0, 4));\\r\\n var mncHex = value.substring(4, 6);\\r\\n var mcc = hexToDecimal(mccHex);\\r\\n lbs_data += mcc + ',';\\r\\n var mnc = hexToDecimal(mncHex);\\r\\n lbs_data += mnc + ',';\\r\\n var indexLbs = 6;\\r\\n var numTowers = (hexToDecimal(keyLengthHex) - 4) / 7;\\r\\n for (let i = 0; i < numTowers; i++) {\\r\\n var rxlHex = changeEndianness(value.substring(indexLbs, indexLbs + 2));\\r\\n var rxl = hexToDecimal(rxlHex);\\r\\n var lacHex = changeEndianness(value.substring(indexLbs + 2, indexLbs + 6));\\r\\n var lac = hexToDecimal(lacHex);\\r\\n var cellTowers = hexToDecimal(changeEndianness(value.substring(indexLbs + 6, indexLbs + 14)));\\r\\n lbs_data += rxl + ',' + lac + ',' + cellTowers + ',';\\r\\n indexLbs += 14;\\r\\n }\\r\\n lbs_data = lbs_data.slice(0, -1);\\r\\n general += lbs_data;\\r\\n break;\\r\\n case '30':\\r\\n //G-sensor.\\r\\n 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 = (`Watch-${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 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 = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n }\\r\\n break;\\r\\n //BLE Connected . For Flic button\\r\\n case '62':\\r\\n location_type = 'BLE';\\r\\n //var alarm = 'EBZI'; \\r\\n //var latitudeHex = '00';\\r\\n //var longitudeHex = '00';\\r\\n //var descr = 'empty';\\r\\n var flag = hexToDecimal(value.substring(0, 2)); // 0= Disconnected, 1= Connected\\r\\n var mac = value.substring(2, 14); // No hace falta darle la vuelta\\r\\n // add : format in MAC\\r\\n mac = mac.match(/.{1,2}/g).join(':');\\r\\n var batLevel = hexToDecimal(value.substring(14, 16)); // 0-100\\r\\n //location_time = timestamp;\\r\\n ble_data = `${flag},${batLevel},${mac}`;\\r\\n general += 'BLE location (State):' + flag + ', (bat):' + batLevel + ', (mac):' + mac + ',';\\r\\n break;\\r\\n }\\r\\n }\\r\\n if (alarmCode) {\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch;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 = (`Watch;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': // Ringer Volume\\r\\n var volume = hexToDecimal(value);\\r\\n imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;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 = (`Watch;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 '0F': // Enable control.... Used for STEP COUNTING SETTINGS\\r\\n // 'FF FF 21 80'\\r\\n var StepStatus = hex2bin(value.substring(4, 6));\\r\\n var enalbleDisable = '';\\r\\n if (StepStatus.substring(7, 8) == '1') {\\r\\n var step = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var step = 'Disable, '\\r\\n };\\r\\n //var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n //hrate += detectingInterval;\\r\\n AddValue(codeValues, \\\"step\\\", step);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadStepsSettings.EnableDisableReadStepsSettings, enalbleDisable);\\r\\n //AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadStepsSettings.EnableDisableReadStepsSettings);\\r\\n //configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\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 = (`Watch;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 '34': //ContactList with name\\r\\n var contactNumber = value.substring(1, 2);\\r\\n var telLength = hexToDecimal(value.substring(2, 4));\\r\\n var tel = '';\\r\\n switch (contactNumber) {\\r\\n // Emergency Number\\r\\n case '0':\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n break;\\r\\n // Speed Dial Number\\r\\n //case '1':\\r\\n // tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n // AddValue(codeValues, \\\"SpeedDialNumber\\\", tel);\\r\\n // AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.SpeedDialNumber, tel);\\r\\n // configsToAck.push(configIds.ReadSpeedDialSettings.SpeedDialNumber);\\r\\n // break;\\r\\n // Gateway Number\\r\\n case '9': //00447781482635,Esendex UK 0034627177148,Esendex Spain 00447507288240,Esendex UK Acceptance\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n if (tel.includes('447781482635') || tel.includes('00447781482635')) {\\r\\n tel = 'Esendex UK'\\r\\n } else if (tel.includes('34627177148') || tel.includes('0034627177148')) {\\r\\n tel = 'Esendex Spain'\\r\\n } else if (tel.includes('447507288240') || tel.includes('00447507288240')) {\\r\\n tel = 'Esendex UK Acceptance'\\r\\n } else {\\r\\n tel = 'Default'\\r\\n }\\r\\n AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n break;\\r\\n default:\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n if (tel.length < 6) {\\r\\n contacts += '';\\r\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n break;\\r\\n }\\r\\n //contacts += 'A' + (contactNumber - 1) + ': ' + tel + ', ';\\r\\n contacts += tel + ', ';\\r\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n break;\\r\\n }\\r\\n break;\\r\\n case '40': // APN\\r\\n //no ACK need\\r\\n AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'));\\r\\n configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\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 = (`Watch;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 = (`Watch;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 '46': //HeartRate\\r\\n // '10 0E 00 80'\\r\\n var HeartRateStatus = hex2bin(value.substring(6, 8));\\r\\n var enalbleDisable = '';\\r\\n if (HeartRateStatus.substring(0, 1) == '1') {\\r\\n var hrate = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var hrate = 'Disable, '\\r\\n };\\r\\n var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n hrate += detectingInterval;\\r\\n AddValue(codeValues, \\\"hrate\\\", hrate);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings);\\r\\n configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\r\\n break;\\r\\n case '47': // Custom Id\\r\\n imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;ACK-CUSTID;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"customeid\\\", value);\\r\\n AddValue(configsToUpdate, configIds.ReadState.CustomId, hex_to_ascii(value)); //now it comes \\\"3036\\\"\\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 // commented until Eview fixes this function\\r\\n /*\\r\\n messageForReceiver = (`Watch;ACK-NOMOTION;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"nomotion\\\", alertSetting);\\r\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings, enableDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n configsToAck.push(configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings);\\r\\n configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n */\\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 = (`Watch;ACK-FALLALERT;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n var sesibityOptionValue = hexToDecimal(value.substring(1, 2));\\r\\n sensibility += sesibityOptionValue;\\r\\n AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n //AddValue(configsToUpdate, configIds.ReadAlertSettings.FallSettings, sensibility);\\r\\n AddValue(configsToUpdate, configIds.ReadFallSettings.EnableDisableFallSettings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadFallSettings.Sensitivity, sesibityOptionValue);\\r\\n //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n configsToAck.push(configIds.ReadFallSettings.EnableDisableFallSettings);\\r\\n configsToAck.push(configIds.ReadFallSettings.Sensitivity);\\r\\n break;\\r\\n case '73': //BeaconList\\r\\n var beaconNumber = hexToDecimal(value.substring(1, 2));\\r\\n var beaconStatus = hex2bin(value.substring(0, 1));\\r\\n beaconStatus = hex_to_ascii(value.substring(30, value.length));\\r\\n //beaconStatus = changeEndianness(value.substring(30, value.length));\\r\\n //homeBeacon += 'B' + (beaconNumber + 1) + ': ' + beaconStatus + ', ';\\r\\n homeBeacon += beaconStatus + ', ';\\r\\n AddValue(codeValues, \\\"homeBeacon\\\", homeBeacon);\\r\\n messageForReceiver = (`Watch;ACK-GDATA;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n break;\\r\\n case '4A': //Wifi Network List\\r\\n var wifiSSIDLenght = hexToDecimal(value.substring(2, 4));\\r\\n var wifiPasswordLenght = hexToDecimal(value.substring(4, 6));\\r\\n var wifiIndex = hexToDecimal(value.substring(1, 2));\\r\\n //var wifiStatus = hexToDecimal(value.substring(0, 1));\\r\\n var wifiStatus = value.substring(0, 1);\\r\\n /*var enalbleDisable = wifiSSID = wifiPassword = homeWifi = '';\\r\\n /var homeWifi = '';\\r\\n if (wifiIndex == '0') { // Only first Wifi of the list\\r\\n if (wifiStatus == '8') {\\r\\n homeWifi += ' Enable, '\\r\\n enalbleDisable = '1';\\r\\n } else {\\r\\n homeWifi += ' Disable, '\\r\\n //enalbleDisable = '0';\\r\\n };*/\\r\\n if ((wifiStatus == '8') || (wifiStatus == 'C')) { // 8 == ON OR C== ON and Connected\\r\\n var wifiSSID = hex_to_ascii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\r\\n var wifiPassword = hex_to_ascii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\r\\n var imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;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 = (`Watch;ACK-SPEED;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"speed\\\", alertSetting);\\r\\n AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\r\\n configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\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 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 = (`Watch-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 = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch-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 if (typeof configIds !== 'undefined' && configIds && configIds.ConfigureDevice && configIds.ConfigureDevice.LastConfigured) { // when is defined\\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 }\\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(hex) { // Hex to Ascii \\r\\n if (hex.length % 2 !== 0) {\\r\\n throw new Error(\\\"Hex string length must be even\\\");\\r\\n }\\r\\n let ascii = '';\\r\\n for (let i = 0; i < hex.length; i += 2) {\\r\\n const byte = hex.substr(i, 2);\\r\\n const charCode = parseInt(byte, 16);\\r\\n if (charCode !== 0) { // remove null character (\\\\u0000)\\r\\n ascii += String.fromCharCode(charCode);\\r\\n }\\r\\n }\\r\\n return ascii;\\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":1762887514},{"Type":1,"NewValue":"{\"Id\":437,\"Name\":\"Access TEC Care Watch\",\"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 // Watch protocol - please see variables and typical values in order below\\r\\n // Watch-CYC;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;SIGNAL=<>;WM=<>;GENERAL=<>\\r\\n // Watch-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\r\\n //\\r\\n // Author: Juanmi Navarro\\r\\n // Created: 01/01/0000\\r\\n // Last modified: 18/09/2025\\r\\n //\\r\\n ///////////////////////////////////////////////////////////////////////////////\\r\\n if (typeof localTesting === \\\"undefined\\\") {\\r\\n let localTesting = false;\\r\\n }\\r\\n const crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,\\r\\n 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,\\r\\n 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,\\r\\n 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,\\r\\n 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,\\r\\n 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,\\r\\n 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,\\r\\n 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,\\r\\n 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,\\r\\n 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,\\r\\n 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,\\r\\n 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,\\r\\n 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,\\r\\n 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,\\r\\n 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,\\r\\n 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,\\r\\n 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,\\r\\n 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,\\r\\n 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,\\r\\n 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,\\r\\n 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,\\r\\n 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n ];\\r\\n var codeValues = [];\\r\\n AddValue(codeValues, 'protocol_template', 'Watch');\\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 = (`Watch-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 var allowedCID = ['3036', '06'];\\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 } 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 }\\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 //<>,<>,<> \\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];\\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 //<>,<>,<> \\r\\n if (mac2) {\\r\\n AddValue(codeValues, 'beacon_mac', mac2);\\r\\n var simpleQuery2 = [{\\r\\n 'code': 'Mac',\\r\\n 'value': mac2,\\r\\n }];\\r\\n var simpleQueryLabel2 = {\\r\\n 'table': 'beacons',\\r\\n 'select': 'Name',\\r\\n 'query': simpleQuery2\\r\\n };\\r\\n var labels2 = [];\\r\\n labels2.push(JSON.stringify(simpleQueryLabel2));\\r\\n AddValue(codeValues, 'oysta_labels', JSON.stringify(labels2));\\r\\n }\\r\\n if (params.beacon_major) {\\r\\n AddValue(codeValues, 'beacon_major', params.beacon_major);\\r\\n } else {\\r\\n AddValue(codeValues, 'beacon_major', 0);\\r\\n }\\r\\n if (params.beacon_minor) {\\r\\n AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\r\\n } else {\\r\\n AddValue(codeValues, 'beacon_minor', 0);\\r\\n }\\r\\n //AddValue(codeValues,'oysta_labels', label);\\r\\n //AddValue(codeValues,'oysta_value', mac);\\r\\n }\\r\\n /* meter mas tarde... \\r\\n if (params.smart_data !== 'undefined') {\\r\\n var gen_location = params.smart_data.split(',')\\r\\n var latitude = gen_location[0]\\r\\n var longitude = gen_location[1]\\r\\n var location_accuracy = gen_location[2]\\r\\n var altitude = gen_location[3]\\r\\n AddValue(codeValues,'latitude', latitude);\\r\\n AddValue(codeValues,'longitude', longitude);\\r\\n AddValue(codeValues,'altitude', altitude);\\r\\n AddValue(codeValues,'location_accuracy', location_accuracy);\\r\\n }\\r\\n */\\r\\n /*else if ((params.event_time) && (params.event_time == '')) {\\r\\n var event_time = moment.utc().unix();\\r\\n AddValue(codeValues,'event_time', event_time);\\r\\n } revisar mas adelante*/\\r\\n if (params.location_time) {\\r\\n AddValue(codeValues, 'location_time', params.location_time);\\r\\n }\\r\\n if (params.event_time) {\\r\\n AddValue(codeValues, 'event_time', params.event_time);\\r\\n }\\r\\n // to parse SMS info from the device\\r\\n switch (messageTypeLocalCode) {\\r\\n case 'COMM-SMS': // SMS message sent in\\r\\n if (params.data.startsWith('Device location request')) {\\r\\n configsToAck.push(configIds.Controls.RealTimeLocate);\\r\\n } else if (params.data.startsWith('Set IP ok')) {\\r\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n } else if (params.data.startsWith('IMEI:')) {\\r\\n configsToAck.push(configIds.Controls.GetFirmwareVersion);\\r\\n } else if (params.data.startsWith('Set IP ok')) {\\r\\n configsToAck.push(configIds.Controls.ClearBufferedMessages);\\r\\n } else if (params.data.startsWith('flush ok')) {\\r\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n } else if (params.data.startsWith('Set Watch-')) {\\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 = (`Watch-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 = (`Watch;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 = (`Watch;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 = (`Watch-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 // decode global msg\\r\\n function decoder(str) { // decode rawdata\\r\\n // CARE Decoder\\r\\n //AddValue(codeValues, 'Message : ', str);\\r\\n var message = str;\\r\\n var index = 18;\\r\\n //parse header & properties\\r\\n var properties = message.substring(2, 4);\\r\\n var lengthLittleEndian = message.substring(4, 8);\\r\\n var total_length = lengthLittleEndian.substring(2, 4) + lengthLittleEndian.substring(0, 2);\\r\\n total_length = 2 * hexToDecimal(total_length.substring(0, 4));\\r\\n var sequenceID = message.substring(12, 16);\\r\\n var command = message.substring(16, 18);\\r\\n //mask bitwise (properties should be '10')\\r\\n if ((parseInt(properties) & 8) == 8) {\\r\\n needsAck = true;\\r\\n } else needsAck = false;\\r\\n // need to check if checksum is correct for possible msg corruption 10/03/23\\r\\n var checksum = message.substring(8, 12);\\r\\n var messageBody = message.substring(16, message.length);\\r\\n debug('message =' + message);\\r\\n debug('checksum =' + checksum);\\r\\n debug('calculateCheckSum =' + calculateCheckSum(messageBody));\\r\\n if (calculateCheckSum(messageBody) == checksum) { // payload is valid\\r\\n debug(\\\"message has valid checksum\\\");\\r\\n var messageBody = command; // update value for the ACK\\r\\n debug('command =' + command);\\r\\n if (command == '01') {\\r\\n while (index < total_length + 16) {\\r\\n 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\\r\\n if ((alarmCodeExtInt & 1) == 1) {\\r\\n var alarm = 'ALF-C';\\r\\n }\\r\\n // Welfare Check-out\\r\\n else if ((alarmCodeExtInt & 2) == 2) {\\r\\n var alarm = 'ALA-C';\\r\\n }\\r\\n // Standard Alerts\\r\\n //Battery low\\r\\n else if ((alarmCodeInt & 1) == 1) {\\r\\n var alarm = 'BATL';\\r\\n }\\r\\n //Overspeed\\r\\n else if ((alarmCodeInt & 2) == 2) {\\r\\n var alarm = 'ALSP';\\r\\n }\\r\\n //Fall\\r\\n else if ((alarmCodeInt & 4) == 4) {\\r\\n var alarm = 'ALF';\\r\\n }\\r\\n //Tilt\\r\\n else if ((alarmCodeInt & 8) == 8) {\\r\\n var alarm = 'TLT';\\r\\n } else if ((alarmCodeInt & 16) == 16) {\\r\\n if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n var alarm = 'Geo1-IN';\\r\\n } else {\\r\\n var alarm = 'Geo1-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 32) == 32) {\\r\\n if ((alarmCodeInt & 33554432) == 33554432) {\\r\\n var alarm = 'Geo2-IN';\\r\\n } else {\\r\\n var alarm = 'Geo2-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 64) == 64) {\\r\\n if ((alarmCodeInt & 67108864) == 67108864) {\\r\\n var alarm = 'Geo3-IN';\\r\\n } else {\\r\\n var alarm = 'Geo3-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 128) == 128) {\\r\\n if ((alarmCodeInt & 134217728) == 134217728) {\\r\\n var alarm = 'Geo4-IN';\\r\\n } else {\\r\\n var alarm = 'Geo4-OUT';\\r\\n }\\r\\n }\\r\\n //Power Off\\r\\n else if ((alarmCodeInt & 256) == 256) {\\r\\n var alarm = 'PWRF';\\r\\n }\\r\\n //Power On\\r\\n else if ((alarmCodeInt & 512) == 512) {\\r\\n var alarm = 'PWRN';\\r\\n }\\r\\n //Motion\\r\\n else if ((alarmCodeInt & 1024) == 1024) {\\r\\n var alarm = 'ALMOV';\\r\\n }\\r\\n //No Motion\\r\\n else if ((alarmCodeInt & 2048) == 2048) {\\r\\n var alarm = 'ALNM';\\r\\n }\\r\\n //SOS\\r\\n else if ((alarmCodeInt & 4096) == 4096) {\\r\\n var alarm = 'ALSOS';\\r\\n } else if ((alarmCodeInt & 8192) == 8192) {\\r\\n var alarm = 'Side1';\\r\\n } else if ((alarmCodeInt & 16384) == 16384) {\\r\\n var alarm = 'Side2';\\r\\n }\\r\\n //Battery charging\\r\\n else if ((alarmCodeInt & 32768) == 32768) {\\r\\n var alarm = 'BATCN';\\r\\n }\\r\\n //Battery no charging\\r\\n else if ((alarmCodeInt & 65536) == 65536) {\\r\\n var alarm = 'BATCF';\\r\\n }\\r\\n //SOS Ending\\r\\n // Temporary Commented until we know exactly how it works. 22/09/2022\\r\\n else if ((alarmCodeInt & 131072) == 131072) {\\r\\n var alarm = 'ALA-F';\\r\\n info = 'Alarm Finished';\\r\\n }\\r\\n //Amber Alert EC03 only\\r\\n else if ((alarmCodeInt & 262144) == 262144) {\\r\\n var alarm = 'ALA';\\r\\n }\\r\\n // welfare Alert check-in ALA-O\\r\\n else if ((alarmCodeInt & 524288) == 524288) {\\r\\n var alarm = 'ALA-O';\\r\\n }\\r\\n // Amber alert Ending ALA-C\\r\\n else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n var alarm = 'ALA-C';\\r\\n }\\r\\n // Amber alert Ending ALA-C\\r\\n //else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n // var alarm = 'ALA-C';\\r\\n //}\\r\\n // Fall-Down Alert ending\\r\\n else if ((alarmCodeInt & 2097152) == 2097152) {\\r\\n var alarm = 'ALF-C';\\r\\n }\\r\\n // welfare Alert Ending ALA\\r\\n else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n var alarm = 'ALA';\\r\\n }\\r\\n // Beacon absent Alert 11/10/22. Need to be added in msg types\\r\\n //else if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n // var alarm = 'BEA';\\r\\n //}\\r\\n general += 'alarm:' + alarm + ',';\\r\\n break;\\r\\n //Custom ID\\r\\n case '03':\\r\\n customID = value;\\r\\n if (!allowedCID.includes(value)) {\\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 //<>,<>,<>,<>,<>\\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 if (!allowedCID.includes(customID)) {\\r\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n AddValue(codeValues, \\\"customID\\\", customID);\\r\\n return\\r\\n }\\r\\n if (statusDevice) {\\r\\n messageForReceiver = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n }\\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;\\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 }\\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 = 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 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 = (`Watch-${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 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 = (`Watch-${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 //Heart Rate Data\\r\\n case '41':\\r\\n var numSPO = (keyLength - 2) / 12;\\r\\n for (let j = 0; j < numSPO; 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 SPOHex = value.substring(8, 10);\\r\\n var SPO = hexToDecimal(SPOHex);\\r\\n var trustLevelHex = value.substring(10, 12);\\r\\n var trustLevel = hexToDecimal(trustLevelHex);\\r\\n info = SPO;\\r\\n //var alarmCode = 'True';\\r\\n var alarm = 'HBP';\\r\\n general += ' SPO2 rate' + j + ':' + SPO + ',';\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};SPO=${info};TLEVEL=${trustLevel};LABEL=%`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n }\\r\\n break;\\r\\n //BLE Connected . For Flic button\\r\\n case '62':\\r\\n location_type = 'BLE';\\r\\n //var alarm = 'EBZI'; \\r\\n //var latitudeHex = '00';\\r\\n //var longitudeHex = '00';\\r\\n //var descr = 'empty';\\r\\n var flag = hexToDecimal(value.substring(0, 2)); // 0= Disconnected, 1= Connected\\r\\n var mac = value.substring(2, 14); // No hace falta darle la vuelta\\r\\n // add : format in MAC\\r\\n mac = mac.match(/.{1,2}/g).join(':');\\r\\n var batLevel = hexToDecimal(value.substring(14, 16)); // 0-100\\r\\n //location_time = timestamp;\\r\\n ble_data = `${flag},${batLevel},${mac}`;\\r\\n general += 'BLE location (State):' + flag + ', (bat):' + batLevel + ', (mac):' + mac + ',';\\r\\n break;\\r\\n }\\r\\n }\\r\\n if (alarmCode) {\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch;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 = (`Watch;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': // Ringer Volume\\r\\n var volume = hexToDecimal(value);\\r\\n imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;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 = (`Watch;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 '0F': // Enable control.... Used for STEP COUNTING SETTINGS\\r\\n // 'FF FF 21 80'\\r\\n var StepStatus = hex2bin(value.substring(4, 6));\\r\\n var enalbleDisable = '';\\r\\n if (StepStatus.substring(7, 8) == '1') {\\r\\n var step = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var step = 'Disable, '\\r\\n };\\r\\n //var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n //hrate += detectingInterval;\\r\\n AddValue(codeValues, \\\"step\\\", step);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadStepsSettings.EnableDisableReadStepsSettings, enalbleDisable);\\r\\n //AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadStepsSettings.EnableDisableReadStepsSettings);\\r\\n //configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\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 = (`Watch;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 '34': //ContactList with name\\r\\n var contactNumber = value.substring(1, 2);\\r\\n var telLength = hexToDecimal(value.substring(2, 4));\\r\\n var tel = '';\\r\\n switch (contactNumber) {\\r\\n // Emergency Number\\r\\n case '0':\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n break;\\r\\n // Speed Dial Number\\r\\n //case '1':\\r\\n // tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n // AddValue(codeValues, \\\"SpeedDialNumber\\\", tel);\\r\\n // AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.SpeedDialNumber, tel);\\r\\n // configsToAck.push(configIds.ReadSpeedDialSettings.SpeedDialNumber);\\r\\n // break;\\r\\n // Gateway Number\\r\\n case '9': //00447781482635,Esendex UK 0034627177148,Esendex Spain 00447507288240,Esendex UK Acceptance\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n if (tel.includes('447781482635') || tel.includes('00447781482635')) {\\r\\n tel = 'Esendex UK'\\r\\n } else if (tel.includes('34627177148') || tel.includes('0034627177148')) {\\r\\n tel = 'Esendex Spain'\\r\\n } else if (tel.includes('447507288240') || tel.includes('00447507288240')) {\\r\\n tel = 'Esendex UK Acceptance'\\r\\n } else {\\r\\n tel = 'Default'\\r\\n }\\r\\n AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n break;\\r\\n default:\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n if (tel.length < 6) {\\r\\n contacts += '';\\r\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n break;\\r\\n }\\r\\n //contacts += 'A' + (contactNumber - 1) + ': ' + tel + ', ';\\r\\n contacts += tel + ', ';\\r\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n break;\\r\\n }\\r\\n break;\\r\\n case '40': // APN\\r\\n //no ACK need\\r\\n AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'));\\r\\n configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\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 = (`Watch;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 = (`Watch;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 '46': //HeartRate\\r\\n // '10 0E 00 80'\\r\\n var HeartRateStatus = hex2bin(value.substring(6, 8));\\r\\n var enalbleDisable = '';\\r\\n if (HeartRateStatus.substring(0, 1) == '1') {\\r\\n var hrate = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var hrate = 'Disable, '\\r\\n };\\r\\n var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n hrate += detectingInterval;\\r\\n AddValue(codeValues, \\\"hrate\\\", hrate);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings);\\r\\n configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\r\\n break;\\r\\n case '47': // Custom Id\\r\\n imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;ACK-CUSTID;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"customeid\\\", value);\\r\\n AddValue(configsToUpdate, configIds.ReadState.CustomId, hex_to_ascii(value)); //now it comes \\\"3036\\\"\\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 // commented until Eview fixes this function\\r\\n /*\\r\\n messageForReceiver = (`Watch;ACK-NOMOTION;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"nomotion\\\", alertSetting);\\r\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings, enableDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n configsToAck.push(configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings);\\r\\n configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n */\\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 = (`Watch;ACK-FALLALERT;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n var sesibityOptionValue = hexToDecimal(value.substring(1, 2));\\r\\n sensibility += sesibityOptionValue;\\r\\n AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n //AddValue(configsToUpdate, configIds.ReadAlertSettings.FallSettings, sensibility);\\r\\n AddValue(configsToUpdate, configIds.ReadFallSettings.EnableDisableFallSettings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadFallSettings.Sensitivity, sesibityOptionValue);\\r\\n //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n configsToAck.push(configIds.ReadFallSettings.EnableDisableFallSettings);\\r\\n configsToAck.push(configIds.ReadFallSettings.Sensitivity);\\r\\n break;\\r\\n case '73': //BeaconList\\r\\n var beaconNumber = hexToDecimal(value.substring(1, 2));\\r\\n var beaconStatus = hex2bin(value.substring(0, 1));\\r\\n beaconStatus = hex_to_ascii(value.substring(30, value.length));\\r\\n //beaconStatus = changeEndianness(value.substring(30, value.length));\\r\\n //homeBeacon += 'B' + (beaconNumber + 1) + ': ' + beaconStatus + ', ';\\r\\n homeBeacon += beaconStatus + ', ';\\r\\n AddValue(codeValues, \\\"homeBeacon\\\", homeBeacon);\\r\\n messageForReceiver = (`Watch;ACK-GDATA;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n break;\\r\\n case '4A': //Wifi Network List\\r\\n var wifiSSIDLenght = hexToDecimal(value.substring(2, 4));\\r\\n var wifiPasswordLenght = hexToDecimal(value.substring(4, 6));\\r\\n var wifiIndex = hexToDecimal(value.substring(1, 2));\\r\\n //var wifiStatus = hexToDecimal(value.substring(0, 1));\\r\\n var wifiStatus = value.substring(0, 1);\\r\\n /*var enalbleDisable = wifiSSID = wifiPassword = homeWifi = '';\\r\\n /var homeWifi = '';\\r\\n if (wifiIndex == '0') { // Only first Wifi of the list\\r\\n if (wifiStatus == '8') {\\r\\n homeWifi += ' Enable, '\\r\\n enalbleDisable = '1';\\r\\n } else {\\r\\n homeWifi += ' Disable, '\\r\\n //enalbleDisable = '0';\\r\\n };*/\\r\\n if ((wifiStatus == '8') || (wifiStatus == 'C')) { // 8 == ON OR C== ON and Connected\\r\\n var wifiSSID = hex_to_ascii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\r\\n var wifiPassword = hex_to_ascii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\r\\n var imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;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 = (`Watch;ACK-SPEED;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"speed\\\", alertSetting);\\r\\n AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\r\\n configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\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 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 = (`Watch-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 = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch-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 if (typeof configIds !== 'undefined' && configIds && configIds.ConfigureDevice && configIds.ConfigureDevice.LastConfigured) { // when is defined\\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 }\\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(hex) { // Hex to Ascii \\r\\n if (hex.length % 2 !== 0) {\\r\\n throw new Error(\\\"Hex string length must be even\\\");\\r\\n }\\r\\n let ascii = '';\\r\\n for (let i = 0; i < hex.length; i += 2) {\\r\\n const byte = hex.substr(i, 2);\\r\\n const charCode = parseInt(byte, 16);\\r\\n if (charCode !== 0) { // remove null character (\\\\u0000)\\r\\n ascii += String.fromCharCode(charCode);\\r\\n }\\r\\n }\\r\\n return ascii;\\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":1763493459},{"Type":1,"NewValue":"{\"Id\":437,\"Name\":\"Access TEC Care Watch\",\"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 // Watch protocol - please see variables and typical values in order below\\r\\n // Watch-CYC;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;SIGNAL=<>;WM=<>;GENERAL=<>\\r\\n // Watch-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\r\\n //\\r\\n // Author: Juanmi Navarro\\r\\n // Created: 01/01/0000\\r\\n // Last modified: 18/09/2025\\r\\n //\\r\\n ///////////////////////////////////////////////////////////////////////////////\\r\\n if (typeof localTesting === \\\"undefined\\\") {\\r\\n let localTesting = false;\\r\\n }\\r\\n const crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,\\r\\n 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,\\r\\n 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,\\r\\n 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,\\r\\n 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,\\r\\n 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,\\r\\n 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,\\r\\n 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,\\r\\n 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,\\r\\n 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,\\r\\n 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,\\r\\n 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,\\r\\n 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,\\r\\n 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,\\r\\n 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,\\r\\n 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,\\r\\n 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,\\r\\n 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,\\r\\n 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,\\r\\n 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,\\r\\n 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,\\r\\n 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n ];\\r\\n var codeValues = [];\\r\\n AddValue(codeValues, 'protocol_template', 'Watch');\\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 = (`Watch-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 var allowedCID = ['3036', '06'];\\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 } 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 }\\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 //<>,<>,<> \\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];\\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 //<>,<>,<> \\r\\n if (mac2) {\\r\\n AddValue(codeValues, 'beacon_mac', mac2);\\r\\n var simpleQuery2 = [{\\r\\n 'code': 'Mac',\\r\\n 'value': mac2,\\r\\n }];\\r\\n var simpleQueryLabel2 = {\\r\\n 'table': 'beacons',\\r\\n 'select': 'Name',\\r\\n 'query': simpleQuery2\\r\\n };\\r\\n var labels2 = [];\\r\\n labels2.push(JSON.stringify(simpleQueryLabel2));\\r\\n AddValue(codeValues, 'oysta_labels', JSON.stringify(labels2));\\r\\n }\\r\\n if (params.beacon_major) {\\r\\n AddValue(codeValues, 'beacon_major', params.beacon_major);\\r\\n } else {\\r\\n AddValue(codeValues, 'beacon_major', 0);\\r\\n }\\r\\n if (params.beacon_minor) {\\r\\n AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\r\\n } else {\\r\\n AddValue(codeValues, 'beacon_minor', 0);\\r\\n }\\r\\n //AddValue(codeValues,'oysta_labels', label);\\r\\n //AddValue(codeValues,'oysta_value', mac);\\r\\n }\\r\\n /* meter mas tarde... \\r\\n if (params.smart_data !== 'undefined') {\\r\\n var gen_location = params.smart_data.split(',')\\r\\n var latitude = gen_location[0]\\r\\n var longitude = gen_location[1]\\r\\n var location_accuracy = gen_location[2]\\r\\n var altitude = gen_location[3]\\r\\n AddValue(codeValues,'latitude', latitude);\\r\\n AddValue(codeValues,'longitude', longitude);\\r\\n AddValue(codeValues,'altitude', altitude);\\r\\n AddValue(codeValues,'location_accuracy', location_accuracy);\\r\\n }\\r\\n */\\r\\n /*else if ((params.event_time) && (params.event_time == '')) {\\r\\n var event_time = moment.utc().unix();\\r\\n AddValue(codeValues,'event_time', event_time);\\r\\n } revisar mas adelante*/\\r\\n if (params.location_time) {\\r\\n AddValue(codeValues, 'location_time', params.location_time);\\r\\n }\\r\\n if (params.event_time) {\\r\\n AddValue(codeValues, 'event_time', params.event_time);\\r\\n }\\r\\n // to parse SMS info from the device\\r\\n switch (messageTypeLocalCode) {\\r\\n case 'COMM-SMS': // SMS message sent in\\r\\n if (params.data.startsWith('Device location request')) {\\r\\n configsToAck.push(configIds.Controls.RealTimeLocate);\\r\\n } else if (params.data.startsWith('Set IP ok')) {\\r\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n } else if (params.data.startsWith('IMEI:')) {\\r\\n configsToAck.push(configIds.Controls.GetFirmwareVersion);\\r\\n } else if (params.data.startsWith('Set IP ok')) {\\r\\n configsToAck.push(configIds.Controls.ClearBufferedMessages);\\r\\n } else if (params.data.startsWith('flush ok')) {\\r\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n } else if (params.data.startsWith('Set Watch-')) {\\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 = (`Watch-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 = (`Watch;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 = (`Watch;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 = (`Watch-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 // decode global msg\\r\\n function decoder(str) { // decode rawdata\\r\\n // CARE Decoder\\r\\n //AddValue(codeValues, 'Message : ', str);\\r\\n var message = str;\\r\\n var index = 18;\\r\\n //parse header & properties\\r\\n var properties = message.substring(2, 4);\\r\\n var lengthLittleEndian = message.substring(4, 8);\\r\\n var total_length = lengthLittleEndian.substring(2, 4) + lengthLittleEndian.substring(0, 2);\\r\\n total_length = 2 * hexToDecimal(total_length.substring(0, 4));\\r\\n var sequenceID = message.substring(12, 16);\\r\\n var command = message.substring(16, 18);\\r\\n //mask bitwise (properties should be '10')\\r\\n if ((parseInt(properties) & 8) == 8) {\\r\\n needsAck = true;\\r\\n } else needsAck = false;\\r\\n // need to check if checksum is correct for possible msg corruption 10/03/23\\r\\n var checksum = message.substring(8, 12);\\r\\n var messageBody = message.substring(16, message.length);\\r\\n debug('message =' + message);\\r\\n debug('checksum =' + checksum);\\r\\n debug('calculateCheckSum =' + calculateCheckSum(messageBody));\\r\\n if (calculateCheckSum(messageBody) == checksum) { // payload is valid\\r\\n debug(\\\"message has valid checksum\\\");\\r\\n var messageBody = command; // update value for the ACK\\r\\n debug('command =' + command);\\r\\n if (command == '01') {\\r\\n while (index < total_length + 16) {\\r\\n 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\\r\\n if ((alarmCodeExtInt & 1) == 1) {\\r\\n var alarm = 'ALF-C';\\r\\n }\\r\\n // Welfare Check-out\\r\\n else if ((alarmCodeExtInt & 2) == 2) {\\r\\n var alarm = 'ALA-C';\\r\\n }\\r\\n // Standard Alerts\\r\\n //Battery low\\r\\n else if ((alarmCodeInt & 1) == 1) {\\r\\n var alarm = 'BATL';\\r\\n }\\r\\n //Overspeed\\r\\n else if ((alarmCodeInt & 2) == 2) {\\r\\n var alarm = 'ALSP';\\r\\n }\\r\\n //Fall\\r\\n else if ((alarmCodeInt & 4) == 4) {\\r\\n var alarm = 'ALF';\\r\\n }\\r\\n //Tilt\\r\\n else if ((alarmCodeInt & 8) == 8) {\\r\\n var alarm = 'TLT';\\r\\n } else if ((alarmCodeInt & 16) == 16) {\\r\\n if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n var alarm = 'Geo1-IN';\\r\\n } else {\\r\\n var alarm = 'Geo1-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 32) == 32) {\\r\\n if ((alarmCodeInt & 33554432) == 33554432) {\\r\\n var alarm = 'Geo2-IN';\\r\\n } else {\\r\\n var alarm = 'Geo2-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 64) == 64) {\\r\\n if ((alarmCodeInt & 67108864) == 67108864) {\\r\\n var alarm = 'Geo3-IN';\\r\\n } else {\\r\\n var alarm = 'Geo3-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 128) == 128) {\\r\\n if ((alarmCodeInt & 134217728) == 134217728) {\\r\\n var alarm = 'Geo4-IN';\\r\\n } else {\\r\\n var alarm = 'Geo4-OUT';\\r\\n }\\r\\n }\\r\\n //Power Off\\r\\n else if ((alarmCodeInt & 256) == 256) {\\r\\n var alarm = 'PWRF';\\r\\n }\\r\\n //Power On\\r\\n else if ((alarmCodeInt & 512) == 512) {\\r\\n var alarm = 'PWRN';\\r\\n }\\r\\n //Motion\\r\\n else if ((alarmCodeInt & 1024) == 1024) {\\r\\n var alarm = 'ALMOV';\\r\\n }\\r\\n //No Motion\\r\\n else if ((alarmCodeInt & 2048) == 2048) {\\r\\n var alarm = 'ALNM';\\r\\n }\\r\\n //SOS\\r\\n else if ((alarmCodeInt & 4096) == 4096) {\\r\\n var alarm = 'ALSOS';\\r\\n } else if ((alarmCodeInt & 8192) == 8192) {\\r\\n var alarm = 'Side1';\\r\\n } else if ((alarmCodeInt & 16384) == 16384) {\\r\\n var alarm = 'Side2';\\r\\n }\\r\\n //Battery charging\\r\\n else if ((alarmCodeInt & 32768) == 32768) {\\r\\n var alarm = 'BATCN';\\r\\n }\\r\\n //Battery no charging\\r\\n else if ((alarmCodeInt & 65536) == 65536) {\\r\\n var alarm = 'BATCF';\\r\\n }\\r\\n //SOS Ending\\r\\n // Temporary Commented until we know exactly how it works. 22/09/2022\\r\\n else if ((alarmCodeInt & 131072) == 131072) {\\r\\n var alarm = 'ALA-F';\\r\\n info = 'Alarm Finished';\\r\\n }\\r\\n //Amber Alert EC03 only\\r\\n else if ((alarmCodeInt & 262144) == 262144) {\\r\\n var alarm = 'ALA';\\r\\n }\\r\\n // welfare Alert check-in ALA-O\\r\\n else if ((alarmCodeInt & 524288) == 524288) {\\r\\n var alarm = 'ALA-O';\\r\\n }\\r\\n // Amber alert Ending ALA-C\\r\\n else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n var alarm = 'ALA-C';\\r\\n }\\r\\n // Amber alert Ending ALA-C\\r\\n //else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n // var alarm = 'ALA-C';\\r\\n //}\\r\\n // Fall-Down Alert ending\\r\\n else if ((alarmCodeInt & 2097152) == 2097152) {\\r\\n var alarm = 'ALF-C';\\r\\n }\\r\\n // welfare Alert Ending ALA\\r\\n else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n var alarm = 'ALA';\\r\\n }\\r\\n // Beacon absent Alert 11/10/22. Need to be added in msg types\\r\\n //else if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n // var alarm = 'BEA';\\r\\n //}\\r\\n general += 'alarm:' + alarm + ',';\\r\\n break;\\r\\n //Custom ID\\r\\n case '03':\\r\\n customID = value;\\r\\n if (!allowedCID.includes(value)) {\\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 //<>,<>,<>,<>,<>\\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 if (!allowedCID.includes(customID)) {\\r\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n AddValue(codeValues, \\\"customID\\\", customID);\\r\\n return\\r\\n }\\r\\n if (statusDevice) {\\r\\n messageForReceiver = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n }\\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;\\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 }\\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 = 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 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 = (`Watch-${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 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 = (`Watch-${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 // SPO2\\r\\n case '41':\\r\\n var numSPO = (keyLength - 2) / 12;\\r\\n for (let j = 0; j < numSPO; 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 SPOHex = value.substring(8, 10);\\r\\n var SPO = hexToDecimal(SPOHex);\\r\\n var trustLevelHex = value.substring(10, 12);\\r\\n var trustLevel = hexToDecimal(trustLevelHex);\\r\\n info = SPO;\\r\\n //var alarmCode = 'True';\\r\\n var alarm = 'SPO2';\\r\\n general += ' SPO2 rate' + j + ':' + SPO + ',';\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};SPO2=${info};TLEVEL=${trustLevel};LABEL=%`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n }\\r\\n break;\\r\\n //BLE Connected . For Flic button\\r\\n case '62':\\r\\n location_type = 'BLE';\\r\\n //var alarm = 'EBZI'; \\r\\n //var latitudeHex = '00';\\r\\n //var longitudeHex = '00';\\r\\n //var descr = 'empty';\\r\\n var flag = hexToDecimal(value.substring(0, 2)); // 0= Disconnected, 1= Connected\\r\\n var mac = value.substring(2, 14); // No hace falta darle la vuelta\\r\\n // add : format in MAC\\r\\n mac = mac.match(/.{1,2}/g).join(':');\\r\\n var batLevel = hexToDecimal(value.substring(14, 16)); // 0-100\\r\\n //location_time = timestamp;\\r\\n ble_data = `${flag},${batLevel},${mac}`;\\r\\n general += 'BLE location (State):' + flag + ', (bat):' + batLevel + ', (mac):' + mac + ',';\\r\\n break;\\r\\n }\\r\\n }\\r\\n if (alarmCode) {\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch;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 = (`Watch;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': // Ringer Volume\\r\\n var volume = hexToDecimal(value);\\r\\n imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;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 = (`Watch;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 '0F': // Enable control.... Used for STEP COUNTING SETTINGS\\r\\n // 'FF FF 21 80'\\r\\n var StepStatus = hex2bin(value.substring(4, 6));\\r\\n var enalbleDisable = '';\\r\\n if (StepStatus.substring(7, 8) == '1') {\\r\\n var step = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var step = 'Disable, '\\r\\n };\\r\\n //var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n //hrate += detectingInterval;\\r\\n AddValue(codeValues, \\\"step\\\", step);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadStepsSettings.EnableDisableReadStepsSettings, enalbleDisable);\\r\\n //AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadStepsSettings.EnableDisableReadStepsSettings);\\r\\n //configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\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 = (`Watch;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 '34': //ContactList with name\\r\\n var contactNumber = value.substring(1, 2);\\r\\n var telLength = hexToDecimal(value.substring(2, 4));\\r\\n var tel = '';\\r\\n switch (contactNumber) {\\r\\n // Emergency Number\\r\\n case '0':\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n break;\\r\\n // Speed Dial Number\\r\\n //case '1':\\r\\n // tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n // AddValue(codeValues, \\\"SpeedDialNumber\\\", tel);\\r\\n // AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.SpeedDialNumber, tel);\\r\\n // configsToAck.push(configIds.ReadSpeedDialSettings.SpeedDialNumber);\\r\\n // break;\\r\\n // Gateway Number\\r\\n case '9': //00447781482635,Esendex UK 0034627177148,Esendex Spain 00447507288240,Esendex UK Acceptance\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n if (tel.includes('447781482635') || tel.includes('00447781482635')) {\\r\\n tel = 'Esendex UK'\\r\\n } else if (tel.includes('34627177148') || tel.includes('0034627177148')) {\\r\\n tel = 'Esendex Spain'\\r\\n } else if (tel.includes('447507288240') || tel.includes('00447507288240')) {\\r\\n tel = 'Esendex UK Acceptance'\\r\\n } else {\\r\\n tel = 'Default'\\r\\n }\\r\\n AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n break;\\r\\n default:\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n if (tel.length < 6) {\\r\\n contacts += '';\\r\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n break;\\r\\n }\\r\\n //contacts += 'A' + (contactNumber - 1) + ': ' + tel + ', ';\\r\\n contacts += tel + ', ';\\r\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n break;\\r\\n }\\r\\n break;\\r\\n case '40': // APN\\r\\n //no ACK need\\r\\n AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'));\\r\\n configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\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 = (`Watch;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 = (`Watch;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 '46': //HeartRate\\r\\n // '10 0E 00 80'\\r\\n var HeartRateStatus = hex2bin(value.substring(6, 8));\\r\\n var enalbleDisable = '';\\r\\n if (HeartRateStatus.substring(0, 1) == '1') {\\r\\n var hrate = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var hrate = 'Disable, '\\r\\n };\\r\\n var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n hrate += detectingInterval;\\r\\n AddValue(codeValues, \\\"hrate\\\", hrate);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings);\\r\\n configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\r\\n break;\\r\\n case '47': // Custom Id\\r\\n imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;ACK-CUSTID;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"customeid\\\", value);\\r\\n AddValue(configsToUpdate, configIds.ReadState.CustomId, hex_to_ascii(value)); //now it comes \\\"3036\\\"\\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 // commented until Eview fixes this function\\r\\n /*\\r\\n messageForReceiver = (`Watch;ACK-NOMOTION;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"nomotion\\\", alertSetting);\\r\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings, enableDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n configsToAck.push(configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings);\\r\\n configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n */\\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 = (`Watch;ACK-FALLALERT;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n var sesibityOptionValue = hexToDecimal(value.substring(1, 2));\\r\\n sensibility += sesibityOptionValue;\\r\\n AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n //AddValue(configsToUpdate, configIds.ReadAlertSettings.FallSettings, sensibility);\\r\\n AddValue(configsToUpdate, configIds.ReadFallSettings.EnableDisableFallSettings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadFallSettings.Sensitivity, sesibityOptionValue);\\r\\n //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n configsToAck.push(configIds.ReadFallSettings.EnableDisableFallSettings);\\r\\n configsToAck.push(configIds.ReadFallSettings.Sensitivity);\\r\\n break;\\r\\n case '73': //BeaconList\\r\\n var beaconNumber = hexToDecimal(value.substring(1, 2));\\r\\n var beaconStatus = hex2bin(value.substring(0, 1));\\r\\n beaconStatus = hex_to_ascii(value.substring(30, value.length));\\r\\n //beaconStatus = changeEndianness(value.substring(30, value.length));\\r\\n //homeBeacon += 'B' + (beaconNumber + 1) + ': ' + beaconStatus + ', ';\\r\\n homeBeacon += beaconStatus + ', ';\\r\\n AddValue(codeValues, \\\"homeBeacon\\\", homeBeacon);\\r\\n messageForReceiver = (`Watch;ACK-GDATA;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n break;\\r\\n case '4A': //Wifi Network List\\r\\n var wifiSSIDLenght = hexToDecimal(value.substring(2, 4));\\r\\n var wifiPasswordLenght = hexToDecimal(value.substring(4, 6));\\r\\n var wifiIndex = hexToDecimal(value.substring(1, 2));\\r\\n //var wifiStatus = hexToDecimal(value.substring(0, 1));\\r\\n var wifiStatus = value.substring(0, 1);\\r\\n /*var enalbleDisable = wifiSSID = wifiPassword = homeWifi = '';\\r\\n /var homeWifi = '';\\r\\n if (wifiIndex == '0') { // Only first Wifi of the list\\r\\n if (wifiStatus == '8') {\\r\\n homeWifi += ' Enable, '\\r\\n enalbleDisable = '1';\\r\\n } else {\\r\\n homeWifi += ' Disable, '\\r\\n //enalbleDisable = '0';\\r\\n };*/\\r\\n if ((wifiStatus == '8') || (wifiStatus == 'C')) { // 8 == ON OR C== ON and Connected\\r\\n var wifiSSID = hex_to_ascii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\r\\n var wifiPassword = hex_to_ascii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\r\\n var imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;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 = (`Watch;ACK-SPEED;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"speed\\\", alertSetting);\\r\\n AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\r\\n configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\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 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 = (`Watch-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 = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch-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 if (typeof configIds !== 'undefined' && configIds && configIds.ConfigureDevice && configIds.ConfigureDevice.LastConfigured) { // when is defined\\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 }\\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(hex) { // Hex to Ascii \\r\\n if (hex.length % 2 !== 0) {\\r\\n throw new Error(\\\"Hex string length must be even\\\");\\r\\n }\\r\\n let ascii = '';\\r\\n for (let i = 0; i < hex.length; i += 2) {\\r\\n const byte = hex.substr(i, 2);\\r\\n const charCode = parseInt(byte, 16);\\r\\n if (charCode !== 0) { // remove null character (\\\\u0000)\\r\\n ascii += String.fromCharCode(charCode);\\r\\n }\\r\\n }\\r\\n return ascii;\\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":1763495297},{"Type":1,"NewValue":"{\"Id\":437,\"Name\":\"Access TEC Care Watch\",\"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 // Watch protocol - please see variables and typical values in order below\\r\\n // Watch-CYC;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;SIGNAL=<>;WM=<>;GENERAL=<>\\r\\n // Watch-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\r\\n //\\r\\n // Author: Juanmi Navarro\\r\\n // Created: 01/01/0000\\r\\n // Last modified: 18/09/2025\\r\\n //\\r\\n ///////////////////////////////////////////////////////////////////////////////\\r\\n if (typeof localTesting === \\\"undefined\\\") {\\r\\n let localTesting = false;\\r\\n }\\r\\n const crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,\\r\\n 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,\\r\\n 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,\\r\\n 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,\\r\\n 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,\\r\\n 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,\\r\\n 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,\\r\\n 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,\\r\\n 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,\\r\\n 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,\\r\\n 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,\\r\\n 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,\\r\\n 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,\\r\\n 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,\\r\\n 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,\\r\\n 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,\\r\\n 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,\\r\\n 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,\\r\\n 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,\\r\\n 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,\\r\\n 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,\\r\\n 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n ];\\r\\n var codeValues = [];\\r\\n AddValue(codeValues, 'protocol_template', 'Watch');\\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 = (`Watch-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 var allowedCID = ['3036', '06'];\\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 } 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 }\\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 //<>,<>,<> \\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];\\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 //<>,<>,<> \\r\\n if (mac2) {\\r\\n AddValue(codeValues, 'beacon_mac', mac2);\\r\\n var simpleQuery2 = [{\\r\\n 'code': 'Mac',\\r\\n 'value': mac2,\\r\\n }];\\r\\n var simpleQueryLabel2 = {\\r\\n 'table': 'beacons',\\r\\n 'select': 'Name',\\r\\n 'query': simpleQuery2\\r\\n };\\r\\n var labels2 = [];\\r\\n labels2.push(JSON.stringify(simpleQueryLabel2));\\r\\n AddValue(codeValues, 'oysta_labels', JSON.stringify(labels2));\\r\\n }\\r\\n if (params.beacon_major) {\\r\\n AddValue(codeValues, 'beacon_major', params.beacon_major);\\r\\n } else {\\r\\n AddValue(codeValues, 'beacon_major', 0);\\r\\n }\\r\\n if (params.beacon_minor) {\\r\\n AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\r\\n } else {\\r\\n AddValue(codeValues, 'beacon_minor', 0);\\r\\n }\\r\\n //AddValue(codeValues,'oysta_labels', label);\\r\\n //AddValue(codeValues,'oysta_value', mac);\\r\\n }\\r\\n /* meter mas tarde... \\r\\n if (params.smart_data !== 'undefined') {\\r\\n var gen_location = params.smart_data.split(',')\\r\\n var latitude = gen_location[0]\\r\\n var longitude = gen_location[1]\\r\\n var location_accuracy = gen_location[2]\\r\\n var altitude = gen_location[3]\\r\\n AddValue(codeValues,'latitude', latitude);\\r\\n AddValue(codeValues,'longitude', longitude);\\r\\n AddValue(codeValues,'altitude', altitude);\\r\\n AddValue(codeValues,'location_accuracy', location_accuracy);\\r\\n }\\r\\n */\\r\\n /*else if ((params.event_time) && (params.event_time == '')) {\\r\\n var event_time = moment.utc().unix();\\r\\n AddValue(codeValues,'event_time', event_time);\\r\\n } revisar mas adelante*/\\r\\n if (params.location_time) {\\r\\n AddValue(codeValues, 'location_time', params.location_time);\\r\\n }\\r\\n if (params.event_time) {\\r\\n AddValue(codeValues, 'event_time', params.event_time);\\r\\n }\\r\\n // to parse SMS info from the device\\r\\n switch (messageTypeLocalCode) {\\r\\n case 'COMM-SMS': // SMS message sent in\\r\\n if (params.data.startsWith('Device location request')) {\\r\\n configsToAck.push(configIds.Controls.RealTimeLocate);\\r\\n } else if (params.data.startsWith('Set IP ok')) {\\r\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n } else if (params.data.startsWith('IMEI:')) {\\r\\n configsToAck.push(configIds.Controls.GetFirmwareVersion);\\r\\n } else if (params.data.startsWith('Set IP ok')) {\\r\\n configsToAck.push(configIds.Controls.ClearBufferedMessages);\\r\\n } else if (params.data.startsWith('flush ok')) {\\r\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n } else if (params.data.startsWith('Set Watch-')) {\\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 = (`Watch-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 = (`Watch;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 = (`Watch;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 = (`Watch-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 // decode global msg\\r\\n function decoder(str) { // decode rawdata\\r\\n // CARE Decoder\\r\\n //AddValue(codeValues, 'Message : ', str);\\r\\n var message = str;\\r\\n var index = 18;\\r\\n //parse header & properties\\r\\n var properties = message.substring(2, 4);\\r\\n var lengthLittleEndian = message.substring(4, 8);\\r\\n var total_length = lengthLittleEndian.substring(2, 4) + lengthLittleEndian.substring(0, 2);\\r\\n total_length = 2 * hexToDecimal(total_length.substring(0, 4));\\r\\n var sequenceID = message.substring(12, 16);\\r\\n var command = message.substring(16, 18);\\r\\n //mask bitwise (properties should be '10')\\r\\n if ((parseInt(properties) & 8) == 8) {\\r\\n needsAck = true;\\r\\n } else needsAck = false;\\r\\n // need to check if checksum is correct for possible msg corruption 10/03/23\\r\\n var checksum = message.substring(8, 12);\\r\\n var messageBody = message.substring(16, message.length);\\r\\n debug('message =' + message);\\r\\n debug('checksum =' + checksum);\\r\\n debug('calculateCheckSum =' + calculateCheckSum(messageBody));\\r\\n if (calculateCheckSum(messageBody) == checksum) { // payload is valid\\r\\n debug(\\\"message has valid checksum\\\");\\r\\n var messageBody = command; // update value for the ACK\\r\\n debug('command =' + command);\\r\\n if (command == '01') {\\r\\n while (index < total_length + 16) {\\r\\n 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\\r\\n if ((alarmCodeExtInt & 1) == 1) {\\r\\n var alarm = 'ALF-C';\\r\\n }\\r\\n // Welfare Check-out\\r\\n else if ((alarmCodeExtInt & 2) == 2) {\\r\\n var alarm = 'ALA-C';\\r\\n }\\r\\n // Standard Alerts\\r\\n //Battery low\\r\\n else if ((alarmCodeInt & 1) == 1) {\\r\\n var alarm = 'BATL';\\r\\n }\\r\\n //Overspeed\\r\\n else if ((alarmCodeInt & 2) == 2) {\\r\\n var alarm = 'ALSP';\\r\\n }\\r\\n //Fall\\r\\n else if ((alarmCodeInt & 4) == 4) {\\r\\n var alarm = 'ALF';\\r\\n }\\r\\n //Tilt\\r\\n else if ((alarmCodeInt & 8) == 8) {\\r\\n var alarm = 'TLT';\\r\\n } else if ((alarmCodeInt & 16) == 16) {\\r\\n if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n var alarm = 'Geo1-IN';\\r\\n } else {\\r\\n var alarm = 'Geo1-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 32) == 32) {\\r\\n if ((alarmCodeInt & 33554432) == 33554432) {\\r\\n var alarm = 'Geo2-IN';\\r\\n } else {\\r\\n var alarm = 'Geo2-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 64) == 64) {\\r\\n if ((alarmCodeInt & 67108864) == 67108864) {\\r\\n var alarm = 'Geo3-IN';\\r\\n } else {\\r\\n var alarm = 'Geo3-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 128) == 128) {\\r\\n if ((alarmCodeInt & 134217728) == 134217728) {\\r\\n var alarm = 'Geo4-IN';\\r\\n } else {\\r\\n var alarm = 'Geo4-OUT';\\r\\n }\\r\\n }\\r\\n //Power Off\\r\\n else if ((alarmCodeInt & 256) == 256) {\\r\\n var alarm = 'PWRF';\\r\\n }\\r\\n //Power On\\r\\n else if ((alarmCodeInt & 512) == 512) {\\r\\n var alarm = 'PWRN';\\r\\n }\\r\\n //Motion\\r\\n else if ((alarmCodeInt & 1024) == 1024) {\\r\\n var alarm = 'ALMOV';\\r\\n }\\r\\n //No Motion\\r\\n else if ((alarmCodeInt & 2048) == 2048) {\\r\\n var alarm = 'ALNM';\\r\\n }\\r\\n //SOS\\r\\n else if ((alarmCodeInt & 4096) == 4096) {\\r\\n var alarm = 'ALSOS';\\r\\n } else if ((alarmCodeInt & 8192) == 8192) {\\r\\n var alarm = 'Side1';\\r\\n } else if ((alarmCodeInt & 16384) == 16384) {\\r\\n var alarm = 'Side2';\\r\\n }\\r\\n //Battery charging\\r\\n else if ((alarmCodeInt & 32768) == 32768) {\\r\\n var alarm = 'BATCN';\\r\\n }\\r\\n //Battery no charging\\r\\n else if ((alarmCodeInt & 65536) == 65536) {\\r\\n var alarm = 'BATCF';\\r\\n }\\r\\n //SOS Ending\\r\\n // Temporary Commented until we know exactly how it works. 22/09/2022\\r\\n else if ((alarmCodeInt & 131072) == 131072) {\\r\\n var alarm = 'ALA-F';\\r\\n info = 'Alarm Finished';\\r\\n }\\r\\n //Amber Alert EC03 only\\r\\n else if ((alarmCodeInt & 262144) == 262144) {\\r\\n var alarm = 'ALA';\\r\\n }\\r\\n // welfare Alert check-in ALA-O\\r\\n else if ((alarmCodeInt & 524288) == 524288) {\\r\\n var alarm = 'ALA-O';\\r\\n }\\r\\n // Amber alert Ending ALA-C\\r\\n else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n var alarm = 'ALA-C';\\r\\n }\\r\\n // Amber alert Ending ALA-C\\r\\n //else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n // var alarm = 'ALA-C';\\r\\n //}\\r\\n // Fall-Down Alert ending\\r\\n else if ((alarmCodeInt & 2097152) == 2097152) {\\r\\n var alarm = 'ALF-C';\\r\\n }\\r\\n // welfare Alert Ending ALA\\r\\n else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n var alarm = 'ALA';\\r\\n }\\r\\n // Beacon absent Alert 11/10/22. Need to be added in msg types\\r\\n //else if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n // var alarm = 'BEA';\\r\\n //}\\r\\n general += 'alarm:' + alarm + ',';\\r\\n break;\\r\\n //Custom ID\\r\\n case '03':\\r\\n customID = value;\\r\\n if (!allowedCID.includes(value)) {\\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 //<>,<>,<>,<>,<>\\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 if (!allowedCID.includes(customID)) {\\r\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n AddValue(codeValues, \\\"customID\\\", customID);\\r\\n return\\r\\n }\\r\\n if (statusDevice) {\\r\\n messageForReceiver = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n }\\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;\\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 }\\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 = 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 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 = (`Watch-${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 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 = (`Watch-${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 // SPO2\\r\\n case '41':\\r\\n var numSPO = (keyLength - 2) / 12;\\r\\n for (let j = 0; j < numSPO; 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 SPOHex = value.substring(8, 10);\\r\\n var SPO = hexToDecimal(SPOHex);\\r\\n var trustLevelHex = value.substring(10, 12);\\r\\n var trustLevel = hexToDecimal(trustLevelHex);\\r\\n info = SPO;\\r\\n //var alarmCode = 'True';\\r\\n var alarm = 'SPO2';\\r\\n general += ' SPO2 rate' + j + ':' + SPO + ',';\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};SPO2=${info};TLEVEL=${trustLevel};LABEL=%`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n }\\r\\n break;\\r\\n //BLE Connected . For Flic button\\r\\n case '62':\\r\\n location_type = 'BLE';\\r\\n //var alarm = 'EBZI'; \\r\\n //var latitudeHex = '00';\\r\\n //var longitudeHex = '00';\\r\\n //var descr = 'empty';\\r\\n var flag = hexToDecimal(value.substring(0, 2)); // 0= Disconnected, 1= Connected\\r\\n var mac = value.substring(2, 14); // No hace falta darle la vuelta\\r\\n // add : format in MAC\\r\\n mac = mac.match(/.{1,2}/g).join(':');\\r\\n var batLevel = hexToDecimal(value.substring(14, 16)); // 0-100\\r\\n //location_time = timestamp;\\r\\n ble_data = `${flag},${batLevel},${mac}`;\\r\\n general += 'BLE location (State):' + flag + ', (bat):' + batLevel + ', (mac):' + mac + ',';\\r\\n break;\\r\\n }\\r\\n }\\r\\n if (alarmCode) {\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch;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 = (`Watch;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': // Ringer Volume\\r\\n var volume = hexToDecimal(value);\\r\\n imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;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 = (`Watch;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 '0F': // Enable control.... Used for STEP COUNTING SETTINGS\\r\\n // 'FF FF 21 80'\\r\\n var StepStatus = hex2bin(value.substring(4, 6));\\r\\n var enalbleDisable = '';\\r\\n if (StepStatus.substring(7, 8) == '1') {\\r\\n var step = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var step = 'Disable, '\\r\\n };\\r\\n //var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n //hrate += detectingInterval;\\r\\n AddValue(codeValues, \\\"step\\\", step);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadStepsSettings.EnableDisableReadStepsSettings, enalbleDisable);\\r\\n //AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadStepsSettings.EnableDisableReadStepsSettings);\\r\\n //configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\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 = (`Watch;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 '34': //ContactList with name\\r\\n var contactNumber = value.substring(1, 2);\\r\\n var telLength = hexToDecimal(value.substring(2, 4));\\r\\n var tel = '';\\r\\n switch (contactNumber) {\\r\\n // Emergency Number\\r\\n case '0':\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n break;\\r\\n // Speed Dial Number\\r\\n //case '1':\\r\\n // tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n // AddValue(codeValues, \\\"SpeedDialNumber\\\", tel);\\r\\n // AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.SpeedDialNumber, tel);\\r\\n // configsToAck.push(configIds.ReadSpeedDialSettings.SpeedDialNumber);\\r\\n // break;\\r\\n // Gateway Number\\r\\n case '9': //00447781482635,Esendex UK 0034627177148,Esendex Spain 00447507288240,Esendex UK Acceptance\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n if (tel.includes('447781482635') || tel.includes('00447781482635')) {\\r\\n tel = 'Esendex UK'\\r\\n } else if (tel.includes('34627177148') || tel.includes('0034627177148')) {\\r\\n tel = 'Esendex Spain'\\r\\n } else if (tel.includes('447507288240') || tel.includes('00447507288240')) {\\r\\n tel = 'Esendex UK Acceptance'\\r\\n } else {\\r\\n tel = 'Default'\\r\\n }\\r\\n AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n break;\\r\\n default:\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n if (tel.length < 6) {\\r\\n contacts += '';\\r\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n break;\\r\\n }\\r\\n //contacts += 'A' + (contactNumber - 1) + ': ' + tel + ', ';\\r\\n contacts += tel + ', ';\\r\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n break;\\r\\n }\\r\\n break;\\r\\n case '40': // APN\\r\\n //no ACK need\\r\\n AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'));\\r\\n configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\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 = (`Watch;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 = (`Watch;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 '46': //HeartRate\\r\\n // '10 0E 00 80'\\r\\n var HeartRateStatus = hex2bin(value.substring(6, 8));\\r\\n var enalbleDisable = '';\\r\\n if (HeartRateStatus.substring(0, 1) == '1') {\\r\\n var hrate = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var hrate = 'Disable, '\\r\\n };\\r\\n var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n hrate += detectingInterval;\\r\\n AddValue(codeValues, \\\"hrate\\\", hrate);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings);\\r\\n configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\r\\n break;\\r\\n case '47': // Custom Id\\r\\n imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;ACK-CUSTID;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"customeid\\\", value);\\r\\n AddValue(configsToUpdate, configIds.ReadState.CustomId, hex_to_ascii(value)); //now it comes \\\"3036\\\"\\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 // commented until Eview fixes this function\\r\\n /*\\r\\n messageForReceiver = (`Watch;ACK-NOMOTION;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"nomotion\\\", alertSetting);\\r\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings, enableDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n configsToAck.push(configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings);\\r\\n configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n */\\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 = (`Watch;ACK-FALLALERT;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n var sesibityOptionValue = hexToDecimal(value.substring(1, 2));\\r\\n sensibility += sesibityOptionValue;\\r\\n AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n //AddValue(configsToUpdate, configIds.ReadAlertSettings.FallSettings, sensibility);\\r\\n AddValue(configsToUpdate, configIds.ReadFallSettings.EnableDisableFallSettings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadFallSettings.Sensitivity, sesibityOptionValue);\\r\\n //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n configsToAck.push(configIds.ReadFallSettings.EnableDisableFallSettings);\\r\\n configsToAck.push(configIds.ReadFallSettings.Sensitivity);\\r\\n break;\\r\\n case '73': //BeaconList\\r\\n var beaconNumber = hexToDecimal(value.substring(1, 2));\\r\\n var beaconStatus = hex2bin(value.substring(0, 1));\\r\\n beaconStatus = hex_to_ascii(value.substring(30, value.length));\\r\\n //beaconStatus = changeEndianness(value.substring(30, value.length));\\r\\n //homeBeacon += 'B' + (beaconNumber + 1) + ': ' + beaconStatus + ', ';\\r\\n homeBeacon += beaconStatus + ', ';\\r\\n AddValue(codeValues, \\\"homeBeacon\\\", homeBeacon);\\r\\n messageForReceiver = (`Watch;ACK-GDATA;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n break;\\r\\n case '4A': //Wifi Network List\\r\\n var wifiSSIDLenght = hexToDecimal(value.substring(2, 4));\\r\\n var wifiPasswordLenght = hexToDecimal(value.substring(4, 6));\\r\\n var wifiIndex = hexToDecimal(value.substring(1, 2));\\r\\n //var wifiStatus = hexToDecimal(value.substring(0, 1));\\r\\n var wifiStatus = value.substring(0, 1);\\r\\n /*var enalbleDisable = wifiSSID = wifiPassword = homeWifi = '';\\r\\n /var homeWifi = '';\\r\\n if (wifiIndex == '0') { // Only first Wifi of the list\\r\\n if (wifiStatus == '8') {\\r\\n homeWifi += ' Enable, '\\r\\n enalbleDisable = '1';\\r\\n } else {\\r\\n homeWifi += ' Disable, '\\r\\n //enalbleDisable = '0';\\r\\n };*/\\r\\n if ((wifiStatus == '8') || (wifiStatus == 'C')) { // 8 == ON OR C== ON and Connected\\r\\n var wifiSSID = hex_to_ascii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\r\\n var wifiPassword = hex_to_ascii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\r\\n var imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;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 = (`Watch;ACK-SPEED;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"speed\\\", alertSetting);\\r\\n AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\r\\n configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n break;\\r\\n case '7A': //[Length]:05 [Key]:7A [Value]:60 54 00 80\\r\\n // {\\\"spo2Interval\\\":{\\\"interval\\\":21600,\\\"status\\\":1}}\\r\\n var SPOStatus = hex2bin(value.substring(6, 8));\\r\\n var enalbleDisable = '';\\r\\n if (SPOStatus.substring(0, 1) == '1') {\\r\\n var spo = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var spo = 'Disable, '\\r\\n };\\r\\n var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n spo += detectingInterval;\\r\\n AddValue(codeValues, \\\"SPO2\\\", spo);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadSPO2Settings.EnableDisableReadSPO2Settings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadSPO2Settings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadSPO2Settings.EnableDisableReadSPO2Settings);\\r\\n configsToAck.push(configIds.ReadSPO2Settings.ReportingFrequency);\\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 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 = (`Watch-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 = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch-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 if (typeof configIds !== 'undefined' && configIds && configIds.ConfigureDevice && configIds.ConfigureDevice.LastConfigured) { // when is defined\\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 }\\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(hex) { // Hex to Ascii \\r\\n if (hex.length % 2 !== 0) {\\r\\n throw new Error(\\\"Hex string length must be even\\\");\\r\\n }\\r\\n let ascii = '';\\r\\n for (let i = 0; i < hex.length; i += 2) {\\r\\n const byte = hex.substr(i, 2);\\r\\n const charCode = parseInt(byte, 16);\\r\\n if (charCode !== 0) { // remove null character (\\\\u0000)\\r\\n ascii += String.fromCharCode(charCode);\\r\\n }\\r\\n }\\r\\n return ascii;\\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":1763496553},{"Type":1,"NewValue":"{\"Id\":437,\"Name\":\"Access TEC Care Watch\",\"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 // Watch protocol - please see variables and typical values in order below\\r\\n // Watch-CYC;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;SIGNAL=<>;WM=<>;GENERAL=<>\\r\\n // Watch-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\r\\n //\\r\\n // Author: Juanmi Navarro\\r\\n // Created: 01/01/0000\\r\\n // Last modified: 18/09/2025\\r\\n //\\r\\n ///////////////////////////////////////////////////////////////////////////////\\r\\n if (typeof localTesting === \\\"undefined\\\") {\\r\\n let localTesting = false;\\r\\n }\\r\\n const crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,\\r\\n 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,\\r\\n 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,\\r\\n 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,\\r\\n 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,\\r\\n 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,\\r\\n 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,\\r\\n 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,\\r\\n 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,\\r\\n 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,\\r\\n 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,\\r\\n 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,\\r\\n 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,\\r\\n 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,\\r\\n 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,\\r\\n 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,\\r\\n 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,\\r\\n 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,\\r\\n 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,\\r\\n 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,\\r\\n 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,\\r\\n 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n ];\\r\\n var codeValues = [];\\r\\n AddValue(codeValues, 'protocol_template', 'Watch');\\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 = (`Watch-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 var allowedCID = ['3036', '06'];\\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 } 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 }\\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 //<>,<>,<> \\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];\\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 //<>,<>,<> \\r\\n if (mac2) {\\r\\n AddValue(codeValues, 'beacon_mac', mac2);\\r\\n var simpleQuery2 = [{\\r\\n 'code': 'Mac',\\r\\n 'value': mac2,\\r\\n }];\\r\\n var simpleQueryLabel2 = {\\r\\n 'table': 'beacons',\\r\\n 'select': 'Name',\\r\\n 'query': simpleQuery2\\r\\n };\\r\\n var labels2 = [];\\r\\n labels2.push(JSON.stringify(simpleQueryLabel2));\\r\\n AddValue(codeValues, 'oysta_labels', JSON.stringify(labels2));\\r\\n }\\r\\n if (params.beacon_major) {\\r\\n AddValue(codeValues, 'beacon_major', params.beacon_major);\\r\\n } else {\\r\\n AddValue(codeValues, 'beacon_major', 0);\\r\\n }\\r\\n if (params.beacon_minor) {\\r\\n AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\r\\n } else {\\r\\n AddValue(codeValues, 'beacon_minor', 0);\\r\\n }\\r\\n //AddValue(codeValues,'oysta_labels', label);\\r\\n //AddValue(codeValues,'oysta_value', mac);\\r\\n }\\r\\n /* meter mas tarde... \\r\\n if (params.smart_data !== 'undefined') {\\r\\n var gen_location = params.smart_data.split(',')\\r\\n var latitude = gen_location[0]\\r\\n var longitude = gen_location[1]\\r\\n var location_accuracy = gen_location[2]\\r\\n var altitude = gen_location[3]\\r\\n AddValue(codeValues,'latitude', latitude);\\r\\n AddValue(codeValues,'longitude', longitude);\\r\\n AddValue(codeValues,'altitude', altitude);\\r\\n AddValue(codeValues,'location_accuracy', location_accuracy);\\r\\n }\\r\\n */\\r\\n /*else if ((params.event_time) && (params.event_time == '')) {\\r\\n var event_time = moment.utc().unix();\\r\\n AddValue(codeValues,'event_time', event_time);\\r\\n } revisar mas adelante*/\\r\\n if (params.location_time) {\\r\\n AddValue(codeValues, 'location_time', params.location_time);\\r\\n }\\r\\n if (params.event_time) {\\r\\n AddValue(codeValues, 'event_time', params.event_time);\\r\\n }\\r\\n // to parse SMS info from the device\\r\\n switch (messageTypeLocalCode) {\\r\\n case 'COMM-SMS': // SMS message sent in\\r\\n if (params.data.startsWith('Device location request')) {\\r\\n configsToAck.push(configIds.Controls.RealTimeLocate);\\r\\n } else if (params.data.startsWith('Set IP ok')) {\\r\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n } else if (params.data.startsWith('IMEI:')) {\\r\\n configsToAck.push(configIds.Controls.GetFirmwareVersion);\\r\\n } else if (params.data.startsWith('Set IP ok')) {\\r\\n configsToAck.push(configIds.Controls.ClearBufferedMessages);\\r\\n } else if (params.data.startsWith('flush ok')) {\\r\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n } else if (params.data.startsWith('Set Watch-')) {\\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 = (`Watch-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 = (`Watch;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 = (`Watch;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 = (`Watch-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 // decode global msg\\r\\n function decoder(str) { // decode rawdata\\r\\n // CARE Decoder\\r\\n //AddValue(codeValues, 'Message : ', str);\\r\\n var message = str;\\r\\n var index = 18;\\r\\n //parse header & properties\\r\\n var properties = message.substring(2, 4);\\r\\n var lengthLittleEndian = message.substring(4, 8);\\r\\n var total_length = lengthLittleEndian.substring(2, 4) + lengthLittleEndian.substring(0, 2);\\r\\n total_length = 2 * hexToDecimal(total_length.substring(0, 4));\\r\\n var sequenceID = message.substring(12, 16);\\r\\n var command = message.substring(16, 18);\\r\\n //mask bitwise (properties should be '10')\\r\\n if ((parseInt(properties) & 8) == 8) {\\r\\n needsAck = true;\\r\\n } else needsAck = false;\\r\\n // need to check if checksum is correct for possible msg corruption 10/03/23\\r\\n var checksum = message.substring(8, 12);\\r\\n var messageBody = message.substring(16, message.length);\\r\\n debug('message =' + message);\\r\\n debug('checksum =' + checksum);\\r\\n debug('calculateCheckSum =' + calculateCheckSum(messageBody));\\r\\n if (calculateCheckSum(messageBody) == checksum) { // payload is valid\\r\\n debug(\\\"message has valid checksum\\\");\\r\\n var messageBody = command; // update value for the ACK\\r\\n debug('command =' + command);\\r\\n if (command == '01') {\\r\\n while (index < total_length + 16) {\\r\\n 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\\r\\n if ((alarmCodeExtInt & 1) == 1) {\\r\\n var alarm = 'ALF-C';\\r\\n }\\r\\n // Welfare Check-out\\r\\n else if ((alarmCodeExtInt & 2) == 2) {\\r\\n var alarm = 'ALA-C';\\r\\n }\\r\\n // Standard Alerts\\r\\n //Battery low\\r\\n else if ((alarmCodeInt & 1) == 1) {\\r\\n var alarm = 'BATL';\\r\\n }\\r\\n //Overspeed\\r\\n else if ((alarmCodeInt & 2) == 2) {\\r\\n var alarm = 'ALSP';\\r\\n }\\r\\n //Fall\\r\\n else if ((alarmCodeInt & 4) == 4) {\\r\\n var alarm = 'ALF';\\r\\n }\\r\\n //Tilt\\r\\n else if ((alarmCodeInt & 8) == 8) {\\r\\n var alarm = 'TLT';\\r\\n } else if ((alarmCodeInt & 16) == 16) {\\r\\n if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n var alarm = 'Geo1-IN';\\r\\n } else {\\r\\n var alarm = 'Geo1-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 32) == 32) {\\r\\n if ((alarmCodeInt & 33554432) == 33554432) {\\r\\n var alarm = 'Geo2-IN';\\r\\n } else {\\r\\n var alarm = 'Geo2-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 64) == 64) {\\r\\n if ((alarmCodeInt & 67108864) == 67108864) {\\r\\n var alarm = 'Geo3-IN';\\r\\n } else {\\r\\n var alarm = 'Geo3-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 128) == 128) {\\r\\n if ((alarmCodeInt & 134217728) == 134217728) {\\r\\n var alarm = 'Geo4-IN';\\r\\n } else {\\r\\n var alarm = 'Geo4-OUT';\\r\\n }\\r\\n }\\r\\n //Power Off\\r\\n else if ((alarmCodeInt & 256) == 256) {\\r\\n var alarm = 'PWRF';\\r\\n }\\r\\n //Power On\\r\\n else if ((alarmCodeInt & 512) == 512) {\\r\\n var alarm = 'PWRN';\\r\\n }\\r\\n //Motion\\r\\n else if ((alarmCodeInt & 1024) == 1024) {\\r\\n var alarm = 'ALMOV';\\r\\n }\\r\\n //No Motion\\r\\n else if ((alarmCodeInt & 2048) == 2048) {\\r\\n var alarm = 'ALNM';\\r\\n }\\r\\n //SOS\\r\\n else if ((alarmCodeInt & 4096) == 4096) {\\r\\n var alarm = 'ALSOS';\\r\\n } else if ((alarmCodeInt & 8192) == 8192) {\\r\\n var alarm = 'Side1';\\r\\n } else if ((alarmCodeInt & 16384) == 16384) {\\r\\n var alarm = 'Side2';\\r\\n }\\r\\n //Battery charging\\r\\n else if ((alarmCodeInt & 32768) == 32768) {\\r\\n var alarm = 'BATCN';\\r\\n }\\r\\n //Battery no charging\\r\\n else if ((alarmCodeInt & 65536) == 65536) {\\r\\n var alarm = 'BATCF';\\r\\n }\\r\\n //SOS Ending\\r\\n // Temporary Commented until we know exactly how it works. 22/09/2022\\r\\n else if ((alarmCodeInt & 131072) == 131072) {\\r\\n var alarm = 'ALA-F';\\r\\n info = 'Alarm Finished';\\r\\n }\\r\\n //Amber Alert EC03 only\\r\\n else if ((alarmCodeInt & 262144) == 262144) {\\r\\n var alarm = 'ALA';\\r\\n }\\r\\n // welfare Alert check-in ALA-O\\r\\n else if ((alarmCodeInt & 524288) == 524288) {\\r\\n var alarm = 'ALA-O';\\r\\n }\\r\\n // Amber alert Ending ALA-C\\r\\n else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n var alarm = 'ALA-C';\\r\\n }\\r\\n // Amber alert Ending ALA-C\\r\\n //else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n // var alarm = 'ALA-C';\\r\\n //}\\r\\n // Fall-Down Alert ending\\r\\n else if ((alarmCodeInt & 2097152) == 2097152) {\\r\\n var alarm = 'ALF-C';\\r\\n }\\r\\n // welfare Alert Ending ALA\\r\\n else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n var alarm = 'ALA';\\r\\n }\\r\\n // Beacon absent Alert 11/10/22. Need to be added in msg types\\r\\n //else if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n // var alarm = 'BEA';\\r\\n //}\\r\\n general += 'alarm:' + alarm + ',';\\r\\n break;\\r\\n //Custom ID\\r\\n case '03':\\r\\n customID = value;\\r\\n if (!allowedCID.includes(value)) {\\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 //<>,<>,<>,<>,<>\\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 if (!allowedCID.includes(customID)) {\\r\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n AddValue(codeValues, \\\"customID\\\", customID);\\r\\n return\\r\\n }\\r\\n if (statusDevice) {\\r\\n messageForReceiver = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n }\\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;\\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 }\\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 = 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 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 var rawlabel = 'steps';\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=${rawlabel}`);\\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 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 = (`Watch-${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 // SPO2\\r\\n case '41':\\r\\n var numSPO = (keyLength - 2) / 12;\\r\\n for (let j = 0; j < numSPO; 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 SPOHex = value.substring(8, 10);\\r\\n var SPO = hexToDecimal(SPOHex);\\r\\n var trustLevelHex = value.substring(10, 12);\\r\\n var trustLevel = hexToDecimal(trustLevelHex);\\r\\n info = SPO;\\r\\n //var alarmCode = 'True';\\r\\n var alarm = 'SPO2';\\r\\n general += ' SPO2 rate' + j + ':' + SPO + ',';\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};SPO2=${info};TLEVEL=${trustLevel};LABEL=%`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n }\\r\\n break;\\r\\n //BLE Connected . For Flic button\\r\\n case '62':\\r\\n location_type = 'BLE';\\r\\n //var alarm = 'EBZI'; \\r\\n //var latitudeHex = '00';\\r\\n //var longitudeHex = '00';\\r\\n //var descr = 'empty';\\r\\n var flag = hexToDecimal(value.substring(0, 2)); // 0= Disconnected, 1= Connected\\r\\n var mac = value.substring(2, 14); // No hace falta darle la vuelta\\r\\n // add : format in MAC\\r\\n mac = mac.match(/.{1,2}/g).join(':');\\r\\n var batLevel = hexToDecimal(value.substring(14, 16)); // 0-100\\r\\n //location_time = timestamp;\\r\\n ble_data = `${flag},${batLevel},${mac}`;\\r\\n general += 'BLE location (State):' + flag + ', (bat):' + batLevel + ', (mac):' + mac + ',';\\r\\n break;\\r\\n }\\r\\n }\\r\\n if (alarmCode) {\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch;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 = (`Watch;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': // Ringer Volume\\r\\n var volume = hexToDecimal(value);\\r\\n imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;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 = (`Watch;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 '0F': // Enable control.... Used for STEP COUNTING SETTINGS\\r\\n // 'FF FF 21 80'\\r\\n var StepStatus = hex2bin(value.substring(4, 6));\\r\\n var enalbleDisable = '';\\r\\n if (StepStatus.substring(7, 8) == '1') {\\r\\n var step = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var step = 'Disable, '\\r\\n };\\r\\n //var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n //hrate += detectingInterval;\\r\\n AddValue(codeValues, \\\"step\\\", step);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadStepsSettings.EnableDisableReadStepsSettings, enalbleDisable);\\r\\n //AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadStepsSettings.EnableDisableReadStepsSettings);\\r\\n //configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\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 = (`Watch;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 '34': //ContactList with name\\r\\n var contactNumber = value.substring(1, 2);\\r\\n var telLength = hexToDecimal(value.substring(2, 4));\\r\\n var tel = '';\\r\\n switch (contactNumber) {\\r\\n // Emergency Number\\r\\n case '0':\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n break;\\r\\n // Speed Dial Number\\r\\n //case '1':\\r\\n // tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n // AddValue(codeValues, \\\"SpeedDialNumber\\\", tel);\\r\\n // AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.SpeedDialNumber, tel);\\r\\n // configsToAck.push(configIds.ReadSpeedDialSettings.SpeedDialNumber);\\r\\n // break;\\r\\n // Gateway Number\\r\\n case '9': //00447781482635,Esendex UK 0034627177148,Esendex Spain 00447507288240,Esendex UK Acceptance\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n if (tel.includes('447781482635') || tel.includes('00447781482635')) {\\r\\n tel = 'Esendex UK'\\r\\n } else if (tel.includes('34627177148') || tel.includes('0034627177148')) {\\r\\n tel = 'Esendex Spain'\\r\\n } else if (tel.includes('447507288240') || tel.includes('00447507288240')) {\\r\\n tel = 'Esendex UK Acceptance'\\r\\n } else {\\r\\n tel = 'Default'\\r\\n }\\r\\n AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n break;\\r\\n default:\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n if (tel.length < 6) {\\r\\n contacts += '';\\r\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n break;\\r\\n }\\r\\n //contacts += 'A' + (contactNumber - 1) + ': ' + tel + ', ';\\r\\n contacts += tel + ', ';\\r\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n break;\\r\\n }\\r\\n break;\\r\\n case '40': // APN\\r\\n //no ACK need\\r\\n AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'));\\r\\n configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\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 = (`Watch;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 = (`Watch;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 '46': //HeartRate\\r\\n // '10 0E 00 80'\\r\\n var HeartRateStatus = hex2bin(value.substring(6, 8));\\r\\n var enalbleDisable = '';\\r\\n if (HeartRateStatus.substring(0, 1) == '1') {\\r\\n var hrate = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var hrate = 'Disable, '\\r\\n };\\r\\n var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n hrate += detectingInterval;\\r\\n AddValue(codeValues, \\\"hrate\\\", hrate);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings);\\r\\n configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\r\\n break;\\r\\n case '47': // Custom Id\\r\\n imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;ACK-CUSTID;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"customeid\\\", value);\\r\\n AddValue(configsToUpdate, configIds.ReadState.CustomId, hex_to_ascii(value)); //now it comes \\\"3036\\\"\\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 // commented until Eview fixes this function\\r\\n /*\\r\\n messageForReceiver = (`Watch;ACK-NOMOTION;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"nomotion\\\", alertSetting);\\r\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings, enableDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n configsToAck.push(configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings);\\r\\n configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n */\\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 = (`Watch;ACK-FALLALERT;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n var sesibityOptionValue = hexToDecimal(value.substring(1, 2));\\r\\n sensibility += sesibityOptionValue;\\r\\n AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n //AddValue(configsToUpdate, configIds.ReadAlertSettings.FallSettings, sensibility);\\r\\n AddValue(configsToUpdate, configIds.ReadFallSettings.EnableDisableFallSettings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadFallSettings.Sensitivity, sesibityOptionValue);\\r\\n //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n configsToAck.push(configIds.ReadFallSettings.EnableDisableFallSettings);\\r\\n configsToAck.push(configIds.ReadFallSettings.Sensitivity);\\r\\n break;\\r\\n case '73': //BeaconList\\r\\n var beaconNumber = hexToDecimal(value.substring(1, 2));\\r\\n var beaconStatus = hex2bin(value.substring(0, 1));\\r\\n beaconStatus = hex_to_ascii(value.substring(30, value.length));\\r\\n //beaconStatus = changeEndianness(value.substring(30, value.length));\\r\\n //homeBeacon += 'B' + (beaconNumber + 1) + ': ' + beaconStatus + ', ';\\r\\n homeBeacon += beaconStatus + ', ';\\r\\n AddValue(codeValues, \\\"homeBeacon\\\", homeBeacon);\\r\\n messageForReceiver = (`Watch;ACK-GDATA;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n break;\\r\\n case '4A': //Wifi Network List\\r\\n var wifiSSIDLenght = hexToDecimal(value.substring(2, 4));\\r\\n var wifiPasswordLenght = hexToDecimal(value.substring(4, 6));\\r\\n var wifiIndex = hexToDecimal(value.substring(1, 2));\\r\\n //var wifiStatus = hexToDecimal(value.substring(0, 1));\\r\\n var wifiStatus = value.substring(0, 1);\\r\\n /*var enalbleDisable = wifiSSID = wifiPassword = homeWifi = '';\\r\\n /var homeWifi = '';\\r\\n if (wifiIndex == '0') { // Only first Wifi of the list\\r\\n if (wifiStatus == '8') {\\r\\n homeWifi += ' Enable, '\\r\\n enalbleDisable = '1';\\r\\n } else {\\r\\n homeWifi += ' Disable, '\\r\\n //enalbleDisable = '0';\\r\\n };*/\\r\\n if ((wifiStatus == '8') || (wifiStatus == 'C')) { // 8 == ON OR C== ON and Connected\\r\\n var wifiSSID = hex_to_ascii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\r\\n var wifiPassword = hex_to_ascii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\r\\n var imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;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 = (`Watch;ACK-SPEED;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"speed\\\", alertSetting);\\r\\n AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\r\\n configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n break;\\r\\n case '7A': //[Length]:05 [Key]:7A [Value]:60 54 00 80\\r\\n // {\\\"spo2Interval\\\":{\\\"interval\\\":21600,\\\"status\\\":1}}\\r\\n var SPOStatus = hex2bin(value.substring(6, 8));\\r\\n var enalbleDisable = '';\\r\\n if (SPOStatus.substring(0, 1) == '1') {\\r\\n var spo = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var spo = 'Disable, '\\r\\n };\\r\\n var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n spo += detectingInterval;\\r\\n AddValue(codeValues, \\\"SPO2\\\", spo);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadSPO2Settings.EnableDisableReadSPO2Settings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadSPO2Settings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadSPO2Settings.EnableDisableReadSPO2Settings);\\r\\n configsToAck.push(configIds.ReadSPO2Settings.ReportingFrequency);\\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 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 = (`Watch-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 = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch-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 if (typeof configIds !== 'undefined' && configIds && configIds.ConfigureDevice && configIds.ConfigureDevice.LastConfigured) { // when is defined\\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 }\\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(hex) { // Hex to Ascii \\r\\n if (hex.length % 2 !== 0) {\\r\\n throw new Error(\\\"Hex string length must be even\\\");\\r\\n }\\r\\n let ascii = '';\\r\\n for (let i = 0; i < hex.length; i += 2) {\\r\\n const byte = hex.substr(i, 2);\\r\\n const charCode = parseInt(byte, 16);\\r\\n if (charCode !== 0) { // remove null character (\\\\u0000)\\r\\n ascii += String.fromCharCode(charCode);\\r\\n }\\r\\n }\\r\\n return ascii;\\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":1765479698},{"Type":1,"NewValue":"{\"Id\":437,\"Name\":\"Access TEC Care Watch\",\"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 // Watch protocol - please see variables and typical values in order below\\r\\n // Watch-CYC;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;SIGNAL=<>;WM=<>;GENERAL=<>\\r\\n // Watch-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\r\\n //\\r\\n // Author: Juanmi Navarro\\r\\n // Created: 01/01/0000\\r\\n // Last modified: 18/09/2025\\r\\n //\\r\\n ///////////////////////////////////////////////////////////////////////////////\\r\\n if (typeof localTesting === \\\"undefined\\\") {\\r\\n let localTesting = false;\\r\\n }\\r\\n const crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,\\r\\n 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,\\r\\n 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,\\r\\n 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,\\r\\n 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,\\r\\n 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,\\r\\n 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,\\r\\n 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,\\r\\n 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,\\r\\n 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,\\r\\n 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,\\r\\n 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,\\r\\n 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,\\r\\n 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,\\r\\n 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,\\r\\n 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,\\r\\n 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,\\r\\n 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,\\r\\n 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,\\r\\n 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,\\r\\n 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,\\r\\n 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n ];\\r\\n var codeValues = [];\\r\\n AddValue(codeValues, 'protocol_template', 'Watch');\\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 = (`Watch-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 var allowedCID = ['3036', '06'];\\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 } 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 }\\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 //<>,<>,<> \\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];\\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 //<>,<>,<> \\r\\n if (mac2) {\\r\\n AddValue(codeValues, 'beacon_mac', mac2);\\r\\n var simpleQuery2 = [{\\r\\n 'code': 'Mac',\\r\\n 'value': mac2,\\r\\n }];\\r\\n var simpleQueryLabel2 = {\\r\\n 'table': 'beacons',\\r\\n 'select': 'Name',\\r\\n 'query': simpleQuery2\\r\\n };\\r\\n var labels2 = [];\\r\\n labels2.push(JSON.stringify(simpleQueryLabel2));\\r\\n AddValue(codeValues, 'oysta_labels', JSON.stringify(labels2));\\r\\n }\\r\\n if (params.beacon_major) {\\r\\n AddValue(codeValues, 'beacon_major', params.beacon_major);\\r\\n } else {\\r\\n AddValue(codeValues, 'beacon_major', 0);\\r\\n }\\r\\n if (params.beacon_minor) {\\r\\n AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\r\\n } else {\\r\\n AddValue(codeValues, 'beacon_minor', 0);\\r\\n }\\r\\n //AddValue(codeValues,'oysta_labels', label);\\r\\n //AddValue(codeValues,'oysta_value', mac);\\r\\n }\\r\\n /* meter mas tarde... \\r\\n if (params.smart_data !== 'undefined') {\\r\\n var gen_location = params.smart_data.split(',')\\r\\n var latitude = gen_location[0]\\r\\n var longitude = gen_location[1]\\r\\n var location_accuracy = gen_location[2]\\r\\n var altitude = gen_location[3]\\r\\n AddValue(codeValues,'latitude', latitude);\\r\\n AddValue(codeValues,'longitude', longitude);\\r\\n AddValue(codeValues,'altitude', altitude);\\r\\n AddValue(codeValues,'location_accuracy', location_accuracy);\\r\\n }\\r\\n */\\r\\n /*else if ((params.event_time) && (params.event_time == '')) {\\r\\n var event_time = moment.utc().unix();\\r\\n AddValue(codeValues,'event_time', event_time);\\r\\n } revisar mas adelante*/\\r\\n if (params.location_time) {\\r\\n AddValue(codeValues, 'location_time', params.location_time);\\r\\n }\\r\\n if (params.event_time) {\\r\\n AddValue(codeValues, 'event_time', params.event_time);\\r\\n }\\r\\n // to parse SMS info from the device\\r\\n switch (messageTypeLocalCode) {\\r\\n case 'COMM-SMS': // SMS message sent in\\r\\n if (params.data.startsWith('Device location request')) {\\r\\n configsToAck.push(configIds.Controls.RealTimeLocate);\\r\\n } else if (params.data.startsWith('Set IP ok')) {\\r\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n } else if (params.data.startsWith('IMEI:')) {\\r\\n configsToAck.push(configIds.Controls.GetFirmwareVersion);\\r\\n } else if (params.data.startsWith('Set IP ok')) {\\r\\n configsToAck.push(configIds.Controls.ClearBufferedMessages);\\r\\n } else if (params.data.startsWith('flush ok')) {\\r\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n } else if (params.data.startsWith('Set Watch-')) {\\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 = (`Watch-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 = (`Watch;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 = (`Watch;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 = (`Watch-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 // decode global msg\\r\\n function decoder(str) { // decode rawdata\\r\\n // CARE Decoder\\r\\n //AddValue(codeValues, 'Message : ', str);\\r\\n var message = str;\\r\\n var index = 18;\\r\\n //parse header & properties\\r\\n var properties = message.substring(2, 4);\\r\\n var lengthLittleEndian = message.substring(4, 8);\\r\\n var total_length = lengthLittleEndian.substring(2, 4) + lengthLittleEndian.substring(0, 2);\\r\\n total_length = 2 * hexToDecimal(total_length.substring(0, 4));\\r\\n var sequenceID = message.substring(12, 16);\\r\\n var command = message.substring(16, 18);\\r\\n //mask bitwise (properties should be '10')\\r\\n if ((parseInt(properties) & 8) == 8) {\\r\\n needsAck = true;\\r\\n } else needsAck = false;\\r\\n // need to check if checksum is correct for possible msg corruption 10/03/23\\r\\n var checksum = message.substring(8, 12);\\r\\n var messageBody = message.substring(16, message.length);\\r\\n debug('message =' + message);\\r\\n debug('checksum =' + checksum);\\r\\n debug('calculateCheckSum =' + calculateCheckSum(messageBody));\\r\\n if (calculateCheckSum(messageBody) == checksum) { // payload is valid\\r\\n debug(\\\"message has valid checksum\\\");\\r\\n var messageBody = command; // update value for the ACK\\r\\n debug('command =' + command);\\r\\n if (command == '01') {\\r\\n while (index < total_length + 16) {\\r\\n 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\\r\\n if ((alarmCodeExtInt & 1) == 1) {\\r\\n var alarm = 'ALF-C';\\r\\n }\\r\\n // Welfare Check-out\\r\\n else if ((alarmCodeExtInt & 2) == 2) {\\r\\n var alarm = 'ALA-C';\\r\\n }\\r\\n // Standard Alerts\\r\\n //Battery low\\r\\n else if ((alarmCodeInt & 1) == 1) {\\r\\n var alarm = 'BATL';\\r\\n }\\r\\n //Overspeed\\r\\n else if ((alarmCodeInt & 2) == 2) {\\r\\n var alarm = 'ALSP';\\r\\n }\\r\\n //Fall\\r\\n else if ((alarmCodeInt & 4) == 4) {\\r\\n var alarm = 'ALF';\\r\\n }\\r\\n //Tilt\\r\\n else if ((alarmCodeInt & 8) == 8) {\\r\\n var alarm = 'TLT';\\r\\n } else if ((alarmCodeInt & 16) == 16) {\\r\\n if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n var alarm = 'Geo1-IN';\\r\\n } else {\\r\\n var alarm = 'Geo1-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 32) == 32) {\\r\\n if ((alarmCodeInt & 33554432) == 33554432) {\\r\\n var alarm = 'Geo2-IN';\\r\\n } else {\\r\\n var alarm = 'Geo2-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 64) == 64) {\\r\\n if ((alarmCodeInt & 67108864) == 67108864) {\\r\\n var alarm = 'Geo3-IN';\\r\\n } else {\\r\\n var alarm = 'Geo3-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 128) == 128) {\\r\\n if ((alarmCodeInt & 134217728) == 134217728) {\\r\\n var alarm = 'Geo4-IN';\\r\\n } else {\\r\\n var alarm = 'Geo4-OUT';\\r\\n }\\r\\n }\\r\\n //Power Off\\r\\n else if ((alarmCodeInt & 256) == 256) {\\r\\n var alarm = 'PWRF';\\r\\n }\\r\\n //Power On\\r\\n else if ((alarmCodeInt & 512) == 512) {\\r\\n var alarm = 'PWRN';\\r\\n }\\r\\n //Motion\\r\\n else if ((alarmCodeInt & 1024) == 1024) {\\r\\n var alarm = 'ALMOV';\\r\\n }\\r\\n //No Motion\\r\\n else if ((alarmCodeInt & 2048) == 2048) {\\r\\n var alarm = 'ALNM';\\r\\n }\\r\\n //SOS\\r\\n else if ((alarmCodeInt & 4096) == 4096) {\\r\\n var alarm = 'ALSOS';\\r\\n } else if ((alarmCodeInt & 8192) == 8192) {\\r\\n var alarm = 'Side1';\\r\\n } else if ((alarmCodeInt & 16384) == 16384) {\\r\\n var alarm = 'Side2';\\r\\n }\\r\\n //Battery charging\\r\\n else if ((alarmCodeInt & 32768) == 32768) {\\r\\n var alarm = 'BATCN';\\r\\n }\\r\\n //Battery no charging\\r\\n else if ((alarmCodeInt & 65536) == 65536) {\\r\\n var alarm = 'BATCF';\\r\\n }\\r\\n //SOS Ending\\r\\n // Temporary Commented until we know exactly how it works. 22/09/2022\\r\\n else if ((alarmCodeInt & 131072) == 131072) {\\r\\n var alarm = 'ALA-F';\\r\\n info = 'Alarm Finished';\\r\\n }\\r\\n //Amber Alert EC03 only\\r\\n else if ((alarmCodeInt & 262144) == 262144) {\\r\\n var alarm = 'ALA';\\r\\n }\\r\\n // welfare Alert check-in ALA-O\\r\\n else if ((alarmCodeInt & 524288) == 524288) {\\r\\n var alarm = 'ALA-O';\\r\\n }\\r\\n // Amber alert Ending ALA-C\\r\\n else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n var alarm = 'ALA-C';\\r\\n }\\r\\n // Amber alert Ending ALA-C\\r\\n //else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n // var alarm = 'ALA-C';\\r\\n //}\\r\\n // Fall-Down Alert ending\\r\\n else if ((alarmCodeInt & 2097152) == 2097152) {\\r\\n var alarm = 'ALF-C';\\r\\n }\\r\\n // welfare Alert Ending ALA\\r\\n else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n var alarm = 'ALA';\\r\\n }\\r\\n // Beacon absent Alert 11/10/22. Need to be added in msg types\\r\\n //else if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n // var alarm = 'BEA';\\r\\n //}\\r\\n general += 'alarm:' + alarm + ',';\\r\\n break;\\r\\n //Custom ID\\r\\n case '03':\\r\\n customID = value;\\r\\n if (!allowedCID.includes(value)) {\\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 //<>,<>,<>,<>,<>\\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 if (!allowedCID.includes(customID)) {\\r\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n AddValue(codeValues, \\\"customID\\\", customID);\\r\\n return\\r\\n }\\r\\n if (statusDevice) {\\r\\n messageForReceiver = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n }\\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;\\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 }\\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 = 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 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 var rawlabel = 'steps';\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=${rawlabel}`);\\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 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 var rawlabel = 'bpm';\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=${rawlabel}`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n }\\r\\n break;\\r\\n // SPO2\\r\\n case '41':\\r\\n var numSPO = (keyLength - 2) / 12;\\r\\n for (let j = 0; j < numSPO; 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 SPOHex = value.substring(8, 10);\\r\\n var SPO = hexToDecimal(SPOHex);\\r\\n var trustLevelHex = value.substring(10, 12);\\r\\n var trustLevel = hexToDecimal(trustLevelHex);\\r\\n info = SPO;\\r\\n //var alarmCode = 'True';\\r\\n var alarm = 'SPO2';\\r\\n general += ' SPO2 rate' + j + ':' + SPO + ',';\\r\\n var rawlabel = '%';\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};SPO2=${info};TLEVEL=${trustLevel};LABEL=${rawlabel}`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n }\\r\\n break;\\r\\n //BLE Connected . For Flic button\\r\\n case '62':\\r\\n location_type = 'BLE';\\r\\n //var alarm = 'EBZI'; \\r\\n //var latitudeHex = '00';\\r\\n //var longitudeHex = '00';\\r\\n //var descr = 'empty';\\r\\n var flag = hexToDecimal(value.substring(0, 2)); // 0= Disconnected, 1= Connected\\r\\n var mac = value.substring(2, 14); // No hace falta darle la vuelta\\r\\n // add : format in MAC\\r\\n mac = mac.match(/.{1,2}/g).join(':');\\r\\n var batLevel = hexToDecimal(value.substring(14, 16)); // 0-100\\r\\n //location_time = timestamp;\\r\\n ble_data = `${flag},${batLevel},${mac}`;\\r\\n general += 'BLE location (State):' + flag + ', (bat):' + batLevel + ', (mac):' + mac + ',';\\r\\n break;\\r\\n }\\r\\n }\\r\\n if (alarmCode) {\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch;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 = (`Watch;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': // Ringer Volume\\r\\n var volume = hexToDecimal(value);\\r\\n imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;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 = (`Watch;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 '0F': // Enable control.... Used for STEP COUNTING SETTINGS\\r\\n // 'FF FF 21 80'\\r\\n var StepStatus = hex2bin(value.substring(4, 6));\\r\\n var enalbleDisable = '';\\r\\n if (StepStatus.substring(7, 8) == '1') {\\r\\n var step = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var step = 'Disable, '\\r\\n };\\r\\n //var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n //hrate += detectingInterval;\\r\\n AddValue(codeValues, \\\"step\\\", step);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadStepsSettings.EnableDisableReadStepsSettings, enalbleDisable);\\r\\n //AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadStepsSettings.EnableDisableReadStepsSettings);\\r\\n //configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\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 = (`Watch;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 '34': //ContactList with name\\r\\n var contactNumber = value.substring(1, 2);\\r\\n var telLength = hexToDecimal(value.substring(2, 4));\\r\\n var tel = '';\\r\\n switch (contactNumber) {\\r\\n // Emergency Number\\r\\n case '0':\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n break;\\r\\n // Speed Dial Number\\r\\n //case '1':\\r\\n // tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n // AddValue(codeValues, \\\"SpeedDialNumber\\\", tel);\\r\\n // AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.SpeedDialNumber, tel);\\r\\n // configsToAck.push(configIds.ReadSpeedDialSettings.SpeedDialNumber);\\r\\n // break;\\r\\n // Gateway Number\\r\\n case '9': //00447781482635,Esendex UK 0034627177148,Esendex Spain 00447507288240,Esendex UK Acceptance\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n if (tel.includes('447781482635') || tel.includes('00447781482635')) {\\r\\n tel = 'Esendex UK'\\r\\n } else if (tel.includes('34627177148') || tel.includes('0034627177148')) {\\r\\n tel = 'Esendex Spain'\\r\\n } else if (tel.includes('447507288240') || tel.includes('00447507288240')) {\\r\\n tel = 'Esendex UK Acceptance'\\r\\n } else {\\r\\n tel = 'Default'\\r\\n }\\r\\n AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n break;\\r\\n default:\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n if (tel.length < 6) {\\r\\n contacts += '';\\r\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n break;\\r\\n }\\r\\n //contacts += 'A' + (contactNumber - 1) + ': ' + tel + ', ';\\r\\n contacts += tel + ', ';\\r\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n break;\\r\\n }\\r\\n break;\\r\\n case '40': // APN\\r\\n //no ACK need\\r\\n AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'));\\r\\n configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\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 = (`Watch;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 = (`Watch;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 '46': //HeartRate\\r\\n // '10 0E 00 80'\\r\\n var HeartRateStatus = hex2bin(value.substring(6, 8));\\r\\n var enalbleDisable = '';\\r\\n if (HeartRateStatus.substring(0, 1) == '1') {\\r\\n var hrate = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var hrate = 'Disable, '\\r\\n };\\r\\n var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n hrate += detectingInterval;\\r\\n AddValue(codeValues, \\\"hrate\\\", hrate);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings);\\r\\n configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\r\\n break;\\r\\n case '47': // Custom Id\\r\\n imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;ACK-CUSTID;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"customeid\\\", value);\\r\\n AddValue(configsToUpdate, configIds.ReadState.CustomId, hex_to_ascii(value)); //now it comes \\\"3036\\\"\\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 // commented until Eview fixes this function\\r\\n /*\\r\\n messageForReceiver = (`Watch;ACK-NOMOTION;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"nomotion\\\", alertSetting);\\r\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings, enableDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n configsToAck.push(configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings);\\r\\n configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n */\\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 = (`Watch;ACK-FALLALERT;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n var sesibityOptionValue = hexToDecimal(value.substring(1, 2));\\r\\n sensibility += sesibityOptionValue;\\r\\n AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n //AddValue(configsToUpdate, configIds.ReadAlertSettings.FallSettings, sensibility);\\r\\n AddValue(configsToUpdate, configIds.ReadFallSettings.EnableDisableFallSettings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadFallSettings.Sensitivity, sesibityOptionValue);\\r\\n //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n configsToAck.push(configIds.ReadFallSettings.EnableDisableFallSettings);\\r\\n configsToAck.push(configIds.ReadFallSettings.Sensitivity);\\r\\n break;\\r\\n case '73': //BeaconList\\r\\n var beaconNumber = hexToDecimal(value.substring(1, 2));\\r\\n var beaconStatus = hex2bin(value.substring(0, 1));\\r\\n beaconStatus = hex_to_ascii(value.substring(30, value.length));\\r\\n //beaconStatus = changeEndianness(value.substring(30, value.length));\\r\\n //homeBeacon += 'B' + (beaconNumber + 1) + ': ' + beaconStatus + ', ';\\r\\n homeBeacon += beaconStatus + ', ';\\r\\n AddValue(codeValues, \\\"homeBeacon\\\", homeBeacon);\\r\\n messageForReceiver = (`Watch;ACK-GDATA;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n break;\\r\\n case '4A': //Wifi Network List\\r\\n var wifiSSIDLenght = hexToDecimal(value.substring(2, 4));\\r\\n var wifiPasswordLenght = hexToDecimal(value.substring(4, 6));\\r\\n var wifiIndex = hexToDecimal(value.substring(1, 2));\\r\\n //var wifiStatus = hexToDecimal(value.substring(0, 1));\\r\\n var wifiStatus = value.substring(0, 1);\\r\\n /*var enalbleDisable = wifiSSID = wifiPassword = homeWifi = '';\\r\\n /var homeWifi = '';\\r\\n if (wifiIndex == '0') { // Only first Wifi of the list\\r\\n if (wifiStatus == '8') {\\r\\n homeWifi += ' Enable, '\\r\\n enalbleDisable = '1';\\r\\n } else {\\r\\n homeWifi += ' Disable, '\\r\\n //enalbleDisable = '0';\\r\\n };*/\\r\\n if ((wifiStatus == '8') || (wifiStatus == 'C')) { // 8 == ON OR C== ON and Connected\\r\\n var wifiSSID = hex_to_ascii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\r\\n var wifiPassword = hex_to_ascii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\r\\n var imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;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 = (`Watch;ACK-SPEED;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"speed\\\", alertSetting);\\r\\n AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\r\\n configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n break;\\r\\n case '7A': //[Length]:05 [Key]:7A [Value]:60 54 00 80\\r\\n // {\\\"spo2Interval\\\":{\\\"interval\\\":21600,\\\"status\\\":1}}\\r\\n var SPOStatus = hex2bin(value.substring(6, 8));\\r\\n var enalbleDisable = '';\\r\\n if (SPOStatus.substring(0, 1) == '1') {\\r\\n var spo = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var spo = 'Disable, '\\r\\n };\\r\\n var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n spo += detectingInterval;\\r\\n AddValue(codeValues, \\\"SPO2\\\", spo);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadSPO2Settings.EnableDisableReadSPO2Settings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadSPO2Settings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadSPO2Settings.EnableDisableReadSPO2Settings);\\r\\n configsToAck.push(configIds.ReadSPO2Settings.ReportingFrequency);\\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 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 = (`Watch-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 = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch-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 if (typeof configIds !== 'undefined' && configIds && configIds.ConfigureDevice && configIds.ConfigureDevice.LastConfigured) { // when is defined\\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 }\\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(hex) { // Hex to Ascii \\r\\n if (hex.length % 2 !== 0) {\\r\\n throw new Error(\\\"Hex string length must be even\\\");\\r\\n }\\r\\n let ascii = '';\\r\\n for (let i = 0; i < hex.length; i += 2) {\\r\\n const byte = hex.substr(i, 2);\\r\\n const charCode = parseInt(byte, 16);\\r\\n if (charCode !== 0) { // remove null character (\\\\u0000)\\r\\n ascii += String.fromCharCode(charCode);\\r\\n }\\r\\n }\\r\\n return ascii;\\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":1765479872},{"Type":1,"NewValue":"{\"Id\":437,\"Name\":\"Access TEC Care Watch\",\"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 // Watch protocol - please see variables and typical values in order below\\r\\n // Watch-CYC;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;SIGNAL=<>;WM=<>;GENERAL=<>\\r\\n // Watch-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\r\\n //\\r\\n // Author: Juanmi Navarro\\r\\n // Created: 01/01/0000\\r\\n // Last modified: 18/09/2025\\r\\n //\\r\\n ///////////////////////////////////////////////////////////////////////////////\\r\\n if (typeof localTesting === \\\"undefined\\\") {\\r\\n let localTesting = false;\\r\\n }\\r\\n const crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,\\r\\n 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,\\r\\n 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,\\r\\n 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,\\r\\n 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,\\r\\n 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,\\r\\n 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,\\r\\n 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,\\r\\n 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,\\r\\n 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,\\r\\n 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,\\r\\n 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,\\r\\n 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,\\r\\n 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,\\r\\n 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,\\r\\n 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,\\r\\n 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,\\r\\n 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,\\r\\n 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,\\r\\n 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,\\r\\n 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,\\r\\n 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n ];\\r\\n var codeValues = [];\\r\\n AddValue(codeValues, 'protocol_template', 'Watch');\\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 = (`Watch-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 var allowedCID = ['3036', '06'];\\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 } 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 }\\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 //<>,<>,<> \\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];\\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 //<>,<>,<> \\r\\n if (mac2) {\\r\\n AddValue(codeValues, 'beacon_mac', mac2);\\r\\n var simpleQuery2 = [{\\r\\n 'code': 'Mac',\\r\\n 'value': mac2,\\r\\n }];\\r\\n var simpleQueryLabel2 = {\\r\\n 'table': 'beacons',\\r\\n 'select': 'Name',\\r\\n 'query': simpleQuery2\\r\\n };\\r\\n var labels2 = [];\\r\\n labels2.push(JSON.stringify(simpleQueryLabel2));\\r\\n AddValue(codeValues, 'oysta_labels', JSON.stringify(labels2));\\r\\n }\\r\\n if (params.beacon_major) {\\r\\n AddValue(codeValues, 'beacon_major', params.beacon_major);\\r\\n } else {\\r\\n AddValue(codeValues, 'beacon_major', 0);\\r\\n }\\r\\n if (params.beacon_minor) {\\r\\n AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\r\\n } else {\\r\\n AddValue(codeValues, 'beacon_minor', 0);\\r\\n }\\r\\n //AddValue(codeValues,'oysta_labels', label);\\r\\n //AddValue(codeValues,'oysta_value', mac);\\r\\n }\\r\\n /* meter mas tarde... \\r\\n if (params.smart_data !== 'undefined') {\\r\\n var gen_location = params.smart_data.split(',')\\r\\n var latitude = gen_location[0]\\r\\n var longitude = gen_location[1]\\r\\n var location_accuracy = gen_location[2]\\r\\n var altitude = gen_location[3]\\r\\n AddValue(codeValues,'latitude', latitude);\\r\\n AddValue(codeValues,'longitude', longitude);\\r\\n AddValue(codeValues,'altitude', altitude);\\r\\n AddValue(codeValues,'location_accuracy', location_accuracy);\\r\\n }\\r\\n */\\r\\n /*else if ((params.event_time) && (params.event_time == '')) {\\r\\n var event_time = moment.utc().unix();\\r\\n AddValue(codeValues,'event_time', event_time);\\r\\n } revisar mas adelante*/\\r\\n if (params.location_time) {\\r\\n AddValue(codeValues, 'location_time', params.location_time);\\r\\n }\\r\\n if (params.event_time) {\\r\\n AddValue(codeValues, 'event_time', params.event_time);\\r\\n }\\r\\n // to parse SMS info from the device\\r\\n switch (messageTypeLocalCode) {\\r\\n case 'COMM-SMS': // SMS message sent in\\r\\n if (params.data.startsWith('Device location request')) {\\r\\n configsToAck.push(configIds.Controls.RealTimeLocate);\\r\\n } else if (params.data.startsWith('Set IP ok')) {\\r\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n } else if (params.data.startsWith('IMEI:')) {\\r\\n configsToAck.push(configIds.Controls.GetFirmwareVersion);\\r\\n } else if (params.data.startsWith('Set IP ok')) {\\r\\n configsToAck.push(configIds.Controls.ClearBufferedMessages);\\r\\n } else if (params.data.startsWith('flush ok')) {\\r\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n } else if (params.data.startsWith('Set Watch-')) {\\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 = (`Watch-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 = (`Watch;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 = (`Watch;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 = (`Watch-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 // decode global msg\\r\\n function decoder(str) { // decode rawdata\\r\\n // CARE Decoder\\r\\n //AddValue(codeValues, 'Message : ', str);\\r\\n var message = str;\\r\\n var index = 18;\\r\\n //parse header & properties\\r\\n var properties = message.substring(2, 4);\\r\\n var lengthLittleEndian = message.substring(4, 8);\\r\\n var total_length = lengthLittleEndian.substring(2, 4) + lengthLittleEndian.substring(0, 2);\\r\\n total_length = 2 * hexToDecimal(total_length.substring(0, 4));\\r\\n var sequenceID = message.substring(12, 16);\\r\\n var command = message.substring(16, 18);\\r\\n //mask bitwise (properties should be '10')\\r\\n if ((parseInt(properties) & 8) == 8) {\\r\\n needsAck = true;\\r\\n } else needsAck = false;\\r\\n // need to check if checksum is correct for possible msg corruption 10/03/23\\r\\n var checksum = message.substring(8, 12);\\r\\n var messageBody = message.substring(16, message.length);\\r\\n debug('message =' + message);\\r\\n debug('checksum =' + checksum);\\r\\n debug('calculateCheckSum =' + calculateCheckSum(messageBody));\\r\\n if (calculateCheckSum(messageBody) == checksum) { // payload is valid\\r\\n debug(\\\"message has valid checksum\\\");\\r\\n var messageBody = command; // update value for the ACK\\r\\n debug('command =' + command);\\r\\n if (command == '01') {\\r\\n while (index < total_length + 16) {\\r\\n 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\\r\\n if ((alarmCodeExtInt & 1) == 1) {\\r\\n var alarm = 'ALF-C';\\r\\n }\\r\\n // Welfare Check-out\\r\\n else if ((alarmCodeExtInt & 2) == 2) {\\r\\n var alarm = 'ALA-C';\\r\\n }\\r\\n // Standard Alerts\\r\\n //Battery low\\r\\n else if ((alarmCodeInt & 1) == 1) {\\r\\n var alarm = 'BATL';\\r\\n }\\r\\n //Overspeed\\r\\n else if ((alarmCodeInt & 2) == 2) {\\r\\n var alarm = 'ALSP';\\r\\n }\\r\\n //Fall\\r\\n else if ((alarmCodeInt & 4) == 4) {\\r\\n var alarm = 'ALF';\\r\\n }\\r\\n //Tilt\\r\\n else if ((alarmCodeInt & 8) == 8) {\\r\\n var alarm = 'TLT';\\r\\n } else if ((alarmCodeInt & 16) == 16) {\\r\\n if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n var alarm = 'Geo1-IN';\\r\\n } else {\\r\\n var alarm = 'Geo1-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 32) == 32) {\\r\\n if ((alarmCodeInt & 33554432) == 33554432) {\\r\\n var alarm = 'Geo2-IN';\\r\\n } else {\\r\\n var alarm = 'Geo2-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 64) == 64) {\\r\\n if ((alarmCodeInt & 67108864) == 67108864) {\\r\\n var alarm = 'Geo3-IN';\\r\\n } else {\\r\\n var alarm = 'Geo3-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 128) == 128) {\\r\\n if ((alarmCodeInt & 134217728) == 134217728) {\\r\\n var alarm = 'Geo4-IN';\\r\\n } else {\\r\\n var alarm = 'Geo4-OUT';\\r\\n }\\r\\n }\\r\\n //Power Off\\r\\n else if ((alarmCodeInt & 256) == 256) {\\r\\n var alarm = 'PWRF';\\r\\n }\\r\\n //Power On\\r\\n else if ((alarmCodeInt & 512) == 512) {\\r\\n var alarm = 'PWRN';\\r\\n }\\r\\n //Motion\\r\\n else if ((alarmCodeInt & 1024) == 1024) {\\r\\n var alarm = 'ALMOV';\\r\\n }\\r\\n //No Motion\\r\\n else if ((alarmCodeInt & 2048) == 2048) {\\r\\n var alarm = 'ALNM';\\r\\n }\\r\\n //SOS\\r\\n else if ((alarmCodeInt & 4096) == 4096) {\\r\\n var alarm = 'ALSOS';\\r\\n } else if ((alarmCodeInt & 8192) == 8192) {\\r\\n var alarm = 'Side1';\\r\\n } else if ((alarmCodeInt & 16384) == 16384) {\\r\\n var alarm = 'Side2';\\r\\n }\\r\\n //Battery charging\\r\\n else if ((alarmCodeInt & 32768) == 32768) {\\r\\n var alarm = 'BATCN';\\r\\n }\\r\\n //Battery no charging\\r\\n else if ((alarmCodeInt & 65536) == 65536) {\\r\\n var alarm = 'BATCF';\\r\\n }\\r\\n //SOS Ending\\r\\n // Temporary Commented until we know exactly how it works. 22/09/2022\\r\\n else if ((alarmCodeInt & 131072) == 131072) {\\r\\n var alarm = 'ALA-F';\\r\\n info = 'Alarm Finished';\\r\\n }\\r\\n //Amber Alert EC03 only\\r\\n else if ((alarmCodeInt & 262144) == 262144) {\\r\\n var alarm = 'ALA';\\r\\n }\\r\\n // welfare Alert check-in ALA-O\\r\\n else if ((alarmCodeInt & 524288) == 524288) {\\r\\n var alarm = 'ALA-O';\\r\\n }\\r\\n // Amber alert Ending ALA-C\\r\\n else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n var alarm = 'ALA-C';\\r\\n }\\r\\n // Amber alert Ending ALA-C\\r\\n //else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n // var alarm = 'ALA-C';\\r\\n //}\\r\\n // Fall-Down Alert ending\\r\\n else if ((alarmCodeInt & 2097152) == 2097152) {\\r\\n var alarm = 'ALF-C';\\r\\n }\\r\\n // welfare Alert Ending ALA\\r\\n else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n var alarm = 'ALA';\\r\\n }\\r\\n // Beacon absent Alert 11/10/22. Need to be added in msg types\\r\\n //else if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n // var alarm = 'BEA';\\r\\n //}\\r\\n general += 'alarm:' + alarm + ',';\\r\\n break;\\r\\n //Custom ID\\r\\n case '03':\\r\\n customID = value;\\r\\n if (!allowedCID.includes(value)) {\\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 //<>,<>,<>,<>,<>\\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 if (!allowedCID.includes(customID)) {\\r\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n AddValue(codeValues, \\\"customID\\\", customID);\\r\\n return\\r\\n }\\r\\n if (statusDevice) {\\r\\n messageForReceiver = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n }\\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;\\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 }\\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 = 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 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 var rawlabel = ['steps'];\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=${rawlabel}`);\\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 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 var rawlabel = ['bpm'];\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=${rawlabel}`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n }\\r\\n break;\\r\\n // SPO2\\r\\n case '41':\\r\\n var numSPO = (keyLength - 2) / 12;\\r\\n for (let j = 0; j < numSPO; 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 SPOHex = value.substring(8, 10);\\r\\n var SPO = hexToDecimal(SPOHex);\\r\\n var trustLevelHex = value.substring(10, 12);\\r\\n var trustLevel = hexToDecimal(trustLevelHex);\\r\\n info = SPO;\\r\\n //var alarmCode = 'True';\\r\\n var alarm = 'SPO2';\\r\\n general += ' SPO2 rate' + j + ':' + SPO + ',';\\r\\n var rawlabel = ['%'];\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};SPO2=${info};TLEVEL=${trustLevel};LABEL=${rawlabel}`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n }\\r\\n break;\\r\\n //BLE Connected . For Flic button\\r\\n case '62':\\r\\n location_type = 'BLE';\\r\\n //var alarm = 'EBZI'; \\r\\n //var latitudeHex = '00';\\r\\n //var longitudeHex = '00';\\r\\n //var descr = 'empty';\\r\\n var flag = hexToDecimal(value.substring(0, 2)); // 0= Disconnected, 1= Connected\\r\\n var mac = value.substring(2, 14); // No hace falta darle la vuelta\\r\\n // add : format in MAC\\r\\n mac = mac.match(/.{1,2}/g).join(':');\\r\\n var batLevel = hexToDecimal(value.substring(14, 16)); // 0-100\\r\\n //location_time = timestamp;\\r\\n ble_data = `${flag},${batLevel},${mac}`;\\r\\n general += 'BLE location (State):' + flag + ', (bat):' + batLevel + ', (mac):' + mac + ',';\\r\\n break;\\r\\n }\\r\\n }\\r\\n if (alarmCode) {\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch;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 = (`Watch;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': // Ringer Volume\\r\\n var volume = hexToDecimal(value);\\r\\n imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;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 = (`Watch;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 '0F': // Enable control.... Used for STEP COUNTING SETTINGS\\r\\n // 'FF FF 21 80'\\r\\n var StepStatus = hex2bin(value.substring(4, 6));\\r\\n var enalbleDisable = '';\\r\\n if (StepStatus.substring(7, 8) == '1') {\\r\\n var step = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var step = 'Disable, '\\r\\n };\\r\\n //var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n //hrate += detectingInterval;\\r\\n AddValue(codeValues, \\\"step\\\", step);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadStepsSettings.EnableDisableReadStepsSettings, enalbleDisable);\\r\\n //AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadStepsSettings.EnableDisableReadStepsSettings);\\r\\n //configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\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 = (`Watch;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 '34': //ContactList with name\\r\\n var contactNumber = value.substring(1, 2);\\r\\n var telLength = hexToDecimal(value.substring(2, 4));\\r\\n var tel = '';\\r\\n switch (contactNumber) {\\r\\n // Emergency Number\\r\\n case '0':\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n break;\\r\\n // Speed Dial Number\\r\\n //case '1':\\r\\n // tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n // AddValue(codeValues, \\\"SpeedDialNumber\\\", tel);\\r\\n // AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.SpeedDialNumber, tel);\\r\\n // configsToAck.push(configIds.ReadSpeedDialSettings.SpeedDialNumber);\\r\\n // break;\\r\\n // Gateway Number\\r\\n case '9': //00447781482635,Esendex UK 0034627177148,Esendex Spain 00447507288240,Esendex UK Acceptance\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n if (tel.includes('447781482635') || tel.includes('00447781482635')) {\\r\\n tel = 'Esendex UK'\\r\\n } else if (tel.includes('34627177148') || tel.includes('0034627177148')) {\\r\\n tel = 'Esendex Spain'\\r\\n } else if (tel.includes('447507288240') || tel.includes('00447507288240')) {\\r\\n tel = 'Esendex UK Acceptance'\\r\\n } else {\\r\\n tel = 'Default'\\r\\n }\\r\\n AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n break;\\r\\n default:\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n if (tel.length < 6) {\\r\\n contacts += '';\\r\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n break;\\r\\n }\\r\\n //contacts += 'A' + (contactNumber - 1) + ': ' + tel + ', ';\\r\\n contacts += tel + ', ';\\r\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n break;\\r\\n }\\r\\n break;\\r\\n case '40': // APN\\r\\n //no ACK need\\r\\n AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'));\\r\\n configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\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 = (`Watch;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 = (`Watch;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 '46': //HeartRate\\r\\n // '10 0E 00 80'\\r\\n var HeartRateStatus = hex2bin(value.substring(6, 8));\\r\\n var enalbleDisable = '';\\r\\n if (HeartRateStatus.substring(0, 1) == '1') {\\r\\n var hrate = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var hrate = 'Disable, '\\r\\n };\\r\\n var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n hrate += detectingInterval;\\r\\n AddValue(codeValues, \\\"hrate\\\", hrate);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings);\\r\\n configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\r\\n break;\\r\\n case '47': // Custom Id\\r\\n imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;ACK-CUSTID;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"customeid\\\", value);\\r\\n AddValue(configsToUpdate, configIds.ReadState.CustomId, hex_to_ascii(value)); //now it comes \\\"3036\\\"\\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 // commented until Eview fixes this function\\r\\n /*\\r\\n messageForReceiver = (`Watch;ACK-NOMOTION;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"nomotion\\\", alertSetting);\\r\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings, enableDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n configsToAck.push(configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings);\\r\\n configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n */\\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 = (`Watch;ACK-FALLALERT;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n var sesibityOptionValue = hexToDecimal(value.substring(1, 2));\\r\\n sensibility += sesibityOptionValue;\\r\\n AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n //AddValue(configsToUpdate, configIds.ReadAlertSettings.FallSettings, sensibility);\\r\\n AddValue(configsToUpdate, configIds.ReadFallSettings.EnableDisableFallSettings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadFallSettings.Sensitivity, sesibityOptionValue);\\r\\n //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n configsToAck.push(configIds.ReadFallSettings.EnableDisableFallSettings);\\r\\n configsToAck.push(configIds.ReadFallSettings.Sensitivity);\\r\\n break;\\r\\n case '73': //BeaconList\\r\\n var beaconNumber = hexToDecimal(value.substring(1, 2));\\r\\n var beaconStatus = hex2bin(value.substring(0, 1));\\r\\n beaconStatus = hex_to_ascii(value.substring(30, value.length));\\r\\n //beaconStatus = changeEndianness(value.substring(30, value.length));\\r\\n //homeBeacon += 'B' + (beaconNumber + 1) + ': ' + beaconStatus + ', ';\\r\\n homeBeacon += beaconStatus + ', ';\\r\\n AddValue(codeValues, \\\"homeBeacon\\\", homeBeacon);\\r\\n messageForReceiver = (`Watch;ACK-GDATA;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n break;\\r\\n case '4A': //Wifi Network List\\r\\n var wifiSSIDLenght = hexToDecimal(value.substring(2, 4));\\r\\n var wifiPasswordLenght = hexToDecimal(value.substring(4, 6));\\r\\n var wifiIndex = hexToDecimal(value.substring(1, 2));\\r\\n //var wifiStatus = hexToDecimal(value.substring(0, 1));\\r\\n var wifiStatus = value.substring(0, 1);\\r\\n /*var enalbleDisable = wifiSSID = wifiPassword = homeWifi = '';\\r\\n /var homeWifi = '';\\r\\n if (wifiIndex == '0') { // Only first Wifi of the list\\r\\n if (wifiStatus == '8') {\\r\\n homeWifi += ' Enable, '\\r\\n enalbleDisable = '1';\\r\\n } else {\\r\\n homeWifi += ' Disable, '\\r\\n //enalbleDisable = '0';\\r\\n };*/\\r\\n if ((wifiStatus == '8') || (wifiStatus == 'C')) { // 8 == ON OR C== ON and Connected\\r\\n var wifiSSID = hex_to_ascii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\r\\n var wifiPassword = hex_to_ascii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\r\\n var imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;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 = (`Watch;ACK-SPEED;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"speed\\\", alertSetting);\\r\\n AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\r\\n configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n break;\\r\\n case '7A': //[Length]:05 [Key]:7A [Value]:60 54 00 80\\r\\n // {\\\"spo2Interval\\\":{\\\"interval\\\":21600,\\\"status\\\":1}}\\r\\n var SPOStatus = hex2bin(value.substring(6, 8));\\r\\n var enalbleDisable = '';\\r\\n if (SPOStatus.substring(0, 1) == '1') {\\r\\n var spo = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var spo = 'Disable, '\\r\\n };\\r\\n var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n spo += detectingInterval;\\r\\n AddValue(codeValues, \\\"SPO2\\\", spo);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadSPO2Settings.EnableDisableReadSPO2Settings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadSPO2Settings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadSPO2Settings.EnableDisableReadSPO2Settings);\\r\\n configsToAck.push(configIds.ReadSPO2Settings.ReportingFrequency);\\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 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 = (`Watch-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 = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch-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 if (typeof configIds !== 'undefined' && configIds && configIds.ConfigureDevice && configIds.ConfigureDevice.LastConfigured) { // when is defined\\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 }\\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(hex) { // Hex to Ascii \\r\\n if (hex.length % 2 !== 0) {\\r\\n throw new Error(\\\"Hex string length must be even\\\");\\r\\n }\\r\\n let ascii = '';\\r\\n for (let i = 0; i < hex.length; i += 2) {\\r\\n const byte = hex.substr(i, 2);\\r\\n const charCode = parseInt(byte, 16);\\r\\n if (charCode !== 0) { // remove null character (\\\\u0000)\\r\\n ascii += String.fromCharCode(charCode);\\r\\n }\\r\\n }\\r\\n return ascii;\\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":1765480260},{"Type":1,"NewValue":"{\"Id\":437,\"Name\":\"Access TEC Care Watch\",\"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 // Watch protocol - please see variables and typical values in order below\\r\\n // Watch-CYC;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;SIGNAL=<>;WM=<>;GENERAL=<>\\r\\n // Watch-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\r\\n //\\r\\n // Author: Juanmi Navarro\\r\\n // Created: 01/01/0000\\r\\n // Last modified: 18/09/2025\\r\\n //\\r\\n ///////////////////////////////////////////////////////////////////////////////\\r\\n if (typeof localTesting === \\\"undefined\\\") {\\r\\n let localTesting = false;\\r\\n }\\r\\n const crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,\\r\\n 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,\\r\\n 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,\\r\\n 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,\\r\\n 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,\\r\\n 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,\\r\\n 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,\\r\\n 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,\\r\\n 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,\\r\\n 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,\\r\\n 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,\\r\\n 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,\\r\\n 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,\\r\\n 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,\\r\\n 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,\\r\\n 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,\\r\\n 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,\\r\\n 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,\\r\\n 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,\\r\\n 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,\\r\\n 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,\\r\\n 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n ];\\r\\n var codeValues = [];\\r\\n AddValue(codeValues, 'protocol_template', 'Watch');\\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 = (`Watch-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 var allowedCID = ['3036', '06'];\\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 } else if (oystaTemplate == 'True') { // Oysta Template \\r\\n AddValue(codeValues, 'rawMsg', raw);\\r\\n if ((params.rawlabel) && (params.rawlabel !== '')) { // decode label if exists\\r\\n var labels = normalizeLabels(params.rawlabel); // \\\"steps\\\" -> [\\\"steps\\\"]\\r\\n AddValue(codeValues, 'oysta_labels', fix_state);\\r\\n }\\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 //<>,<>,<> \\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];\\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 //<>,<>,<> \\r\\n if (mac2) {\\r\\n AddValue(codeValues, 'beacon_mac', mac2);\\r\\n var simpleQuery2 = [{\\r\\n 'code': 'Mac',\\r\\n 'value': mac2,\\r\\n }];\\r\\n var simpleQueryLabel2 = {\\r\\n 'table': 'beacons',\\r\\n 'select': 'Name',\\r\\n 'query': simpleQuery2\\r\\n };\\r\\n var labels2 = [];\\r\\n labels2.push(JSON.stringify(simpleQueryLabel2));\\r\\n AddValue(codeValues, 'oysta_labels', JSON.stringify(labels2));\\r\\n }\\r\\n if (params.beacon_major) {\\r\\n AddValue(codeValues, 'beacon_major', params.beacon_major);\\r\\n } else {\\r\\n AddValue(codeValues, 'beacon_major', 0);\\r\\n }\\r\\n if (params.beacon_minor) {\\r\\n AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\r\\n } else {\\r\\n AddValue(codeValues, 'beacon_minor', 0);\\r\\n }\\r\\n //AddValue(codeValues,'oysta_labels', label);\\r\\n //AddValue(codeValues,'oysta_value', mac);\\r\\n }\\r\\n /* meter mas tarde... \\r\\n if (params.smart_data !== 'undefined') {\\r\\n var gen_location = params.smart_data.split(',')\\r\\n var latitude = gen_location[0]\\r\\n var longitude = gen_location[1]\\r\\n var location_accuracy = gen_location[2]\\r\\n var altitude = gen_location[3]\\r\\n AddValue(codeValues,'latitude', latitude);\\r\\n AddValue(codeValues,'longitude', longitude);\\r\\n AddValue(codeValues,'altitude', altitude);\\r\\n AddValue(codeValues,'location_accuracy', location_accuracy);\\r\\n }\\r\\n */\\r\\n /*else if ((params.event_time) && (params.event_time == '')) {\\r\\n var event_time = moment.utc().unix();\\r\\n AddValue(codeValues,'event_time', event_time);\\r\\n } revisar mas adelante*/\\r\\n if (params.location_time) {\\r\\n AddValue(codeValues, 'location_time', params.location_time);\\r\\n }\\r\\n if (params.event_time) {\\r\\n AddValue(codeValues, 'event_time', params.event_time);\\r\\n }\\r\\n // to parse SMS info from the device\\r\\n switch (messageTypeLocalCode) {\\r\\n case 'COMM-SMS': // SMS message sent in\\r\\n if (params.data.startsWith('Device location request')) {\\r\\n configsToAck.push(configIds.Controls.RealTimeLocate);\\r\\n } else if (params.data.startsWith('Set IP ok')) {\\r\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n } else if (params.data.startsWith('IMEI:')) {\\r\\n configsToAck.push(configIds.Controls.GetFirmwareVersion);\\r\\n } else if (params.data.startsWith('Set IP ok')) {\\r\\n configsToAck.push(configIds.Controls.ClearBufferedMessages);\\r\\n } else if (params.data.startsWith('flush ok')) {\\r\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n } else if (params.data.startsWith('Set Watch-')) {\\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 = (`Watch-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 = (`Watch;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 = (`Watch;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 = (`Watch-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 // decode global msg\\r\\n function decoder(str) { // decode rawdata\\r\\n // CARE Decoder\\r\\n //AddValue(codeValues, 'Message : ', str);\\r\\n var message = str;\\r\\n var index = 18;\\r\\n //parse header & properties\\r\\n var properties = message.substring(2, 4);\\r\\n var lengthLittleEndian = message.substring(4, 8);\\r\\n var total_length = lengthLittleEndian.substring(2, 4) + lengthLittleEndian.substring(0, 2);\\r\\n total_length = 2 * hexToDecimal(total_length.substring(0, 4));\\r\\n var sequenceID = message.substring(12, 16);\\r\\n var command = message.substring(16, 18);\\r\\n //mask bitwise (properties should be '10')\\r\\n if ((parseInt(properties) & 8) == 8) {\\r\\n needsAck = true;\\r\\n } else needsAck = false;\\r\\n // need to check if checksum is correct for possible msg corruption 10/03/23\\r\\n var checksum = message.substring(8, 12);\\r\\n var messageBody = message.substring(16, message.length);\\r\\n debug('message =' + message);\\r\\n debug('checksum =' + checksum);\\r\\n debug('calculateCheckSum =' + calculateCheckSum(messageBody));\\r\\n if (calculateCheckSum(messageBody) == checksum) { // payload is valid\\r\\n debug(\\\"message has valid checksum\\\");\\r\\n var messageBody = command; // update value for the ACK\\r\\n debug('command =' + command);\\r\\n if (command == '01') {\\r\\n while (index < total_length + 16) {\\r\\n 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\\r\\n if ((alarmCodeExtInt & 1) == 1) {\\r\\n var alarm = 'ALF-C';\\r\\n }\\r\\n // Welfare Check-out\\r\\n else if ((alarmCodeExtInt & 2) == 2) {\\r\\n var alarm = 'ALA-C';\\r\\n }\\r\\n // Standard Alerts\\r\\n //Battery low\\r\\n else if ((alarmCodeInt & 1) == 1) {\\r\\n var alarm = 'BATL';\\r\\n }\\r\\n //Overspeed\\r\\n else if ((alarmCodeInt & 2) == 2) {\\r\\n var alarm = 'ALSP';\\r\\n }\\r\\n //Fall\\r\\n else if ((alarmCodeInt & 4) == 4) {\\r\\n var alarm = 'ALF';\\r\\n }\\r\\n //Tilt\\r\\n else if ((alarmCodeInt & 8) == 8) {\\r\\n var alarm = 'TLT';\\r\\n } else if ((alarmCodeInt & 16) == 16) {\\r\\n if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n var alarm = 'Geo1-IN';\\r\\n } else {\\r\\n var alarm = 'Geo1-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 32) == 32) {\\r\\n if ((alarmCodeInt & 33554432) == 33554432) {\\r\\n var alarm = 'Geo2-IN';\\r\\n } else {\\r\\n var alarm = 'Geo2-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 64) == 64) {\\r\\n if ((alarmCodeInt & 67108864) == 67108864) {\\r\\n var alarm = 'Geo3-IN';\\r\\n } else {\\r\\n var alarm = 'Geo3-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 128) == 128) {\\r\\n if ((alarmCodeInt & 134217728) == 134217728) {\\r\\n var alarm = 'Geo4-IN';\\r\\n } else {\\r\\n var alarm = 'Geo4-OUT';\\r\\n }\\r\\n }\\r\\n //Power Off\\r\\n else if ((alarmCodeInt & 256) == 256) {\\r\\n var alarm = 'PWRF';\\r\\n }\\r\\n //Power On\\r\\n else if ((alarmCodeInt & 512) == 512) {\\r\\n var alarm = 'PWRN';\\r\\n }\\r\\n //Motion\\r\\n else if ((alarmCodeInt & 1024) == 1024) {\\r\\n var alarm = 'ALMOV';\\r\\n }\\r\\n //No Motion\\r\\n else if ((alarmCodeInt & 2048) == 2048) {\\r\\n var alarm = 'ALNM';\\r\\n }\\r\\n //SOS\\r\\n else if ((alarmCodeInt & 4096) == 4096) {\\r\\n var alarm = 'ALSOS';\\r\\n } else if ((alarmCodeInt & 8192) == 8192) {\\r\\n var alarm = 'Side1';\\r\\n } else if ((alarmCodeInt & 16384) == 16384) {\\r\\n var alarm = 'Side2';\\r\\n }\\r\\n //Battery charging\\r\\n else if ((alarmCodeInt & 32768) == 32768) {\\r\\n var alarm = 'BATCN';\\r\\n }\\r\\n //Battery no charging\\r\\n else if ((alarmCodeInt & 65536) == 65536) {\\r\\n var alarm = 'BATCF';\\r\\n }\\r\\n //SOS Ending\\r\\n // Temporary Commented until we know exactly how it works. 22/09/2022\\r\\n else if ((alarmCodeInt & 131072) == 131072) {\\r\\n var alarm = 'ALA-F';\\r\\n info = 'Alarm Finished';\\r\\n }\\r\\n //Amber Alert EC03 only\\r\\n else if ((alarmCodeInt & 262144) == 262144) {\\r\\n var alarm = 'ALA';\\r\\n }\\r\\n // welfare Alert check-in ALA-O\\r\\n else if ((alarmCodeInt & 524288) == 524288) {\\r\\n var alarm = 'ALA-O';\\r\\n }\\r\\n // Amber alert Ending ALA-C\\r\\n else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n var alarm = 'ALA-C';\\r\\n }\\r\\n // Amber alert Ending ALA-C\\r\\n //else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n // var alarm = 'ALA-C';\\r\\n //}\\r\\n // Fall-Down Alert ending\\r\\n else if ((alarmCodeInt & 2097152) == 2097152) {\\r\\n var alarm = 'ALF-C';\\r\\n }\\r\\n // welfare Alert Ending ALA\\r\\n else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n var alarm = 'ALA';\\r\\n }\\r\\n // Beacon absent Alert 11/10/22. Need to be added in msg types\\r\\n //else if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n // var alarm = 'BEA';\\r\\n //}\\r\\n general += 'alarm:' + alarm + ',';\\r\\n break;\\r\\n //Custom ID\\r\\n case '03':\\r\\n customID = value;\\r\\n if (!allowedCID.includes(value)) {\\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 //<>,<>,<>,<>,<>\\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 if (!allowedCID.includes(customID)) {\\r\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n AddValue(codeValues, \\\"customID\\\", customID);\\r\\n return\\r\\n }\\r\\n if (statusDevice) {\\r\\n messageForReceiver = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n }\\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;\\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 }\\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 = 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 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 var rawlabel = 'steps';\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=${rawlabel}`);\\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 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 var rawlabel = 'bpm';\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=${rawlabel}`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n }\\r\\n break;\\r\\n // SPO2\\r\\n case '41':\\r\\n var numSPO = (keyLength - 2) / 12;\\r\\n for (let j = 0; j < numSPO; 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 SPOHex = value.substring(8, 10);\\r\\n var SPO = hexToDecimal(SPOHex);\\r\\n var trustLevelHex = value.substring(10, 12);\\r\\n var trustLevel = hexToDecimal(trustLevelHex);\\r\\n info = SPO;\\r\\n //var alarmCode = 'True';\\r\\n var alarm = 'SPO2';\\r\\n general += ' SPO2 rate' + j + ':' + SPO + ',';\\r\\n var rawlabel = '%';\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};SPO2=${info};TLEVEL=${trustLevel};LABEL=${rawlabel}`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n }\\r\\n break;\\r\\n //BLE Connected . For Flic button\\r\\n case '62':\\r\\n location_type = 'BLE';\\r\\n //var alarm = 'EBZI'; \\r\\n //var latitudeHex = '00';\\r\\n //var longitudeHex = '00';\\r\\n //var descr = 'empty';\\r\\n var flag = hexToDecimal(value.substring(0, 2)); // 0= Disconnected, 1= Connected\\r\\n var mac = value.substring(2, 14); // No hace falta darle la vuelta\\r\\n // add : format in MAC\\r\\n mac = mac.match(/.{1,2}/g).join(':');\\r\\n var batLevel = hexToDecimal(value.substring(14, 16)); // 0-100\\r\\n //location_time = timestamp;\\r\\n ble_data = `${flag},${batLevel},${mac}`;\\r\\n general += 'BLE location (State):' + flag + ', (bat):' + batLevel + ', (mac):' + mac + ',';\\r\\n break;\\r\\n }\\r\\n }\\r\\n if (alarmCode) {\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch;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 = (`Watch;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': // Ringer Volume\\r\\n var volume = hexToDecimal(value);\\r\\n imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;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 = (`Watch;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 '0F': // Enable control.... Used for STEP COUNTING SETTINGS\\r\\n // 'FF FF 21 80'\\r\\n var StepStatus = hex2bin(value.substring(4, 6));\\r\\n var enalbleDisable = '';\\r\\n if (StepStatus.substring(7, 8) == '1') {\\r\\n var step = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var step = 'Disable, '\\r\\n };\\r\\n //var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n //hrate += detectingInterval;\\r\\n AddValue(codeValues, \\\"step\\\", step);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadStepsSettings.EnableDisableReadStepsSettings, enalbleDisable);\\r\\n //AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadStepsSettings.EnableDisableReadStepsSettings);\\r\\n //configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\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 = (`Watch;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 '34': //ContactList with name\\r\\n var contactNumber = value.substring(1, 2);\\r\\n var telLength = hexToDecimal(value.substring(2, 4));\\r\\n var tel = '';\\r\\n switch (contactNumber) {\\r\\n // Emergency Number\\r\\n case '0':\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n break;\\r\\n // Speed Dial Number\\r\\n //case '1':\\r\\n // tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n // AddValue(codeValues, \\\"SpeedDialNumber\\\", tel);\\r\\n // AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.SpeedDialNumber, tel);\\r\\n // configsToAck.push(configIds.ReadSpeedDialSettings.SpeedDialNumber);\\r\\n // break;\\r\\n // Gateway Number\\r\\n case '9': //00447781482635,Esendex UK 0034627177148,Esendex Spain 00447507288240,Esendex UK Acceptance\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n if (tel.includes('447781482635') || tel.includes('00447781482635')) {\\r\\n tel = 'Esendex UK'\\r\\n } else if (tel.includes('34627177148') || tel.includes('0034627177148')) {\\r\\n tel = 'Esendex Spain'\\r\\n } else if (tel.includes('447507288240') || tel.includes('00447507288240')) {\\r\\n tel = 'Esendex UK Acceptance'\\r\\n } else {\\r\\n tel = 'Default'\\r\\n }\\r\\n AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n break;\\r\\n default:\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n if (tel.length < 6) {\\r\\n contacts += '';\\r\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n break;\\r\\n }\\r\\n //contacts += 'A' + (contactNumber - 1) + ': ' + tel + ', ';\\r\\n contacts += tel + ', ';\\r\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n break;\\r\\n }\\r\\n break;\\r\\n case '40': // APN\\r\\n //no ACK need\\r\\n AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'));\\r\\n configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\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 = (`Watch;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 = (`Watch;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 '46': //HeartRate\\r\\n // '10 0E 00 80'\\r\\n var HeartRateStatus = hex2bin(value.substring(6, 8));\\r\\n var enalbleDisable = '';\\r\\n if (HeartRateStatus.substring(0, 1) == '1') {\\r\\n var hrate = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var hrate = 'Disable, '\\r\\n };\\r\\n var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n hrate += detectingInterval;\\r\\n AddValue(codeValues, \\\"hrate\\\", hrate);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings);\\r\\n configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\r\\n break;\\r\\n case '47': // Custom Id\\r\\n imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;ACK-CUSTID;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"customeid\\\", value);\\r\\n AddValue(configsToUpdate, configIds.ReadState.CustomId, hex_to_ascii(value)); //now it comes \\\"3036\\\"\\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 // commented until Eview fixes this function\\r\\n /*\\r\\n messageForReceiver = (`Watch;ACK-NOMOTION;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"nomotion\\\", alertSetting);\\r\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings, enableDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n configsToAck.push(configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings);\\r\\n configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n */\\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 = (`Watch;ACK-FALLALERT;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n var sesibityOptionValue = hexToDecimal(value.substring(1, 2));\\r\\n sensibility += sesibityOptionValue;\\r\\n AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n //AddValue(configsToUpdate, configIds.ReadAlertSettings.FallSettings, sensibility);\\r\\n AddValue(configsToUpdate, configIds.ReadFallSettings.EnableDisableFallSettings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadFallSettings.Sensitivity, sesibityOptionValue);\\r\\n //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n configsToAck.push(configIds.ReadFallSettings.EnableDisableFallSettings);\\r\\n configsToAck.push(configIds.ReadFallSettings.Sensitivity);\\r\\n break;\\r\\n case '73': //BeaconList\\r\\n var beaconNumber = hexToDecimal(value.substring(1, 2));\\r\\n var beaconStatus = hex2bin(value.substring(0, 1));\\r\\n beaconStatus = hex_to_ascii(value.substring(30, value.length));\\r\\n //beaconStatus = changeEndianness(value.substring(30, value.length));\\r\\n //homeBeacon += 'B' + (beaconNumber + 1) + ': ' + beaconStatus + ', ';\\r\\n homeBeacon += beaconStatus + ', ';\\r\\n AddValue(codeValues, \\\"homeBeacon\\\", homeBeacon);\\r\\n messageForReceiver = (`Watch;ACK-GDATA;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n break;\\r\\n case '4A': //Wifi Network List\\r\\n var wifiSSIDLenght = hexToDecimal(value.substring(2, 4));\\r\\n var wifiPasswordLenght = hexToDecimal(value.substring(4, 6));\\r\\n var wifiIndex = hexToDecimal(value.substring(1, 2));\\r\\n //var wifiStatus = hexToDecimal(value.substring(0, 1));\\r\\n var wifiStatus = value.substring(0, 1);\\r\\n /*var enalbleDisable = wifiSSID = wifiPassword = homeWifi = '';\\r\\n /var homeWifi = '';\\r\\n if (wifiIndex == '0') { // Only first Wifi of the list\\r\\n if (wifiStatus == '8') {\\r\\n homeWifi += ' Enable, '\\r\\n enalbleDisable = '1';\\r\\n } else {\\r\\n homeWifi += ' Disable, '\\r\\n //enalbleDisable = '0';\\r\\n };*/\\r\\n if ((wifiStatus == '8') || (wifiStatus == 'C')) { // 8 == ON OR C== ON and Connected\\r\\n var wifiSSID = hex_to_ascii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\r\\n var wifiPassword = hex_to_ascii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\r\\n var imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;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 = (`Watch;ACK-SPEED;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"speed\\\", alertSetting);\\r\\n AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\r\\n configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n break;\\r\\n case '7A': //[Length]:05 [Key]:7A [Value]:60 54 00 80\\r\\n // {\\\"spo2Interval\\\":{\\\"interval\\\":21600,\\\"status\\\":1}}\\r\\n var SPOStatus = hex2bin(value.substring(6, 8));\\r\\n var enalbleDisable = '';\\r\\n if (SPOStatus.substring(0, 1) == '1') {\\r\\n var spo = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var spo = 'Disable, '\\r\\n };\\r\\n var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n spo += detectingInterval;\\r\\n AddValue(codeValues, \\\"SPO2\\\", spo);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadSPO2Settings.EnableDisableReadSPO2Settings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadSPO2Settings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadSPO2Settings.EnableDisableReadSPO2Settings);\\r\\n configsToAck.push(configIds.ReadSPO2Settings.ReportingFrequency);\\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 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 = (`Watch-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 = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch-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 if (typeof configIds !== 'undefined' && configIds && configIds.ConfigureDevice && configIds.ConfigureDevice.LastConfigured) { // when is defined\\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 }\\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(hex) { // Hex to Ascii \\r\\n if (hex.length % 2 !== 0) {\\r\\n throw new Error(\\\"Hex string length must be even\\\");\\r\\n }\\r\\n let ascii = '';\\r\\n for (let i = 0; i < hex.length; i += 2) {\\r\\n const byte = hex.substr(i, 2);\\r\\n const charCode = parseInt(byte, 16);\\r\\n if (charCode !== 0) { // remove null character (\\\\u0000)\\r\\n ascii += String.fromCharCode(charCode);\\r\\n }\\r\\n }\\r\\n return ascii;\\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 normalizeLabels(raw) { // output labels as array\\r\\n if (raw == null) return [];\\r\\n if (Array.isArray(raw)) return raw;\\r\\n // Si en algún momento vinieran varias labels separadas por coma o ;\\r\\n return String(raw).split(/[;,]/).map(s => s.trim()).filter(Boolean);\\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":1765480978},{"Type":1,"NewValue":"{\"Id\":437,\"Name\":\"Access TEC Care Watch\",\"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 // Watch protocol - please see variables and typical values in order below\\r\\n // Watch-CYC;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;SIGNAL=<>;WM=<>;GENERAL=<>\\r\\n // Watch-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\r\\n //\\r\\n // Author: Juanmi Navarro\\r\\n // Created: 01/01/0000\\r\\n // Last modified: 18/09/2025\\r\\n //\\r\\n ///////////////////////////////////////////////////////////////////////////////\\r\\n if (typeof localTesting === \\\"undefined\\\") {\\r\\n let localTesting = false;\\r\\n }\\r\\n const crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,\\r\\n 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,\\r\\n 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,\\r\\n 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,\\r\\n 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,\\r\\n 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,\\r\\n 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,\\r\\n 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,\\r\\n 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,\\r\\n 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,\\r\\n 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,\\r\\n 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,\\r\\n 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,\\r\\n 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,\\r\\n 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,\\r\\n 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,\\r\\n 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,\\r\\n 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,\\r\\n 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,\\r\\n 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,\\r\\n 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,\\r\\n 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n ];\\r\\n var codeValues = [];\\r\\n AddValue(codeValues, 'protocol_template', 'Watch');\\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 = (`Watch-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 var allowedCID = ['3036', '06'];\\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 } else if (oystaTemplate == 'True') { // Oysta Template \\r\\n AddValue(codeValues, 'rawMsg', raw);\\r\\n if ((params.rawlabel) && (params.rawlabel !== '')) { // decode label if exists\\r\\n var labels = normalizeLabels(params.rawlabel); // \\\"steps\\\" -> [\\\"steps\\\"]\\r\\n AddValue(codeValues, 'oysta_labels', labels);\\r\\n }\\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 //<>,<>,<> \\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];\\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 //<>,<>,<> \\r\\n if (mac2) {\\r\\n AddValue(codeValues, 'beacon_mac', mac2);\\r\\n var simpleQuery2 = [{\\r\\n 'code': 'Mac',\\r\\n 'value': mac2,\\r\\n }];\\r\\n var simpleQueryLabel2 = {\\r\\n 'table': 'beacons',\\r\\n 'select': 'Name',\\r\\n 'query': simpleQuery2\\r\\n };\\r\\n var labels2 = [];\\r\\n labels2.push(JSON.stringify(simpleQueryLabel2));\\r\\n AddValue(codeValues, 'oysta_labels', JSON.stringify(labels2));\\r\\n }\\r\\n if (params.beacon_major) {\\r\\n AddValue(codeValues, 'beacon_major', params.beacon_major);\\r\\n } else {\\r\\n AddValue(codeValues, 'beacon_major', 0);\\r\\n }\\r\\n if (params.beacon_minor) {\\r\\n AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\r\\n } else {\\r\\n AddValue(codeValues, 'beacon_minor', 0);\\r\\n }\\r\\n //AddValue(codeValues,'oysta_labels', label);\\r\\n //AddValue(codeValues,'oysta_value', mac);\\r\\n }\\r\\n /* meter mas tarde... \\r\\n if (params.smart_data !== 'undefined') {\\r\\n var gen_location = params.smart_data.split(',')\\r\\n var latitude = gen_location[0]\\r\\n var longitude = gen_location[1]\\r\\n var location_accuracy = gen_location[2]\\r\\n var altitude = gen_location[3]\\r\\n AddValue(codeValues,'latitude', latitude);\\r\\n AddValue(codeValues,'longitude', longitude);\\r\\n AddValue(codeValues,'altitude', altitude);\\r\\n AddValue(codeValues,'location_accuracy', location_accuracy);\\r\\n }\\r\\n */\\r\\n /*else if ((params.event_time) && (params.event_time == '')) {\\r\\n var event_time = moment.utc().unix();\\r\\n AddValue(codeValues,'event_time', event_time);\\r\\n } revisar mas adelante*/\\r\\n if (params.location_time) {\\r\\n AddValue(codeValues, 'location_time', params.location_time);\\r\\n }\\r\\n if (params.event_time) {\\r\\n AddValue(codeValues, 'event_time', params.event_time);\\r\\n }\\r\\n // to parse SMS info from the device\\r\\n switch (messageTypeLocalCode) {\\r\\n case 'COMM-SMS': // SMS message sent in\\r\\n if (params.data.startsWith('Device location request')) {\\r\\n configsToAck.push(configIds.Controls.RealTimeLocate);\\r\\n } else if (params.data.startsWith('Set IP ok')) {\\r\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n } else if (params.data.startsWith('IMEI:')) {\\r\\n configsToAck.push(configIds.Controls.GetFirmwareVersion);\\r\\n } else if (params.data.startsWith('Set IP ok')) {\\r\\n configsToAck.push(configIds.Controls.ClearBufferedMessages);\\r\\n } else if (params.data.startsWith('flush ok')) {\\r\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n } else if (params.data.startsWith('Set Watch-')) {\\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 = (`Watch-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 = (`Watch;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 = (`Watch;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 = (`Watch-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 // decode global msg\\r\\n function decoder(str) { // decode rawdata\\r\\n // CARE Decoder\\r\\n //AddValue(codeValues, 'Message : ', str);\\r\\n var message = str;\\r\\n var index = 18;\\r\\n //parse header & properties\\r\\n var properties = message.substring(2, 4);\\r\\n var lengthLittleEndian = message.substring(4, 8);\\r\\n var total_length = lengthLittleEndian.substring(2, 4) + lengthLittleEndian.substring(0, 2);\\r\\n total_length = 2 * hexToDecimal(total_length.substring(0, 4));\\r\\n var sequenceID = message.substring(12, 16);\\r\\n var command = message.substring(16, 18);\\r\\n //mask bitwise (properties should be '10')\\r\\n if ((parseInt(properties) & 8) == 8) {\\r\\n needsAck = true;\\r\\n } else needsAck = false;\\r\\n // need to check if checksum is correct for possible msg corruption 10/03/23\\r\\n var checksum = message.substring(8, 12);\\r\\n var messageBody = message.substring(16, message.length);\\r\\n debug('message =' + message);\\r\\n debug('checksum =' + checksum);\\r\\n debug('calculateCheckSum =' + calculateCheckSum(messageBody));\\r\\n if (calculateCheckSum(messageBody) == checksum) { // payload is valid\\r\\n debug(\\\"message has valid checksum\\\");\\r\\n var messageBody = command; // update value for the ACK\\r\\n debug('command =' + command);\\r\\n if (command == '01') {\\r\\n while (index < total_length + 16) {\\r\\n 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\\r\\n if ((alarmCodeExtInt & 1) == 1) {\\r\\n var alarm = 'ALF-C';\\r\\n }\\r\\n // Welfare Check-out\\r\\n else if ((alarmCodeExtInt & 2) == 2) {\\r\\n var alarm = 'ALA-C';\\r\\n }\\r\\n // Standard Alerts\\r\\n //Battery low\\r\\n else if ((alarmCodeInt & 1) == 1) {\\r\\n var alarm = 'BATL';\\r\\n }\\r\\n //Overspeed\\r\\n else if ((alarmCodeInt & 2) == 2) {\\r\\n var alarm = 'ALSP';\\r\\n }\\r\\n //Fall\\r\\n else if ((alarmCodeInt & 4) == 4) {\\r\\n var alarm = 'ALF';\\r\\n }\\r\\n //Tilt\\r\\n else if ((alarmCodeInt & 8) == 8) {\\r\\n var alarm = 'TLT';\\r\\n } else if ((alarmCodeInt & 16) == 16) {\\r\\n if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n var alarm = 'Geo1-IN';\\r\\n } else {\\r\\n var alarm = 'Geo1-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 32) == 32) {\\r\\n if ((alarmCodeInt & 33554432) == 33554432) {\\r\\n var alarm = 'Geo2-IN';\\r\\n } else {\\r\\n var alarm = 'Geo2-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 64) == 64) {\\r\\n if ((alarmCodeInt & 67108864) == 67108864) {\\r\\n var alarm = 'Geo3-IN';\\r\\n } else {\\r\\n var alarm = 'Geo3-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 128) == 128) {\\r\\n if ((alarmCodeInt & 134217728) == 134217728) {\\r\\n var alarm = 'Geo4-IN';\\r\\n } else {\\r\\n var alarm = 'Geo4-OUT';\\r\\n }\\r\\n }\\r\\n //Power Off\\r\\n else if ((alarmCodeInt & 256) == 256) {\\r\\n var alarm = 'PWRF';\\r\\n }\\r\\n //Power On\\r\\n else if ((alarmCodeInt & 512) == 512) {\\r\\n var alarm = 'PWRN';\\r\\n }\\r\\n //Motion\\r\\n else if ((alarmCodeInt & 1024) == 1024) {\\r\\n var alarm = 'ALMOV';\\r\\n }\\r\\n //No Motion\\r\\n else if ((alarmCodeInt & 2048) == 2048) {\\r\\n var alarm = 'ALNM';\\r\\n }\\r\\n //SOS\\r\\n else if ((alarmCodeInt & 4096) == 4096) {\\r\\n var alarm = 'ALSOS';\\r\\n } else if ((alarmCodeInt & 8192) == 8192) {\\r\\n var alarm = 'Side1';\\r\\n } else if ((alarmCodeInt & 16384) == 16384) {\\r\\n var alarm = 'Side2';\\r\\n }\\r\\n //Battery charging\\r\\n else if ((alarmCodeInt & 32768) == 32768) {\\r\\n var alarm = 'BATCN';\\r\\n }\\r\\n //Battery no charging\\r\\n else if ((alarmCodeInt & 65536) == 65536) {\\r\\n var alarm = 'BATCF';\\r\\n }\\r\\n //SOS Ending\\r\\n // Temporary Commented until we know exactly how it works. 22/09/2022\\r\\n else if ((alarmCodeInt & 131072) == 131072) {\\r\\n var alarm = 'ALA-F';\\r\\n info = 'Alarm Finished';\\r\\n }\\r\\n //Amber Alert EC03 only\\r\\n else if ((alarmCodeInt & 262144) == 262144) {\\r\\n var alarm = 'ALA';\\r\\n }\\r\\n // welfare Alert check-in ALA-O\\r\\n else if ((alarmCodeInt & 524288) == 524288) {\\r\\n var alarm = 'ALA-O';\\r\\n }\\r\\n // Amber alert Ending ALA-C\\r\\n else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n var alarm = 'ALA-C';\\r\\n }\\r\\n // Amber alert Ending ALA-C\\r\\n //else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n // var alarm = 'ALA-C';\\r\\n //}\\r\\n // Fall-Down Alert ending\\r\\n else if ((alarmCodeInt & 2097152) == 2097152) {\\r\\n var alarm = 'ALF-C';\\r\\n }\\r\\n // welfare Alert Ending ALA\\r\\n else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n var alarm = 'ALA';\\r\\n }\\r\\n // Beacon absent Alert 11/10/22. Need to be added in msg types\\r\\n //else if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n // var alarm = 'BEA';\\r\\n //}\\r\\n general += 'alarm:' + alarm + ',';\\r\\n break;\\r\\n //Custom ID\\r\\n case '03':\\r\\n customID = value;\\r\\n if (!allowedCID.includes(value)) {\\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 //<>,<>,<>,<>,<>\\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 if (!allowedCID.includes(customID)) {\\r\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n AddValue(codeValues, \\\"customID\\\", customID);\\r\\n return\\r\\n }\\r\\n if (statusDevice) {\\r\\n messageForReceiver = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n }\\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;\\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 }\\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 = 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 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 var rawlabel = 'steps';\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=${rawlabel}`);\\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 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 var rawlabel = 'bpm';\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=${rawlabel}`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n }\\r\\n break;\\r\\n // SPO2\\r\\n case '41':\\r\\n var numSPO = (keyLength - 2) / 12;\\r\\n for (let j = 0; j < numSPO; 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 SPOHex = value.substring(8, 10);\\r\\n var SPO = hexToDecimal(SPOHex);\\r\\n var trustLevelHex = value.substring(10, 12);\\r\\n var trustLevel = hexToDecimal(trustLevelHex);\\r\\n info = SPO;\\r\\n //var alarmCode = 'True';\\r\\n var alarm = 'SPO2';\\r\\n general += ' SPO2 rate' + j + ':' + SPO + ',';\\r\\n var rawlabel = '%';\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};SPO2=${info};TLEVEL=${trustLevel};LABEL=${rawlabel}`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n }\\r\\n break;\\r\\n //BLE Connected . For Flic button\\r\\n case '62':\\r\\n location_type = 'BLE';\\r\\n //var alarm = 'EBZI'; \\r\\n //var latitudeHex = '00';\\r\\n //var longitudeHex = '00';\\r\\n //var descr = 'empty';\\r\\n var flag = hexToDecimal(value.substring(0, 2)); // 0= Disconnected, 1= Connected\\r\\n var mac = value.substring(2, 14); // No hace falta darle la vuelta\\r\\n // add : format in MAC\\r\\n mac = mac.match(/.{1,2}/g).join(':');\\r\\n var batLevel = hexToDecimal(value.substring(14, 16)); // 0-100\\r\\n //location_time = timestamp;\\r\\n ble_data = `${flag},${batLevel},${mac}`;\\r\\n general += 'BLE location (State):' + flag + ', (bat):' + batLevel + ', (mac):' + mac + ',';\\r\\n break;\\r\\n }\\r\\n }\\r\\n if (alarmCode) {\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch;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 = (`Watch;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': // Ringer Volume\\r\\n var volume = hexToDecimal(value);\\r\\n imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;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 = (`Watch;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 '0F': // Enable control.... Used for STEP COUNTING SETTINGS\\r\\n // 'FF FF 21 80'\\r\\n var StepStatus = hex2bin(value.substring(4, 6));\\r\\n var enalbleDisable = '';\\r\\n if (StepStatus.substring(7, 8) == '1') {\\r\\n var step = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var step = 'Disable, '\\r\\n };\\r\\n //var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n //hrate += detectingInterval;\\r\\n AddValue(codeValues, \\\"step\\\", step);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadStepsSettings.EnableDisableReadStepsSettings, enalbleDisable);\\r\\n //AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadStepsSettings.EnableDisableReadStepsSettings);\\r\\n //configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\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 = (`Watch;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 '34': //ContactList with name\\r\\n var contactNumber = value.substring(1, 2);\\r\\n var telLength = hexToDecimal(value.substring(2, 4));\\r\\n var tel = '';\\r\\n switch (contactNumber) {\\r\\n // Emergency Number\\r\\n case '0':\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n break;\\r\\n // Speed Dial Number\\r\\n //case '1':\\r\\n // tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n // AddValue(codeValues, \\\"SpeedDialNumber\\\", tel);\\r\\n // AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.SpeedDialNumber, tel);\\r\\n // configsToAck.push(configIds.ReadSpeedDialSettings.SpeedDialNumber);\\r\\n // break;\\r\\n // Gateway Number\\r\\n case '9': //00447781482635,Esendex UK 0034627177148,Esendex Spain 00447507288240,Esendex UK Acceptance\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n if (tel.includes('447781482635') || tel.includes('00447781482635')) {\\r\\n tel = 'Esendex UK'\\r\\n } else if (tel.includes('34627177148') || tel.includes('0034627177148')) {\\r\\n tel = 'Esendex Spain'\\r\\n } else if (tel.includes('447507288240') || tel.includes('00447507288240')) {\\r\\n tel = 'Esendex UK Acceptance'\\r\\n } else {\\r\\n tel = 'Default'\\r\\n }\\r\\n AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n break;\\r\\n default:\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n if (tel.length < 6) {\\r\\n contacts += '';\\r\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n break;\\r\\n }\\r\\n //contacts += 'A' + (contactNumber - 1) + ': ' + tel + ', ';\\r\\n contacts += tel + ', ';\\r\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n break;\\r\\n }\\r\\n break;\\r\\n case '40': // APN\\r\\n //no ACK need\\r\\n AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'));\\r\\n configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\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 = (`Watch;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 = (`Watch;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 '46': //HeartRate\\r\\n // '10 0E 00 80'\\r\\n var HeartRateStatus = hex2bin(value.substring(6, 8));\\r\\n var enalbleDisable = '';\\r\\n if (HeartRateStatus.substring(0, 1) == '1') {\\r\\n var hrate = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var hrate = 'Disable, '\\r\\n };\\r\\n var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n hrate += detectingInterval;\\r\\n AddValue(codeValues, \\\"hrate\\\", hrate);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings);\\r\\n configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\r\\n break;\\r\\n case '47': // Custom Id\\r\\n imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;ACK-CUSTID;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"customeid\\\", value);\\r\\n AddValue(configsToUpdate, configIds.ReadState.CustomId, hex_to_ascii(value)); //now it comes \\\"3036\\\"\\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 // commented until Eview fixes this function\\r\\n /*\\r\\n messageForReceiver = (`Watch;ACK-NOMOTION;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"nomotion\\\", alertSetting);\\r\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings, enableDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n configsToAck.push(configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings);\\r\\n configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n */\\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 = (`Watch;ACK-FALLALERT;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n var sesibityOptionValue = hexToDecimal(value.substring(1, 2));\\r\\n sensibility += sesibityOptionValue;\\r\\n AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n //AddValue(configsToUpdate, configIds.ReadAlertSettings.FallSettings, sensibility);\\r\\n AddValue(configsToUpdate, configIds.ReadFallSettings.EnableDisableFallSettings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadFallSettings.Sensitivity, sesibityOptionValue);\\r\\n //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n configsToAck.push(configIds.ReadFallSettings.EnableDisableFallSettings);\\r\\n configsToAck.push(configIds.ReadFallSettings.Sensitivity);\\r\\n break;\\r\\n case '73': //BeaconList\\r\\n var beaconNumber = hexToDecimal(value.substring(1, 2));\\r\\n var beaconStatus = hex2bin(value.substring(0, 1));\\r\\n beaconStatus = hex_to_ascii(value.substring(30, value.length));\\r\\n //beaconStatus = changeEndianness(value.substring(30, value.length));\\r\\n //homeBeacon += 'B' + (beaconNumber + 1) + ': ' + beaconStatus + ', ';\\r\\n homeBeacon += beaconStatus + ', ';\\r\\n AddValue(codeValues, \\\"homeBeacon\\\", homeBeacon);\\r\\n messageForReceiver = (`Watch;ACK-GDATA;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n break;\\r\\n case '4A': //Wifi Network List\\r\\n var wifiSSIDLenght = hexToDecimal(value.substring(2, 4));\\r\\n var wifiPasswordLenght = hexToDecimal(value.substring(4, 6));\\r\\n var wifiIndex = hexToDecimal(value.substring(1, 2));\\r\\n //var wifiStatus = hexToDecimal(value.substring(0, 1));\\r\\n var wifiStatus = value.substring(0, 1);\\r\\n /*var enalbleDisable = wifiSSID = wifiPassword = homeWifi = '';\\r\\n /var homeWifi = '';\\r\\n if (wifiIndex == '0') { // Only first Wifi of the list\\r\\n if (wifiStatus == '8') {\\r\\n homeWifi += ' Enable, '\\r\\n enalbleDisable = '1';\\r\\n } else {\\r\\n homeWifi += ' Disable, '\\r\\n //enalbleDisable = '0';\\r\\n };*/\\r\\n if ((wifiStatus == '8') || (wifiStatus == 'C')) { // 8 == ON OR C== ON and Connected\\r\\n var wifiSSID = hex_to_ascii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\r\\n var wifiPassword = hex_to_ascii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\r\\n var imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;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 = (`Watch;ACK-SPEED;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"speed\\\", alertSetting);\\r\\n AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\r\\n configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n break;\\r\\n case '7A': //[Length]:05 [Key]:7A [Value]:60 54 00 80\\r\\n // {\\\"spo2Interval\\\":{\\\"interval\\\":21600,\\\"status\\\":1}}\\r\\n var SPOStatus = hex2bin(value.substring(6, 8));\\r\\n var enalbleDisable = '';\\r\\n if (SPOStatus.substring(0, 1) == '1') {\\r\\n var spo = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var spo = 'Disable, '\\r\\n };\\r\\n var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n spo += detectingInterval;\\r\\n AddValue(codeValues, \\\"SPO2\\\", spo);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadSPO2Settings.EnableDisableReadSPO2Settings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadSPO2Settings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadSPO2Settings.EnableDisableReadSPO2Settings);\\r\\n configsToAck.push(configIds.ReadSPO2Settings.ReportingFrequency);\\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 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 = (`Watch-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 = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch-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 if (typeof configIds !== 'undefined' && configIds && configIds.ConfigureDevice && configIds.ConfigureDevice.LastConfigured) { // when is defined\\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 }\\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(hex) { // Hex to Ascii \\r\\n if (hex.length % 2 !== 0) {\\r\\n throw new Error(\\\"Hex string length must be even\\\");\\r\\n }\\r\\n let ascii = '';\\r\\n for (let i = 0; i < hex.length; i += 2) {\\r\\n const byte = hex.substr(i, 2);\\r\\n const charCode = parseInt(byte, 16);\\r\\n if (charCode !== 0) { // remove null character (\\\\u0000)\\r\\n ascii += String.fromCharCode(charCode);\\r\\n }\\r\\n }\\r\\n return ascii;\\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 normalizeLabels(raw) { // output labels as array\\r\\n if (raw == null) return [];\\r\\n if (Array.isArray(raw)) return raw;\\r\\n // Si en algún momento vinieran varias labels separadas por coma o ;\\r\\n return String(raw).split(/[;,]/).map(s => s.trim()).filter(Boolean);\\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":1765481426},{"Type":1,"NewValue":"{\"Id\":437,\"Name\":\"Access TEC Care Watch\",\"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 // Watch protocol - please see variables and typical values in order below\\r\\n // Watch-CYC;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;SIGNAL=<>;WM=<>;GENERAL=<>\\r\\n // Watch-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\r\\n //\\r\\n // Author: Juanmi Navarro\\r\\n // Created: 01/01/0000\\r\\n // Last modified: 18/09/2025\\r\\n //\\r\\n ///////////////////////////////////////////////////////////////////////////////\\r\\n if (typeof localTesting === \\\"undefined\\\") {\\r\\n let localTesting = false;\\r\\n }\\r\\n const crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,\\r\\n 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,\\r\\n 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,\\r\\n 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,\\r\\n 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,\\r\\n 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,\\r\\n 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,\\r\\n 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,\\r\\n 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,\\r\\n 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,\\r\\n 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,\\r\\n 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,\\r\\n 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,\\r\\n 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,\\r\\n 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,\\r\\n 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,\\r\\n 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,\\r\\n 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,\\r\\n 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,\\r\\n 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,\\r\\n 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,\\r\\n 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n ];\\r\\n var codeValues = [];\\r\\n AddValue(codeValues, 'protocol_template', 'Watch');\\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 = (`Watch-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 var allowedCID = ['3036', '06'];\\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 } else if (oystaTemplate == 'True') { // Oysta Template \\r\\n AddValue(codeValues, 'rawMsg', raw);\\r\\n if ((params.rawlabel) && (params.rawlabel !== '')) { // decode label if exists\\r\\n //var labels = normalizeLabels(params.rawlabel); // \\\"steps\\\" -> [\\\"steps\\\"]\\r\\n AddValue(codeValues, 'oysta_labels', params.rawlabel);\\r\\n }\\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 //<>,<>,<> \\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];\\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 //<>,<>,<> \\r\\n if (mac2) {\\r\\n AddValue(codeValues, 'beacon_mac', mac2);\\r\\n var simpleQuery2 = [{\\r\\n 'code': 'Mac',\\r\\n 'value': mac2,\\r\\n }];\\r\\n var simpleQueryLabel2 = {\\r\\n 'table': 'beacons',\\r\\n 'select': 'Name',\\r\\n 'query': simpleQuery2\\r\\n };\\r\\n var labels2 = [];\\r\\n labels2.push(JSON.stringify(simpleQueryLabel2));\\r\\n AddValue(codeValues, 'oysta_labels', JSON.stringify(labels2));\\r\\n }\\r\\n if (params.beacon_major) {\\r\\n AddValue(codeValues, 'beacon_major', params.beacon_major);\\r\\n } else {\\r\\n AddValue(codeValues, 'beacon_major', 0);\\r\\n }\\r\\n if (params.beacon_minor) {\\r\\n AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\r\\n } else {\\r\\n AddValue(codeValues, 'beacon_minor', 0);\\r\\n }\\r\\n //AddValue(codeValues,'oysta_labels', label);\\r\\n //AddValue(codeValues,'oysta_value', mac);\\r\\n }\\r\\n /* meter mas tarde... \\r\\n if (params.smart_data !== 'undefined') {\\r\\n var gen_location = params.smart_data.split(',')\\r\\n var latitude = gen_location[0]\\r\\n var longitude = gen_location[1]\\r\\n var location_accuracy = gen_location[2]\\r\\n var altitude = gen_location[3]\\r\\n AddValue(codeValues,'latitude', latitude);\\r\\n AddValue(codeValues,'longitude', longitude);\\r\\n AddValue(codeValues,'altitude', altitude);\\r\\n AddValue(codeValues,'location_accuracy', location_accuracy);\\r\\n }\\r\\n */\\r\\n /*else if ((params.event_time) && (params.event_time == '')) {\\r\\n var event_time = moment.utc().unix();\\r\\n AddValue(codeValues,'event_time', event_time);\\r\\n } revisar mas adelante*/\\r\\n if (params.location_time) {\\r\\n AddValue(codeValues, 'location_time', params.location_time);\\r\\n }\\r\\n if (params.event_time) {\\r\\n AddValue(codeValues, 'event_time', params.event_time);\\r\\n }\\r\\n // to parse SMS info from the device\\r\\n switch (messageTypeLocalCode) {\\r\\n case 'COMM-SMS': // SMS message sent in\\r\\n if (params.data.startsWith('Device location request')) {\\r\\n configsToAck.push(configIds.Controls.RealTimeLocate);\\r\\n } else if (params.data.startsWith('Set IP ok')) {\\r\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n } else if (params.data.startsWith('IMEI:')) {\\r\\n configsToAck.push(configIds.Controls.GetFirmwareVersion);\\r\\n } else if (params.data.startsWith('Set IP ok')) {\\r\\n configsToAck.push(configIds.Controls.ClearBufferedMessages);\\r\\n } else if (params.data.startsWith('flush ok')) {\\r\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n } else if (params.data.startsWith('Set Watch-')) {\\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 = (`Watch-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 = (`Watch;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 = (`Watch;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 = (`Watch-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 // decode global msg\\r\\n function decoder(str) { // decode rawdata\\r\\n // CARE Decoder\\r\\n //AddValue(codeValues, 'Message : ', str);\\r\\n var message = str;\\r\\n var index = 18;\\r\\n //parse header & properties\\r\\n var properties = message.substring(2, 4);\\r\\n var lengthLittleEndian = message.substring(4, 8);\\r\\n var total_length = lengthLittleEndian.substring(2, 4) + lengthLittleEndian.substring(0, 2);\\r\\n total_length = 2 * hexToDecimal(total_length.substring(0, 4));\\r\\n var sequenceID = message.substring(12, 16);\\r\\n var command = message.substring(16, 18);\\r\\n //mask bitwise (properties should be '10')\\r\\n if ((parseInt(properties) & 8) == 8) {\\r\\n needsAck = true;\\r\\n } else needsAck = false;\\r\\n // need to check if checksum is correct for possible msg corruption 10/03/23\\r\\n var checksum = message.substring(8, 12);\\r\\n var messageBody = message.substring(16, message.length);\\r\\n debug('message =' + message);\\r\\n debug('checksum =' + checksum);\\r\\n debug('calculateCheckSum =' + calculateCheckSum(messageBody));\\r\\n if (calculateCheckSum(messageBody) == checksum) { // payload is valid\\r\\n debug(\\\"message has valid checksum\\\");\\r\\n var messageBody = command; // update value for the ACK\\r\\n debug('command =' + command);\\r\\n if (command == '01') {\\r\\n while (index < total_length + 16) {\\r\\n 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\\r\\n if ((alarmCodeExtInt & 1) == 1) {\\r\\n var alarm = 'ALF-C';\\r\\n }\\r\\n // Welfare Check-out\\r\\n else if ((alarmCodeExtInt & 2) == 2) {\\r\\n var alarm = 'ALA-C';\\r\\n }\\r\\n // Standard Alerts\\r\\n //Battery low\\r\\n else if ((alarmCodeInt & 1) == 1) {\\r\\n var alarm = 'BATL';\\r\\n }\\r\\n //Overspeed\\r\\n else if ((alarmCodeInt & 2) == 2) {\\r\\n var alarm = 'ALSP';\\r\\n }\\r\\n //Fall\\r\\n else if ((alarmCodeInt & 4) == 4) {\\r\\n var alarm = 'ALF';\\r\\n }\\r\\n //Tilt\\r\\n else if ((alarmCodeInt & 8) == 8) {\\r\\n var alarm = 'TLT';\\r\\n } else if ((alarmCodeInt & 16) == 16) {\\r\\n if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n var alarm = 'Geo1-IN';\\r\\n } else {\\r\\n var alarm = 'Geo1-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 32) == 32) {\\r\\n if ((alarmCodeInt & 33554432) == 33554432) {\\r\\n var alarm = 'Geo2-IN';\\r\\n } else {\\r\\n var alarm = 'Geo2-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 64) == 64) {\\r\\n if ((alarmCodeInt & 67108864) == 67108864) {\\r\\n var alarm = 'Geo3-IN';\\r\\n } else {\\r\\n var alarm = 'Geo3-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 128) == 128) {\\r\\n if ((alarmCodeInt & 134217728) == 134217728) {\\r\\n var alarm = 'Geo4-IN';\\r\\n } else {\\r\\n var alarm = 'Geo4-OUT';\\r\\n }\\r\\n }\\r\\n //Power Off\\r\\n else if ((alarmCodeInt & 256) == 256) {\\r\\n var alarm = 'PWRF';\\r\\n }\\r\\n //Power On\\r\\n else if ((alarmCodeInt & 512) == 512) {\\r\\n var alarm = 'PWRN';\\r\\n }\\r\\n //Motion\\r\\n else if ((alarmCodeInt & 1024) == 1024) {\\r\\n var alarm = 'ALMOV';\\r\\n }\\r\\n //No Motion\\r\\n else if ((alarmCodeInt & 2048) == 2048) {\\r\\n var alarm = 'ALNM';\\r\\n }\\r\\n //SOS\\r\\n else if ((alarmCodeInt & 4096) == 4096) {\\r\\n var alarm = 'ALSOS';\\r\\n } else if ((alarmCodeInt & 8192) == 8192) {\\r\\n var alarm = 'Side1';\\r\\n } else if ((alarmCodeInt & 16384) == 16384) {\\r\\n var alarm = 'Side2';\\r\\n }\\r\\n //Battery charging\\r\\n else if ((alarmCodeInt & 32768) == 32768) {\\r\\n var alarm = 'BATCN';\\r\\n }\\r\\n //Battery no charging\\r\\n else if ((alarmCodeInt & 65536) == 65536) {\\r\\n var alarm = 'BATCF';\\r\\n }\\r\\n //SOS Ending\\r\\n // Temporary Commented until we know exactly how it works. 22/09/2022\\r\\n else if ((alarmCodeInt & 131072) == 131072) {\\r\\n var alarm = 'ALA-F';\\r\\n info = 'Alarm Finished';\\r\\n }\\r\\n //Amber Alert EC03 only\\r\\n else if ((alarmCodeInt & 262144) == 262144) {\\r\\n var alarm = 'ALA';\\r\\n }\\r\\n // welfare Alert check-in ALA-O\\r\\n else if ((alarmCodeInt & 524288) == 524288) {\\r\\n var alarm = 'ALA-O';\\r\\n }\\r\\n // Amber alert Ending ALA-C\\r\\n else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n var alarm = 'ALA-C';\\r\\n }\\r\\n // Amber alert Ending ALA-C\\r\\n //else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n // var alarm = 'ALA-C';\\r\\n //}\\r\\n // Fall-Down Alert ending\\r\\n else if ((alarmCodeInt & 2097152) == 2097152) {\\r\\n var alarm = 'ALF-C';\\r\\n }\\r\\n // welfare Alert Ending ALA\\r\\n else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n var alarm = 'ALA';\\r\\n }\\r\\n // Beacon absent Alert 11/10/22. Need to be added in msg types\\r\\n //else if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n // var alarm = 'BEA';\\r\\n //}\\r\\n general += 'alarm:' + alarm + ',';\\r\\n break;\\r\\n //Custom ID\\r\\n case '03':\\r\\n customID = value;\\r\\n if (!allowedCID.includes(value)) {\\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 //<>,<>,<>,<>,<>\\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 if (!allowedCID.includes(customID)) {\\r\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n AddValue(codeValues, \\\"customID\\\", customID);\\r\\n return\\r\\n }\\r\\n if (statusDevice) {\\r\\n messageForReceiver = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n }\\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;\\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 }\\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 = 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 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 var rawlabel = 'steps';\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=${rawlabel}`);\\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 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 var rawlabel = 'bpm';\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=${rawlabel}`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n }\\r\\n break;\\r\\n // SPO2\\r\\n case '41':\\r\\n var numSPO = (keyLength - 2) / 12;\\r\\n for (let j = 0; j < numSPO; 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 SPOHex = value.substring(8, 10);\\r\\n var SPO = hexToDecimal(SPOHex);\\r\\n var trustLevelHex = value.substring(10, 12);\\r\\n var trustLevel = hexToDecimal(trustLevelHex);\\r\\n info = SPO;\\r\\n //var alarmCode = 'True';\\r\\n var alarm = 'SPO2';\\r\\n general += ' SPO2 rate' + j + ':' + SPO + ',';\\r\\n var rawlabel = '%';\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};SPO2=${info};TLEVEL=${trustLevel};LABEL=${rawlabel}`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n }\\r\\n break;\\r\\n //BLE Connected . For Flic button\\r\\n case '62':\\r\\n location_type = 'BLE';\\r\\n //var alarm = 'EBZI'; \\r\\n //var latitudeHex = '00';\\r\\n //var longitudeHex = '00';\\r\\n //var descr = 'empty';\\r\\n var flag = hexToDecimal(value.substring(0, 2)); // 0= Disconnected, 1= Connected\\r\\n var mac = value.substring(2, 14); // No hace falta darle la vuelta\\r\\n // add : format in MAC\\r\\n mac = mac.match(/.{1,2}/g).join(':');\\r\\n var batLevel = hexToDecimal(value.substring(14, 16)); // 0-100\\r\\n //location_time = timestamp;\\r\\n ble_data = `${flag},${batLevel},${mac}`;\\r\\n general += 'BLE location (State):' + flag + ', (bat):' + batLevel + ', (mac):' + mac + ',';\\r\\n break;\\r\\n }\\r\\n }\\r\\n if (alarmCode) {\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch;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 = (`Watch;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': // Ringer Volume\\r\\n var volume = hexToDecimal(value);\\r\\n imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;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 = (`Watch;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 '0F': // Enable control.... Used for STEP COUNTING SETTINGS\\r\\n // 'FF FF 21 80'\\r\\n var StepStatus = hex2bin(value.substring(4, 6));\\r\\n var enalbleDisable = '';\\r\\n if (StepStatus.substring(7, 8) == '1') {\\r\\n var step = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var step = 'Disable, '\\r\\n };\\r\\n //var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n //hrate += detectingInterval;\\r\\n AddValue(codeValues, \\\"step\\\", step);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadStepsSettings.EnableDisableReadStepsSettings, enalbleDisable);\\r\\n //AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadStepsSettings.EnableDisableReadStepsSettings);\\r\\n //configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\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 = (`Watch;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 '34': //ContactList with name\\r\\n var contactNumber = value.substring(1, 2);\\r\\n var telLength = hexToDecimal(value.substring(2, 4));\\r\\n var tel = '';\\r\\n switch (contactNumber) {\\r\\n // Emergency Number\\r\\n case '0':\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n break;\\r\\n // Speed Dial Number\\r\\n //case '1':\\r\\n // tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n // AddValue(codeValues, \\\"SpeedDialNumber\\\", tel);\\r\\n // AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.SpeedDialNumber, tel);\\r\\n // configsToAck.push(configIds.ReadSpeedDialSettings.SpeedDialNumber);\\r\\n // break;\\r\\n // Gateway Number\\r\\n case '9': //00447781482635,Esendex UK 0034627177148,Esendex Spain 00447507288240,Esendex UK Acceptance\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n if (tel.includes('447781482635') || tel.includes('00447781482635')) {\\r\\n tel = 'Esendex UK'\\r\\n } else if (tel.includes('34627177148') || tel.includes('0034627177148')) {\\r\\n tel = 'Esendex Spain'\\r\\n } else if (tel.includes('447507288240') || tel.includes('00447507288240')) {\\r\\n tel = 'Esendex UK Acceptance'\\r\\n } else {\\r\\n tel = 'Default'\\r\\n }\\r\\n AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n break;\\r\\n default:\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n if (tel.length < 6) {\\r\\n contacts += '';\\r\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n break;\\r\\n }\\r\\n //contacts += 'A' + (contactNumber - 1) + ': ' + tel + ', ';\\r\\n contacts += tel + ', ';\\r\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n break;\\r\\n }\\r\\n break;\\r\\n case '40': // APN\\r\\n //no ACK need\\r\\n AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'));\\r\\n configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\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 = (`Watch;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 = (`Watch;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 '46': //HeartRate\\r\\n // '10 0E 00 80'\\r\\n var HeartRateStatus = hex2bin(value.substring(6, 8));\\r\\n var enalbleDisable = '';\\r\\n if (HeartRateStatus.substring(0, 1) == '1') {\\r\\n var hrate = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var hrate = 'Disable, '\\r\\n };\\r\\n var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n hrate += detectingInterval;\\r\\n AddValue(codeValues, \\\"hrate\\\", hrate);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings);\\r\\n configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\r\\n break;\\r\\n case '47': // Custom Id\\r\\n imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;ACK-CUSTID;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"customeid\\\", value);\\r\\n AddValue(configsToUpdate, configIds.ReadState.CustomId, hex_to_ascii(value)); //now it comes \\\"3036\\\"\\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 // commented until Eview fixes this function\\r\\n /*\\r\\n messageForReceiver = (`Watch;ACK-NOMOTION;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"nomotion\\\", alertSetting);\\r\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings, enableDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n configsToAck.push(configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings);\\r\\n configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n */\\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 = (`Watch;ACK-FALLALERT;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n var sesibityOptionValue = hexToDecimal(value.substring(1, 2));\\r\\n sensibility += sesibityOptionValue;\\r\\n AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n //AddValue(configsToUpdate, configIds.ReadAlertSettings.FallSettings, sensibility);\\r\\n AddValue(configsToUpdate, configIds.ReadFallSettings.EnableDisableFallSettings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadFallSettings.Sensitivity, sesibityOptionValue);\\r\\n //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n configsToAck.push(configIds.ReadFallSettings.EnableDisableFallSettings);\\r\\n configsToAck.push(configIds.ReadFallSettings.Sensitivity);\\r\\n break;\\r\\n case '73': //BeaconList\\r\\n var beaconNumber = hexToDecimal(value.substring(1, 2));\\r\\n var beaconStatus = hex2bin(value.substring(0, 1));\\r\\n beaconStatus = hex_to_ascii(value.substring(30, value.length));\\r\\n //beaconStatus = changeEndianness(value.substring(30, value.length));\\r\\n //homeBeacon += 'B' + (beaconNumber + 1) + ': ' + beaconStatus + ', ';\\r\\n homeBeacon += beaconStatus + ', ';\\r\\n AddValue(codeValues, \\\"homeBeacon\\\", homeBeacon);\\r\\n messageForReceiver = (`Watch;ACK-GDATA;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n break;\\r\\n case '4A': //Wifi Network List\\r\\n var wifiSSIDLenght = hexToDecimal(value.substring(2, 4));\\r\\n var wifiPasswordLenght = hexToDecimal(value.substring(4, 6));\\r\\n var wifiIndex = hexToDecimal(value.substring(1, 2));\\r\\n //var wifiStatus = hexToDecimal(value.substring(0, 1));\\r\\n var wifiStatus = value.substring(0, 1);\\r\\n /*var enalbleDisable = wifiSSID = wifiPassword = homeWifi = '';\\r\\n /var homeWifi = '';\\r\\n if (wifiIndex == '0') { // Only first Wifi of the list\\r\\n if (wifiStatus == '8') {\\r\\n homeWifi += ' Enable, '\\r\\n enalbleDisable = '1';\\r\\n } else {\\r\\n homeWifi += ' Disable, '\\r\\n //enalbleDisable = '0';\\r\\n };*/\\r\\n if ((wifiStatus == '8') || (wifiStatus == 'C')) { // 8 == ON OR C== ON and Connected\\r\\n var wifiSSID = hex_to_ascii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\r\\n var wifiPassword = hex_to_ascii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\r\\n var imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;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 = (`Watch;ACK-SPEED;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"speed\\\", alertSetting);\\r\\n AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\r\\n configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n break;\\r\\n case '7A': //[Length]:05 [Key]:7A [Value]:60 54 00 80\\r\\n // {\\\"spo2Interval\\\":{\\\"interval\\\":21600,\\\"status\\\":1}}\\r\\n var SPOStatus = hex2bin(value.substring(6, 8));\\r\\n var enalbleDisable = '';\\r\\n if (SPOStatus.substring(0, 1) == '1') {\\r\\n var spo = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var spo = 'Disable, '\\r\\n };\\r\\n var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n spo += detectingInterval;\\r\\n AddValue(codeValues, \\\"SPO2\\\", spo);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadSPO2Settings.EnableDisableReadSPO2Settings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadSPO2Settings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadSPO2Settings.EnableDisableReadSPO2Settings);\\r\\n configsToAck.push(configIds.ReadSPO2Settings.ReportingFrequency);\\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 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 = (`Watch-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 = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch-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 if (typeof configIds !== 'undefined' && configIds && configIds.ConfigureDevice && configIds.ConfigureDevice.LastConfigured) { // when is defined\\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 }\\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(hex) { // Hex to Ascii \\r\\n if (hex.length % 2 !== 0) {\\r\\n throw new Error(\\\"Hex string length must be even\\\");\\r\\n }\\r\\n let ascii = '';\\r\\n for (let i = 0; i < hex.length; i += 2) {\\r\\n const byte = hex.substr(i, 2);\\r\\n const charCode = parseInt(byte, 16);\\r\\n if (charCode !== 0) { // remove null character (\\\\u0000)\\r\\n ascii += String.fromCharCode(charCode);\\r\\n }\\r\\n }\\r\\n return ascii;\\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 normalizeLabels(raw) { // output labels as array\\r\\n if (raw == null) return [];\\r\\n if (Array.isArray(raw)) return raw;\\r\\n // Si en algún momento vinieran varias labels separadas por coma o ;\\r\\n return String(raw).split(/[;,]/).map(s => s.trim()).filter(Boolean);\\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":1765482205},{"Type":1,"NewValue":"{\"Id\":437,\"Name\":\"Access TEC Care Watch\",\"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 // Watch protocol - please see variables and typical values in order below\\r\\n // Watch-CYC;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;SIGNAL=<>;WM=<>;GENERAL=<>\\r\\n // Watch-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\r\\n //\\r\\n // Author: Juanmi Navarro\\r\\n // Created: 01/01/0000\\r\\n // Last modified: 18/09/2025\\r\\n //\\r\\n ///////////////////////////////////////////////////////////////////////////////\\r\\n if (typeof localTesting === \\\"undefined\\\") {\\r\\n let localTesting = false;\\r\\n }\\r\\n const crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,\\r\\n 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,\\r\\n 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,\\r\\n 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,\\r\\n 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,\\r\\n 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,\\r\\n 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,\\r\\n 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,\\r\\n 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,\\r\\n 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,\\r\\n 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,\\r\\n 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,\\r\\n 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,\\r\\n 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,\\r\\n 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,\\r\\n 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,\\r\\n 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,\\r\\n 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,\\r\\n 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,\\r\\n 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,\\r\\n 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,\\r\\n 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n ];\\r\\n var codeValues = [];\\r\\n AddValue(codeValues, 'protocol_template', 'Watch');\\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 = (`Watch-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 var allowedCID = ['3036', '06'];\\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 } else if (oystaTemplate == 'True') { // Oysta Template \\r\\n AddValue(codeValues, 'rawMsg', raw);\\r\\n if ((params.rawlabel) && (params.rawlabel !== '')) { // decode label if exists\\r\\n //var labels = normalizeLabels(params.rawlabel); // \\\"steps\\\" -> [\\\"steps\\\"]\\r\\n //AddValue(codeValues, 'oysta_labels', params.rawlabel);\\r\\n AddValue(codeValues, 'oysta_labels', `['${params.rawlabel}]'`);\\r\\n }\\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 //<>,<>,<> \\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];\\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 //<>,<>,<> \\r\\n if (mac2) {\\r\\n AddValue(codeValues, 'beacon_mac', mac2);\\r\\n var simpleQuery2 = [{\\r\\n 'code': 'Mac',\\r\\n 'value': mac2,\\r\\n }];\\r\\n var simpleQueryLabel2 = {\\r\\n 'table': 'beacons',\\r\\n 'select': 'Name',\\r\\n 'query': simpleQuery2\\r\\n };\\r\\n var labels2 = [];\\r\\n labels2.push(JSON.stringify(simpleQueryLabel2));\\r\\n AddValue(codeValues, 'oysta_labels', JSON.stringify(labels2));\\r\\n }\\r\\n if (params.beacon_major) {\\r\\n AddValue(codeValues, 'beacon_major', params.beacon_major);\\r\\n } else {\\r\\n AddValue(codeValues, 'beacon_major', 0);\\r\\n }\\r\\n if (params.beacon_minor) {\\r\\n AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\r\\n } else {\\r\\n AddValue(codeValues, 'beacon_minor', 0);\\r\\n }\\r\\n //AddValue(codeValues,'oysta_labels', label);\\r\\n //AddValue(codeValues,'oysta_value', mac);\\r\\n }\\r\\n /* meter mas tarde... \\r\\n if (params.smart_data !== 'undefined') {\\r\\n var gen_location = params.smart_data.split(',')\\r\\n var latitude = gen_location[0]\\r\\n var longitude = gen_location[1]\\r\\n var location_accuracy = gen_location[2]\\r\\n var altitude = gen_location[3]\\r\\n AddValue(codeValues,'latitude', latitude);\\r\\n AddValue(codeValues,'longitude', longitude);\\r\\n AddValue(codeValues,'altitude', altitude);\\r\\n AddValue(codeValues,'location_accuracy', location_accuracy);\\r\\n }\\r\\n */\\r\\n /*else if ((params.event_time) && (params.event_time == '')) {\\r\\n var event_time = moment.utc().unix();\\r\\n AddValue(codeValues,'event_time', event_time);\\r\\n } revisar mas adelante*/\\r\\n if (params.location_time) {\\r\\n AddValue(codeValues, 'location_time', params.location_time);\\r\\n }\\r\\n if (params.event_time) {\\r\\n AddValue(codeValues, 'event_time', params.event_time);\\r\\n }\\r\\n // to parse SMS info from the device\\r\\n switch (messageTypeLocalCode) {\\r\\n case 'COMM-SMS': // SMS message sent in\\r\\n if (params.data.startsWith('Device location request')) {\\r\\n configsToAck.push(configIds.Controls.RealTimeLocate);\\r\\n } else if (params.data.startsWith('Set IP ok')) {\\r\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n } else if (params.data.startsWith('IMEI:')) {\\r\\n configsToAck.push(configIds.Controls.GetFirmwareVersion);\\r\\n } else if (params.data.startsWith('Set IP ok')) {\\r\\n configsToAck.push(configIds.Controls.ClearBufferedMessages);\\r\\n } else if (params.data.startsWith('flush ok')) {\\r\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n } else if (params.data.startsWith('Set Watch-')) {\\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 = (`Watch-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 = (`Watch;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 = (`Watch;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 = (`Watch-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 // decode global msg\\r\\n function decoder(str) { // decode rawdata\\r\\n // CARE Decoder\\r\\n //AddValue(codeValues, 'Message : ', str);\\r\\n var message = str;\\r\\n var index = 18;\\r\\n //parse header & properties\\r\\n var properties = message.substring(2, 4);\\r\\n var lengthLittleEndian = message.substring(4, 8);\\r\\n var total_length = lengthLittleEndian.substring(2, 4) + lengthLittleEndian.substring(0, 2);\\r\\n total_length = 2 * hexToDecimal(total_length.substring(0, 4));\\r\\n var sequenceID = message.substring(12, 16);\\r\\n var command = message.substring(16, 18);\\r\\n //mask bitwise (properties should be '10')\\r\\n if ((parseInt(properties) & 8) == 8) {\\r\\n needsAck = true;\\r\\n } else needsAck = false;\\r\\n // need to check if checksum is correct for possible msg corruption 10/03/23\\r\\n var checksum = message.substring(8, 12);\\r\\n var messageBody = message.substring(16, message.length);\\r\\n debug('message =' + message);\\r\\n debug('checksum =' + checksum);\\r\\n debug('calculateCheckSum =' + calculateCheckSum(messageBody));\\r\\n if (calculateCheckSum(messageBody) == checksum) { // payload is valid\\r\\n debug(\\\"message has valid checksum\\\");\\r\\n var messageBody = command; // update value for the ACK\\r\\n debug('command =' + command);\\r\\n if (command == '01') {\\r\\n while (index < total_length + 16) {\\r\\n 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\\r\\n if ((alarmCodeExtInt & 1) == 1) {\\r\\n var alarm = 'ALF-C';\\r\\n }\\r\\n // Welfare Check-out\\r\\n else if ((alarmCodeExtInt & 2) == 2) {\\r\\n var alarm = 'ALA-C';\\r\\n }\\r\\n // Standard Alerts\\r\\n //Battery low\\r\\n else if ((alarmCodeInt & 1) == 1) {\\r\\n var alarm = 'BATL';\\r\\n }\\r\\n //Overspeed\\r\\n else if ((alarmCodeInt & 2) == 2) {\\r\\n var alarm = 'ALSP';\\r\\n }\\r\\n //Fall\\r\\n else if ((alarmCodeInt & 4) == 4) {\\r\\n var alarm = 'ALF';\\r\\n }\\r\\n //Tilt\\r\\n else if ((alarmCodeInt & 8) == 8) {\\r\\n var alarm = 'TLT';\\r\\n } else if ((alarmCodeInt & 16) == 16) {\\r\\n if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n var alarm = 'Geo1-IN';\\r\\n } else {\\r\\n var alarm = 'Geo1-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 32) == 32) {\\r\\n if ((alarmCodeInt & 33554432) == 33554432) {\\r\\n var alarm = 'Geo2-IN';\\r\\n } else {\\r\\n var alarm = 'Geo2-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 64) == 64) {\\r\\n if ((alarmCodeInt & 67108864) == 67108864) {\\r\\n var alarm = 'Geo3-IN';\\r\\n } else {\\r\\n var alarm = 'Geo3-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 128) == 128) {\\r\\n if ((alarmCodeInt & 134217728) == 134217728) {\\r\\n var alarm = 'Geo4-IN';\\r\\n } else {\\r\\n var alarm = 'Geo4-OUT';\\r\\n }\\r\\n }\\r\\n //Power Off\\r\\n else if ((alarmCodeInt & 256) == 256) {\\r\\n var alarm = 'PWRF';\\r\\n }\\r\\n //Power On\\r\\n else if ((alarmCodeInt & 512) == 512) {\\r\\n var alarm = 'PWRN';\\r\\n }\\r\\n //Motion\\r\\n else if ((alarmCodeInt & 1024) == 1024) {\\r\\n var alarm = 'ALMOV';\\r\\n }\\r\\n //No Motion\\r\\n else if ((alarmCodeInt & 2048) == 2048) {\\r\\n var alarm = 'ALNM';\\r\\n }\\r\\n //SOS\\r\\n else if ((alarmCodeInt & 4096) == 4096) {\\r\\n var alarm = 'ALSOS';\\r\\n } else if ((alarmCodeInt & 8192) == 8192) {\\r\\n var alarm = 'Side1';\\r\\n } else if ((alarmCodeInt & 16384) == 16384) {\\r\\n var alarm = 'Side2';\\r\\n }\\r\\n //Battery charging\\r\\n else if ((alarmCodeInt & 32768) == 32768) {\\r\\n var alarm = 'BATCN';\\r\\n }\\r\\n //Battery no charging\\r\\n else if ((alarmCodeInt & 65536) == 65536) {\\r\\n var alarm = 'BATCF';\\r\\n }\\r\\n //SOS Ending\\r\\n // Temporary Commented until we know exactly how it works. 22/09/2022\\r\\n else if ((alarmCodeInt & 131072) == 131072) {\\r\\n var alarm = 'ALA-F';\\r\\n info = 'Alarm Finished';\\r\\n }\\r\\n //Amber Alert EC03 only\\r\\n else if ((alarmCodeInt & 262144) == 262144) {\\r\\n var alarm = 'ALA';\\r\\n }\\r\\n // welfare Alert check-in ALA-O\\r\\n else if ((alarmCodeInt & 524288) == 524288) {\\r\\n var alarm = 'ALA-O';\\r\\n }\\r\\n // Amber alert Ending ALA-C\\r\\n else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n var alarm = 'ALA-C';\\r\\n }\\r\\n // Amber alert Ending ALA-C\\r\\n //else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n // var alarm = 'ALA-C';\\r\\n //}\\r\\n // Fall-Down Alert ending\\r\\n else if ((alarmCodeInt & 2097152) == 2097152) {\\r\\n var alarm = 'ALF-C';\\r\\n }\\r\\n // welfare Alert Ending ALA\\r\\n else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n var alarm = 'ALA';\\r\\n }\\r\\n // Beacon absent Alert 11/10/22. Need to be added in msg types\\r\\n //else if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n // var alarm = 'BEA';\\r\\n //}\\r\\n general += 'alarm:' + alarm + ',';\\r\\n break;\\r\\n //Custom ID\\r\\n case '03':\\r\\n customID = value;\\r\\n if (!allowedCID.includes(value)) {\\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 //<>,<>,<>,<>,<>\\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 if (!allowedCID.includes(customID)) {\\r\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n AddValue(codeValues, \\\"customID\\\", customID);\\r\\n return\\r\\n }\\r\\n if (statusDevice) {\\r\\n messageForReceiver = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n }\\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;\\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 }\\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 = 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 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 var rawlabel = 'steps';\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=${rawlabel}`);\\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 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 var rawlabel = 'bpm';\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=${rawlabel}`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n }\\r\\n break;\\r\\n // SPO2\\r\\n case '41':\\r\\n var numSPO = (keyLength - 2) / 12;\\r\\n for (let j = 0; j < numSPO; 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 SPOHex = value.substring(8, 10);\\r\\n var SPO = hexToDecimal(SPOHex);\\r\\n var trustLevelHex = value.substring(10, 12);\\r\\n var trustLevel = hexToDecimal(trustLevelHex);\\r\\n info = SPO;\\r\\n //var alarmCode = 'True';\\r\\n var alarm = 'SPO2';\\r\\n general += ' SPO2 rate' + j + ':' + SPO + ',';\\r\\n var rawlabel = '%';\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};SPO2=${info};TLEVEL=${trustLevel};LABEL=${rawlabel}`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n }\\r\\n break;\\r\\n //BLE Connected . For Flic button\\r\\n case '62':\\r\\n location_type = 'BLE';\\r\\n //var alarm = 'EBZI'; \\r\\n //var latitudeHex = '00';\\r\\n //var longitudeHex = '00';\\r\\n //var descr = 'empty';\\r\\n var flag = hexToDecimal(value.substring(0, 2)); // 0= Disconnected, 1= Connected\\r\\n var mac = value.substring(2, 14); // No hace falta darle la vuelta\\r\\n // add : format in MAC\\r\\n mac = mac.match(/.{1,2}/g).join(':');\\r\\n var batLevel = hexToDecimal(value.substring(14, 16)); // 0-100\\r\\n //location_time = timestamp;\\r\\n ble_data = `${flag},${batLevel},${mac}`;\\r\\n general += 'BLE location (State):' + flag + ', (bat):' + batLevel + ', (mac):' + mac + ',';\\r\\n break;\\r\\n }\\r\\n }\\r\\n if (alarmCode) {\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch;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 = (`Watch;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': // Ringer Volume\\r\\n var volume = hexToDecimal(value);\\r\\n imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;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 = (`Watch;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 '0F': // Enable control.... Used for STEP COUNTING SETTINGS\\r\\n // 'FF FF 21 80'\\r\\n var StepStatus = hex2bin(value.substring(4, 6));\\r\\n var enalbleDisable = '';\\r\\n if (StepStatus.substring(7, 8) == '1') {\\r\\n var step = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var step = 'Disable, '\\r\\n };\\r\\n //var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n //hrate += detectingInterval;\\r\\n AddValue(codeValues, \\\"step\\\", step);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadStepsSettings.EnableDisableReadStepsSettings, enalbleDisable);\\r\\n //AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadStepsSettings.EnableDisableReadStepsSettings);\\r\\n //configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\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 = (`Watch;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 '34': //ContactList with name\\r\\n var contactNumber = value.substring(1, 2);\\r\\n var telLength = hexToDecimal(value.substring(2, 4));\\r\\n var tel = '';\\r\\n switch (contactNumber) {\\r\\n // Emergency Number\\r\\n case '0':\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n break;\\r\\n // Speed Dial Number\\r\\n //case '1':\\r\\n // tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n // AddValue(codeValues, \\\"SpeedDialNumber\\\", tel);\\r\\n // AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.SpeedDialNumber, tel);\\r\\n // configsToAck.push(configIds.ReadSpeedDialSettings.SpeedDialNumber);\\r\\n // break;\\r\\n // Gateway Number\\r\\n case '9': //00447781482635,Esendex UK 0034627177148,Esendex Spain 00447507288240,Esendex UK Acceptance\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n if (tel.includes('447781482635') || tel.includes('00447781482635')) {\\r\\n tel = 'Esendex UK'\\r\\n } else if (tel.includes('34627177148') || tel.includes('0034627177148')) {\\r\\n tel = 'Esendex Spain'\\r\\n } else if (tel.includes('447507288240') || tel.includes('00447507288240')) {\\r\\n tel = 'Esendex UK Acceptance'\\r\\n } else {\\r\\n tel = 'Default'\\r\\n }\\r\\n AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n break;\\r\\n default:\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n if (tel.length < 6) {\\r\\n contacts += '';\\r\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n break;\\r\\n }\\r\\n //contacts += 'A' + (contactNumber - 1) + ': ' + tel + ', ';\\r\\n contacts += tel + ', ';\\r\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n break;\\r\\n }\\r\\n break;\\r\\n case '40': // APN\\r\\n //no ACK need\\r\\n AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'));\\r\\n configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\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 = (`Watch;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 = (`Watch;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 '46': //HeartRate\\r\\n // '10 0E 00 80'\\r\\n var HeartRateStatus = hex2bin(value.substring(6, 8));\\r\\n var enalbleDisable = '';\\r\\n if (HeartRateStatus.substring(0, 1) == '1') {\\r\\n var hrate = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var hrate = 'Disable, '\\r\\n };\\r\\n var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n hrate += detectingInterval;\\r\\n AddValue(codeValues, \\\"hrate\\\", hrate);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings);\\r\\n configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\r\\n break;\\r\\n case '47': // Custom Id\\r\\n imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;ACK-CUSTID;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"customeid\\\", value);\\r\\n AddValue(configsToUpdate, configIds.ReadState.CustomId, hex_to_ascii(value)); //now it comes \\\"3036\\\"\\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 // commented until Eview fixes this function\\r\\n /*\\r\\n messageForReceiver = (`Watch;ACK-NOMOTION;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"nomotion\\\", alertSetting);\\r\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings, enableDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n configsToAck.push(configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings);\\r\\n configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n */\\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 = (`Watch;ACK-FALLALERT;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n var sesibityOptionValue = hexToDecimal(value.substring(1, 2));\\r\\n sensibility += sesibityOptionValue;\\r\\n AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n //AddValue(configsToUpdate, configIds.ReadAlertSettings.FallSettings, sensibility);\\r\\n AddValue(configsToUpdate, configIds.ReadFallSettings.EnableDisableFallSettings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadFallSettings.Sensitivity, sesibityOptionValue);\\r\\n //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n configsToAck.push(configIds.ReadFallSettings.EnableDisableFallSettings);\\r\\n configsToAck.push(configIds.ReadFallSettings.Sensitivity);\\r\\n break;\\r\\n case '73': //BeaconList\\r\\n var beaconNumber = hexToDecimal(value.substring(1, 2));\\r\\n var beaconStatus = hex2bin(value.substring(0, 1));\\r\\n beaconStatus = hex_to_ascii(value.substring(30, value.length));\\r\\n //beaconStatus = changeEndianness(value.substring(30, value.length));\\r\\n //homeBeacon += 'B' + (beaconNumber + 1) + ': ' + beaconStatus + ', ';\\r\\n homeBeacon += beaconStatus + ', ';\\r\\n AddValue(codeValues, \\\"homeBeacon\\\", homeBeacon);\\r\\n messageForReceiver = (`Watch;ACK-GDATA;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n break;\\r\\n case '4A': //Wifi Network List\\r\\n var wifiSSIDLenght = hexToDecimal(value.substring(2, 4));\\r\\n var wifiPasswordLenght = hexToDecimal(value.substring(4, 6));\\r\\n var wifiIndex = hexToDecimal(value.substring(1, 2));\\r\\n //var wifiStatus = hexToDecimal(value.substring(0, 1));\\r\\n var wifiStatus = value.substring(0, 1);\\r\\n /*var enalbleDisable = wifiSSID = wifiPassword = homeWifi = '';\\r\\n /var homeWifi = '';\\r\\n if (wifiIndex == '0') { // Only first Wifi of the list\\r\\n if (wifiStatus == '8') {\\r\\n homeWifi += ' Enable, '\\r\\n enalbleDisable = '1';\\r\\n } else {\\r\\n homeWifi += ' Disable, '\\r\\n //enalbleDisable = '0';\\r\\n };*/\\r\\n if ((wifiStatus == '8') || (wifiStatus == 'C')) { // 8 == ON OR C== ON and Connected\\r\\n var wifiSSID = hex_to_ascii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\r\\n var wifiPassword = hex_to_ascii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\r\\n var imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;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 = (`Watch;ACK-SPEED;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"speed\\\", alertSetting);\\r\\n AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\r\\n configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n break;\\r\\n case '7A': //[Length]:05 [Key]:7A [Value]:60 54 00 80\\r\\n // {\\\"spo2Interval\\\":{\\\"interval\\\":21600,\\\"status\\\":1}}\\r\\n var SPOStatus = hex2bin(value.substring(6, 8));\\r\\n var enalbleDisable = '';\\r\\n if (SPOStatus.substring(0, 1) == '1') {\\r\\n var spo = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var spo = 'Disable, '\\r\\n };\\r\\n var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n spo += detectingInterval;\\r\\n AddValue(codeValues, \\\"SPO2\\\", spo);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadSPO2Settings.EnableDisableReadSPO2Settings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadSPO2Settings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadSPO2Settings.EnableDisableReadSPO2Settings);\\r\\n configsToAck.push(configIds.ReadSPO2Settings.ReportingFrequency);\\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 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 = (`Watch-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 = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch-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 if (typeof configIds !== 'undefined' && configIds && configIds.ConfigureDevice && configIds.ConfigureDevice.LastConfigured) { // when is defined\\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 }\\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(hex) { // Hex to Ascii \\r\\n if (hex.length % 2 !== 0) {\\r\\n throw new Error(\\\"Hex string length must be even\\\");\\r\\n }\\r\\n let ascii = '';\\r\\n for (let i = 0; i < hex.length; i += 2) {\\r\\n const byte = hex.substr(i, 2);\\r\\n const charCode = parseInt(byte, 16);\\r\\n if (charCode !== 0) { // remove null character (\\\\u0000)\\r\\n ascii += String.fromCharCode(charCode);\\r\\n }\\r\\n }\\r\\n return ascii;\\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 normalizeLabels(raw) { // output labels as array\\r\\n if (raw == null) return [];\\r\\n if (Array.isArray(raw)) return raw;\\r\\n // Si en algún momento vinieran varias labels separadas por coma o ;\\r\\n return String(raw).split(/[;,]/).map(s => s.trim()).filter(Boolean);\\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":1765483605},{"Type":1,"NewValue":"{\"Id\":437,\"Name\":\"Access TEC Care Watch\",\"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 // Watch protocol - please see variables and typical values in order below\\r\\n // Watch-CYC;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;SIGNAL=<>;WM=<>;GENERAL=<>\\r\\n // Watch-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\r\\n //\\r\\n // Author: Juanmi Navarro\\r\\n // Created: 01/01/0000\\r\\n // Last modified: 18/09/2025\\r\\n //\\r\\n ///////////////////////////////////////////////////////////////////////////////\\r\\n if (typeof localTesting === \\\"undefined\\\") {\\r\\n let localTesting = false;\\r\\n }\\r\\n const crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,\\r\\n 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,\\r\\n 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,\\r\\n 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,\\r\\n 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,\\r\\n 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,\\r\\n 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,\\r\\n 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,\\r\\n 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,\\r\\n 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,\\r\\n 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,\\r\\n 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,\\r\\n 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,\\r\\n 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,\\r\\n 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,\\r\\n 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,\\r\\n 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,\\r\\n 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,\\r\\n 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,\\r\\n 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,\\r\\n 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,\\r\\n 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n ];\\r\\n var codeValues = [];\\r\\n AddValue(codeValues, 'protocol_template', 'Watch');\\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 = (`Watch-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 var allowedCID = ['3036', '06'];\\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 } else if (oystaTemplate == 'True') { // Oysta Template \\r\\n AddValue(codeValues, 'rawMsg', raw);\\r\\n if ((params.rawlabel) && (params.rawlabel !== '')) { // decode label if exists\\r\\n //var labels = normalizeLabels(params.rawlabel); // \\\"steps\\\" -> [\\\"steps\\\"]\\r\\n //AddValue(codeValues, 'oysta_labels', params.rawlabel);\\r\\n AddValue(codeValues, 'oysta_labels', `[${params.rawlabel}]`);\\r\\n }\\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 //<>,<>,<> \\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];\\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 //<>,<>,<> \\r\\n if (mac2) {\\r\\n AddValue(codeValues, 'beacon_mac', mac2);\\r\\n var simpleQuery2 = [{\\r\\n 'code': 'Mac',\\r\\n 'value': mac2,\\r\\n }];\\r\\n var simpleQueryLabel2 = {\\r\\n 'table': 'beacons',\\r\\n 'select': 'Name',\\r\\n 'query': simpleQuery2\\r\\n };\\r\\n var labels2 = [];\\r\\n labels2.push(JSON.stringify(simpleQueryLabel2));\\r\\n AddValue(codeValues, 'oysta_labels', JSON.stringify(labels2));\\r\\n }\\r\\n if (params.beacon_major) {\\r\\n AddValue(codeValues, 'beacon_major', params.beacon_major);\\r\\n } else {\\r\\n AddValue(codeValues, 'beacon_major', 0);\\r\\n }\\r\\n if (params.beacon_minor) {\\r\\n AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\r\\n } else {\\r\\n AddValue(codeValues, 'beacon_minor', 0);\\r\\n }\\r\\n //AddValue(codeValues,'oysta_labels', label);\\r\\n //AddValue(codeValues,'oysta_value', mac);\\r\\n }\\r\\n /* meter mas tarde... \\r\\n if (params.smart_data !== 'undefined') {\\r\\n var gen_location = params.smart_data.split(',')\\r\\n var latitude = gen_location[0]\\r\\n var longitude = gen_location[1]\\r\\n var location_accuracy = gen_location[2]\\r\\n var altitude = gen_location[3]\\r\\n AddValue(codeValues,'latitude', latitude);\\r\\n AddValue(codeValues,'longitude', longitude);\\r\\n AddValue(codeValues,'altitude', altitude);\\r\\n AddValue(codeValues,'location_accuracy', location_accuracy);\\r\\n }\\r\\n */\\r\\n /*else if ((params.event_time) && (params.event_time == '')) {\\r\\n var event_time = moment.utc().unix();\\r\\n AddValue(codeValues,'event_time', event_time);\\r\\n } revisar mas adelante*/\\r\\n if (params.location_time) {\\r\\n AddValue(codeValues, 'location_time', params.location_time);\\r\\n }\\r\\n if (params.event_time) {\\r\\n AddValue(codeValues, 'event_time', params.event_time);\\r\\n }\\r\\n // to parse SMS info from the device\\r\\n switch (messageTypeLocalCode) {\\r\\n case 'COMM-SMS': // SMS message sent in\\r\\n if (params.data.startsWith('Device location request')) {\\r\\n configsToAck.push(configIds.Controls.RealTimeLocate);\\r\\n } else if (params.data.startsWith('Set IP ok')) {\\r\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n } else if (params.data.startsWith('IMEI:')) {\\r\\n configsToAck.push(configIds.Controls.GetFirmwareVersion);\\r\\n } else if (params.data.startsWith('Set IP ok')) {\\r\\n configsToAck.push(configIds.Controls.ClearBufferedMessages);\\r\\n } else if (params.data.startsWith('flush ok')) {\\r\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n } else if (params.data.startsWith('Set Watch-')) {\\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 = (`Watch-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 = (`Watch;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 = (`Watch;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 = (`Watch-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 // decode global msg\\r\\n function decoder(str) { // decode rawdata\\r\\n // CARE Decoder\\r\\n //AddValue(codeValues, 'Message : ', str);\\r\\n var message = str;\\r\\n var index = 18;\\r\\n //parse header & properties\\r\\n var properties = message.substring(2, 4);\\r\\n var lengthLittleEndian = message.substring(4, 8);\\r\\n var total_length = lengthLittleEndian.substring(2, 4) + lengthLittleEndian.substring(0, 2);\\r\\n total_length = 2 * hexToDecimal(total_length.substring(0, 4));\\r\\n var sequenceID = message.substring(12, 16);\\r\\n var command = message.substring(16, 18);\\r\\n //mask bitwise (properties should be '10')\\r\\n if ((parseInt(properties) & 8) == 8) {\\r\\n needsAck = true;\\r\\n } else needsAck = false;\\r\\n // need to check if checksum is correct for possible msg corruption 10/03/23\\r\\n var checksum = message.substring(8, 12);\\r\\n var messageBody = message.substring(16, message.length);\\r\\n debug('message =' + message);\\r\\n debug('checksum =' + checksum);\\r\\n debug('calculateCheckSum =' + calculateCheckSum(messageBody));\\r\\n if (calculateCheckSum(messageBody) == checksum) { // payload is valid\\r\\n debug(\\\"message has valid checksum\\\");\\r\\n var messageBody = command; // update value for the ACK\\r\\n debug('command =' + command);\\r\\n if (command == '01') {\\r\\n while (index < total_length + 16) {\\r\\n 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\\r\\n if ((alarmCodeExtInt & 1) == 1) {\\r\\n var alarm = 'ALF-C';\\r\\n }\\r\\n // Welfare Check-out\\r\\n else if ((alarmCodeExtInt & 2) == 2) {\\r\\n var alarm = 'ALA-C';\\r\\n }\\r\\n // Standard Alerts\\r\\n //Battery low\\r\\n else if ((alarmCodeInt & 1) == 1) {\\r\\n var alarm = 'BATL';\\r\\n }\\r\\n //Overspeed\\r\\n else if ((alarmCodeInt & 2) == 2) {\\r\\n var alarm = 'ALSP';\\r\\n }\\r\\n //Fall\\r\\n else if ((alarmCodeInt & 4) == 4) {\\r\\n var alarm = 'ALF';\\r\\n }\\r\\n //Tilt\\r\\n else if ((alarmCodeInt & 8) == 8) {\\r\\n var alarm = 'TLT';\\r\\n } else if ((alarmCodeInt & 16) == 16) {\\r\\n if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n var alarm = 'Geo1-IN';\\r\\n } else {\\r\\n var alarm = 'Geo1-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 32) == 32) {\\r\\n if ((alarmCodeInt & 33554432) == 33554432) {\\r\\n var alarm = 'Geo2-IN';\\r\\n } else {\\r\\n var alarm = 'Geo2-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 64) == 64) {\\r\\n if ((alarmCodeInt & 67108864) == 67108864) {\\r\\n var alarm = 'Geo3-IN';\\r\\n } else {\\r\\n var alarm = 'Geo3-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 128) == 128) {\\r\\n if ((alarmCodeInt & 134217728) == 134217728) {\\r\\n var alarm = 'Geo4-IN';\\r\\n } else {\\r\\n var alarm = 'Geo4-OUT';\\r\\n }\\r\\n }\\r\\n //Power Off\\r\\n else if ((alarmCodeInt & 256) == 256) {\\r\\n var alarm = 'PWRF';\\r\\n }\\r\\n //Power On\\r\\n else if ((alarmCodeInt & 512) == 512) {\\r\\n var alarm = 'PWRN';\\r\\n }\\r\\n //Motion\\r\\n else if ((alarmCodeInt & 1024) == 1024) {\\r\\n var alarm = 'ALMOV';\\r\\n }\\r\\n //No Motion\\r\\n else if ((alarmCodeInt & 2048) == 2048) {\\r\\n var alarm = 'ALNM';\\r\\n }\\r\\n //SOS\\r\\n else if ((alarmCodeInt & 4096) == 4096) {\\r\\n var alarm = 'ALSOS';\\r\\n } else if ((alarmCodeInt & 8192) == 8192) {\\r\\n var alarm = 'Side1';\\r\\n } else if ((alarmCodeInt & 16384) == 16384) {\\r\\n var alarm = 'Side2';\\r\\n }\\r\\n //Battery charging\\r\\n else if ((alarmCodeInt & 32768) == 32768) {\\r\\n var alarm = 'BATCN';\\r\\n }\\r\\n //Battery no charging\\r\\n else if ((alarmCodeInt & 65536) == 65536) {\\r\\n var alarm = 'BATCF';\\r\\n }\\r\\n //SOS Ending\\r\\n // Temporary Commented until we know exactly how it works. 22/09/2022\\r\\n else if ((alarmCodeInt & 131072) == 131072) {\\r\\n var alarm = 'ALA-F';\\r\\n info = 'Alarm Finished';\\r\\n }\\r\\n //Amber Alert EC03 only\\r\\n else if ((alarmCodeInt & 262144) == 262144) {\\r\\n var alarm = 'ALA';\\r\\n }\\r\\n // welfare Alert check-in ALA-O\\r\\n else if ((alarmCodeInt & 524288) == 524288) {\\r\\n var alarm = 'ALA-O';\\r\\n }\\r\\n // Amber alert Ending ALA-C\\r\\n else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n var alarm = 'ALA-C';\\r\\n }\\r\\n // Amber alert Ending ALA-C\\r\\n //else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n // var alarm = 'ALA-C';\\r\\n //}\\r\\n // Fall-Down Alert ending\\r\\n else if ((alarmCodeInt & 2097152) == 2097152) {\\r\\n var alarm = 'ALF-C';\\r\\n }\\r\\n // welfare Alert Ending ALA\\r\\n else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n var alarm = 'ALA';\\r\\n }\\r\\n // Beacon absent Alert 11/10/22. Need to be added in msg types\\r\\n //else if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n // var alarm = 'BEA';\\r\\n //}\\r\\n general += 'alarm:' + alarm + ',';\\r\\n break;\\r\\n //Custom ID\\r\\n case '03':\\r\\n customID = value;\\r\\n if (!allowedCID.includes(value)) {\\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 //<>,<>,<>,<>,<>\\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 if (!allowedCID.includes(customID)) {\\r\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n AddValue(codeValues, \\\"customID\\\", customID);\\r\\n return\\r\\n }\\r\\n if (statusDevice) {\\r\\n messageForReceiver = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n }\\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;\\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 }\\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 = 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 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 var rawlabel = 'steps';\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=${rawlabel}`);\\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 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 var rawlabel = 'bpm';\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=${rawlabel}`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n }\\r\\n break;\\r\\n // SPO2\\r\\n case '41':\\r\\n var numSPO = (keyLength - 2) / 12;\\r\\n for (let j = 0; j < numSPO; 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 SPOHex = value.substring(8, 10);\\r\\n var SPO = hexToDecimal(SPOHex);\\r\\n var trustLevelHex = value.substring(10, 12);\\r\\n var trustLevel = hexToDecimal(trustLevelHex);\\r\\n info = SPO;\\r\\n //var alarmCode = 'True';\\r\\n var alarm = 'SPO2';\\r\\n general += ' SPO2 rate' + j + ':' + SPO + ',';\\r\\n var rawlabel = '%';\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};SPO2=${info};TLEVEL=${trustLevel};LABEL=${rawlabel}`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n }\\r\\n break;\\r\\n //BLE Connected . For Flic button\\r\\n case '62':\\r\\n location_type = 'BLE';\\r\\n //var alarm = 'EBZI'; \\r\\n //var latitudeHex = '00';\\r\\n //var longitudeHex = '00';\\r\\n //var descr = 'empty';\\r\\n var flag = hexToDecimal(value.substring(0, 2)); // 0= Disconnected, 1= Connected\\r\\n var mac = value.substring(2, 14); // No hace falta darle la vuelta\\r\\n // add : format in MAC\\r\\n mac = mac.match(/.{1,2}/g).join(':');\\r\\n var batLevel = hexToDecimal(value.substring(14, 16)); // 0-100\\r\\n //location_time = timestamp;\\r\\n ble_data = `${flag},${batLevel},${mac}`;\\r\\n general += 'BLE location (State):' + flag + ', (bat):' + batLevel + ', (mac):' + mac + ',';\\r\\n break;\\r\\n }\\r\\n }\\r\\n if (alarmCode) {\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch;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 = (`Watch;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': // Ringer Volume\\r\\n var volume = hexToDecimal(value);\\r\\n imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;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 = (`Watch;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 '0F': // Enable control.... Used for STEP COUNTING SETTINGS\\r\\n // 'FF FF 21 80'\\r\\n var StepStatus = hex2bin(value.substring(4, 6));\\r\\n var enalbleDisable = '';\\r\\n if (StepStatus.substring(7, 8) == '1') {\\r\\n var step = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var step = 'Disable, '\\r\\n };\\r\\n //var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n //hrate += detectingInterval;\\r\\n AddValue(codeValues, \\\"step\\\", step);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadStepsSettings.EnableDisableReadStepsSettings, enalbleDisable);\\r\\n //AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadStepsSettings.EnableDisableReadStepsSettings);\\r\\n //configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\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 = (`Watch;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 '34': //ContactList with name\\r\\n var contactNumber = value.substring(1, 2);\\r\\n var telLength = hexToDecimal(value.substring(2, 4));\\r\\n var tel = '';\\r\\n switch (contactNumber) {\\r\\n // Emergency Number\\r\\n case '0':\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n break;\\r\\n // Speed Dial Number\\r\\n //case '1':\\r\\n // tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n // AddValue(codeValues, \\\"SpeedDialNumber\\\", tel);\\r\\n // AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.SpeedDialNumber, tel);\\r\\n // configsToAck.push(configIds.ReadSpeedDialSettings.SpeedDialNumber);\\r\\n // break;\\r\\n // Gateway Number\\r\\n case '9': //00447781482635,Esendex UK 0034627177148,Esendex Spain 00447507288240,Esendex UK Acceptance\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n if (tel.includes('447781482635') || tel.includes('00447781482635')) {\\r\\n tel = 'Esendex UK'\\r\\n } else if (tel.includes('34627177148') || tel.includes('0034627177148')) {\\r\\n tel = 'Esendex Spain'\\r\\n } else if (tel.includes('447507288240') || tel.includes('00447507288240')) {\\r\\n tel = 'Esendex UK Acceptance'\\r\\n } else {\\r\\n tel = 'Default'\\r\\n }\\r\\n AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n break;\\r\\n default:\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n if (tel.length < 6) {\\r\\n contacts += '';\\r\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n break;\\r\\n }\\r\\n //contacts += 'A' + (contactNumber - 1) + ': ' + tel + ', ';\\r\\n contacts += tel + ', ';\\r\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n break;\\r\\n }\\r\\n break;\\r\\n case '40': // APN\\r\\n //no ACK need\\r\\n AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'));\\r\\n configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\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 = (`Watch;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 = (`Watch;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 '46': //HeartRate\\r\\n // '10 0E 00 80'\\r\\n var HeartRateStatus = hex2bin(value.substring(6, 8));\\r\\n var enalbleDisable = '';\\r\\n if (HeartRateStatus.substring(0, 1) == '1') {\\r\\n var hrate = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var hrate = 'Disable, '\\r\\n };\\r\\n var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n hrate += detectingInterval;\\r\\n AddValue(codeValues, \\\"hrate\\\", hrate);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings);\\r\\n configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\r\\n break;\\r\\n case '47': // Custom Id\\r\\n imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;ACK-CUSTID;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"customeid\\\", value);\\r\\n AddValue(configsToUpdate, configIds.ReadState.CustomId, hex_to_ascii(value)); //now it comes \\\"3036\\\"\\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 // commented until Eview fixes this function\\r\\n /*\\r\\n messageForReceiver = (`Watch;ACK-NOMOTION;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"nomotion\\\", alertSetting);\\r\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings, enableDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n configsToAck.push(configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings);\\r\\n configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n */\\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 = (`Watch;ACK-FALLALERT;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n var sesibityOptionValue = hexToDecimal(value.substring(1, 2));\\r\\n sensibility += sesibityOptionValue;\\r\\n AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n //AddValue(configsToUpdate, configIds.ReadAlertSettings.FallSettings, sensibility);\\r\\n AddValue(configsToUpdate, configIds.ReadFallSettings.EnableDisableFallSettings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadFallSettings.Sensitivity, sesibityOptionValue);\\r\\n //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n configsToAck.push(configIds.ReadFallSettings.EnableDisableFallSettings);\\r\\n configsToAck.push(configIds.ReadFallSettings.Sensitivity);\\r\\n break;\\r\\n case '73': //BeaconList\\r\\n var beaconNumber = hexToDecimal(value.substring(1, 2));\\r\\n var beaconStatus = hex2bin(value.substring(0, 1));\\r\\n beaconStatus = hex_to_ascii(value.substring(30, value.length));\\r\\n //beaconStatus = changeEndianness(value.substring(30, value.length));\\r\\n //homeBeacon += 'B' + (beaconNumber + 1) + ': ' + beaconStatus + ', ';\\r\\n homeBeacon += beaconStatus + ', ';\\r\\n AddValue(codeValues, \\\"homeBeacon\\\", homeBeacon);\\r\\n messageForReceiver = (`Watch;ACK-GDATA;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n break;\\r\\n case '4A': //Wifi Network List\\r\\n var wifiSSIDLenght = hexToDecimal(value.substring(2, 4));\\r\\n var wifiPasswordLenght = hexToDecimal(value.substring(4, 6));\\r\\n var wifiIndex = hexToDecimal(value.substring(1, 2));\\r\\n //var wifiStatus = hexToDecimal(value.substring(0, 1));\\r\\n var wifiStatus = value.substring(0, 1);\\r\\n /*var enalbleDisable = wifiSSID = wifiPassword = homeWifi = '';\\r\\n /var homeWifi = '';\\r\\n if (wifiIndex == '0') { // Only first Wifi of the list\\r\\n if (wifiStatus == '8') {\\r\\n homeWifi += ' Enable, '\\r\\n enalbleDisable = '1';\\r\\n } else {\\r\\n homeWifi += ' Disable, '\\r\\n //enalbleDisable = '0';\\r\\n };*/\\r\\n if ((wifiStatus == '8') || (wifiStatus == 'C')) { // 8 == ON OR C== ON and Connected\\r\\n var wifiSSID = hex_to_ascii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\r\\n var wifiPassword = hex_to_ascii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\r\\n var imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;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 = (`Watch;ACK-SPEED;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"speed\\\", alertSetting);\\r\\n AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\r\\n configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n break;\\r\\n case '7A': //[Length]:05 [Key]:7A [Value]:60 54 00 80\\r\\n // {\\\"spo2Interval\\\":{\\\"interval\\\":21600,\\\"status\\\":1}}\\r\\n var SPOStatus = hex2bin(value.substring(6, 8));\\r\\n var enalbleDisable = '';\\r\\n if (SPOStatus.substring(0, 1) == '1') {\\r\\n var spo = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var spo = 'Disable, '\\r\\n };\\r\\n var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n spo += detectingInterval;\\r\\n AddValue(codeValues, \\\"SPO2\\\", spo);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadSPO2Settings.EnableDisableReadSPO2Settings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadSPO2Settings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadSPO2Settings.EnableDisableReadSPO2Settings);\\r\\n configsToAck.push(configIds.ReadSPO2Settings.ReportingFrequency);\\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 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 = (`Watch-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 = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch-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 if (typeof configIds !== 'undefined' && configIds && configIds.ConfigureDevice && configIds.ConfigureDevice.LastConfigured) { // when is defined\\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 }\\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(hex) { // Hex to Ascii \\r\\n if (hex.length % 2 !== 0) {\\r\\n throw new Error(\\\"Hex string length must be even\\\");\\r\\n }\\r\\n let ascii = '';\\r\\n for (let i = 0; i < hex.length; i += 2) {\\r\\n const byte = hex.substr(i, 2);\\r\\n const charCode = parseInt(byte, 16);\\r\\n if (charCode !== 0) { // remove null character (\\\\u0000)\\r\\n ascii += String.fromCharCode(charCode);\\r\\n }\\r\\n }\\r\\n return ascii;\\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 normalizeLabels(raw) { // output labels as array\\r\\n if (raw == null) return [];\\r\\n if (Array.isArray(raw)) return raw;\\r\\n // Si en algún momento vinieran varias labels separadas por coma o ;\\r\\n return String(raw).split(/[;,]/).map(s => s.trim()).filter(Boolean);\\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":1765483826},{"Type":1,"NewValue":"{\"Id\":437,\"Name\":\"Access TEC Care Watch\",\"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 // Watch protocol - please see variables and typical values in order below\\r\\n // Watch-CYC;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;SIGNAL=<>;WM=<>;GENERAL=<>\\r\\n // Watch-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\r\\n //\\r\\n // Author: Juanmi Navarro\\r\\n // Created: 01/01/0000\\r\\n // Last modified: 18/09/2025\\r\\n //\\r\\n ///////////////////////////////////////////////////////////////////////////////\\r\\n if (typeof localTesting === \\\"undefined\\\") {\\r\\n let localTesting = false;\\r\\n }\\r\\n const crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,\\r\\n 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,\\r\\n 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,\\r\\n 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,\\r\\n 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,\\r\\n 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,\\r\\n 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,\\r\\n 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,\\r\\n 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,\\r\\n 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,\\r\\n 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,\\r\\n 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,\\r\\n 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,\\r\\n 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,\\r\\n 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,\\r\\n 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,\\r\\n 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,\\r\\n 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,\\r\\n 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,\\r\\n 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,\\r\\n 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,\\r\\n 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n ];\\r\\n var codeValues = [];\\r\\n AddValue(codeValues, 'protocol_template', 'Watch');\\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 = (`Watch-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 var allowedCID = ['3036', '06'];\\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 } else if (oystaTemplate == 'True') { // Oysta Template \\r\\n AddValue(codeValues, 'rawMsg', raw);\\r\\n if ((params.rawlabel) && (params.rawlabel !== '')) { // decode label if exists\\r\\n var labels = normalizeLabels(params.rawlabel); // \\\"steps\\\" -> [\\\"steps\\\"]\\r\\n AddValue(codeValues, 'oysta_labels', labels);\\r\\n //AddValue(codeValues, 'oysta_labels', `[${params.rawlabel}]`);\\r\\n }\\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 //<>,<>,<> \\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];\\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 //<>,<>,<> \\r\\n if (mac2) {\\r\\n AddValue(codeValues, 'beacon_mac', mac2);\\r\\n var simpleQuery2 = [{\\r\\n 'code': 'Mac',\\r\\n 'value': mac2,\\r\\n }];\\r\\n var simpleQueryLabel2 = {\\r\\n 'table': 'beacons',\\r\\n 'select': 'Name',\\r\\n 'query': simpleQuery2\\r\\n };\\r\\n var labels2 = [];\\r\\n labels2.push(JSON.stringify(simpleQueryLabel2));\\r\\n AddValue(codeValues, 'oysta_labels', JSON.stringify(labels2));\\r\\n }\\r\\n if (params.beacon_major) {\\r\\n AddValue(codeValues, 'beacon_major', params.beacon_major);\\r\\n } else {\\r\\n AddValue(codeValues, 'beacon_major', 0);\\r\\n }\\r\\n if (params.beacon_minor) {\\r\\n AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\r\\n } else {\\r\\n AddValue(codeValues, 'beacon_minor', 0);\\r\\n }\\r\\n //AddValue(codeValues,'oysta_labels', label);\\r\\n //AddValue(codeValues,'oysta_value', mac);\\r\\n }\\r\\n /* meter mas tarde... \\r\\n if (params.smart_data !== 'undefined') {\\r\\n var gen_location = params.smart_data.split(',')\\r\\n var latitude = gen_location[0]\\r\\n var longitude = gen_location[1]\\r\\n var location_accuracy = gen_location[2]\\r\\n var altitude = gen_location[3]\\r\\n AddValue(codeValues,'latitude', latitude);\\r\\n AddValue(codeValues,'longitude', longitude);\\r\\n AddValue(codeValues,'altitude', altitude);\\r\\n AddValue(codeValues,'location_accuracy', location_accuracy);\\r\\n }\\r\\n */\\r\\n /*else if ((params.event_time) && (params.event_time == '')) {\\r\\n var event_time = moment.utc().unix();\\r\\n AddValue(codeValues,'event_time', event_time);\\r\\n } revisar mas adelante*/\\r\\n if (params.location_time) {\\r\\n AddValue(codeValues, 'location_time', params.location_time);\\r\\n }\\r\\n if (params.event_time) {\\r\\n AddValue(codeValues, 'event_time', params.event_time);\\r\\n }\\r\\n // to parse SMS info from the device\\r\\n switch (messageTypeLocalCode) {\\r\\n case 'COMM-SMS': // SMS message sent in\\r\\n if (params.data.startsWith('Device location request')) {\\r\\n configsToAck.push(configIds.Controls.RealTimeLocate);\\r\\n } else if (params.data.startsWith('Set IP ok')) {\\r\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n } else if (params.data.startsWith('IMEI:')) {\\r\\n configsToAck.push(configIds.Controls.GetFirmwareVersion);\\r\\n } else if (params.data.startsWith('Set IP ok')) {\\r\\n configsToAck.push(configIds.Controls.ClearBufferedMessages);\\r\\n } else if (params.data.startsWith('flush ok')) {\\r\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n } else if (params.data.startsWith('Set Watch-')) {\\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 = (`Watch-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 = (`Watch;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 = (`Watch;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 = (`Watch-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 // return the object that contains your data\\r\\n return dataToReceiver;\\r\\n // end of main operation\\r\\n // define functions used in operation\\r\\n // decode global msg\\r\\n function decoder(str) { // decode rawdata\\r\\n // CARE Decoder\\r\\n //AddValue(codeValues, 'Message : ', str);\\r\\n var message = str;\\r\\n var index = 18;\\r\\n //parse header & properties\\r\\n var properties = message.substring(2, 4);\\r\\n var lengthLittleEndian = message.substring(4, 8);\\r\\n var total_length = lengthLittleEndian.substring(2, 4) + lengthLittleEndian.substring(0, 2);\\r\\n total_length = 2 * hexToDecimal(total_length.substring(0, 4));\\r\\n var sequenceID = message.substring(12, 16);\\r\\n var command = message.substring(16, 18);\\r\\n //mask bitwise (properties should be '10')\\r\\n if ((parseInt(properties) & 8) == 8) {\\r\\n needsAck = true;\\r\\n } else needsAck = false;\\r\\n // need to check if checksum is correct for possible msg corruption 10/03/23\\r\\n var checksum = message.substring(8, 12);\\r\\n var messageBody = message.substring(16, message.length);\\r\\n debug('message =' + message);\\r\\n debug('checksum =' + checksum);\\r\\n debug('calculateCheckSum =' + calculateCheckSum(messageBody));\\r\\n if (calculateCheckSum(messageBody) == checksum) { // payload is valid\\r\\n debug(\\\"message has valid checksum\\\");\\r\\n var messageBody = command; // update value for the ACK\\r\\n debug('command =' + command);\\r\\n if (command == '01') {\\r\\n while (index < total_length + 16) {\\r\\n 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\\r\\n if ((alarmCodeExtInt & 1) == 1) {\\r\\n var alarm = 'ALF-C';\\r\\n }\\r\\n // Welfare Check-out\\r\\n else if ((alarmCodeExtInt & 2) == 2) {\\r\\n var alarm = 'ALA-C';\\r\\n }\\r\\n // Standard Alerts\\r\\n //Battery low\\r\\n else if ((alarmCodeInt & 1) == 1) {\\r\\n var alarm = 'BATL';\\r\\n }\\r\\n //Overspeed\\r\\n else if ((alarmCodeInt & 2) == 2) {\\r\\n var alarm = 'ALSP';\\r\\n }\\r\\n //Fall\\r\\n else if ((alarmCodeInt & 4) == 4) {\\r\\n var alarm = 'ALF';\\r\\n }\\r\\n //Tilt\\r\\n else if ((alarmCodeInt & 8) == 8) {\\r\\n var alarm = 'TLT';\\r\\n } else if ((alarmCodeInt & 16) == 16) {\\r\\n if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n var alarm = 'Geo1-IN';\\r\\n } else {\\r\\n var alarm = 'Geo1-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 32) == 32) {\\r\\n if ((alarmCodeInt & 33554432) == 33554432) {\\r\\n var alarm = 'Geo2-IN';\\r\\n } else {\\r\\n var alarm = 'Geo2-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 64) == 64) {\\r\\n if ((alarmCodeInt & 67108864) == 67108864) {\\r\\n var alarm = 'Geo3-IN';\\r\\n } else {\\r\\n var alarm = 'Geo3-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 128) == 128) {\\r\\n if ((alarmCodeInt & 134217728) == 134217728) {\\r\\n var alarm = 'Geo4-IN';\\r\\n } else {\\r\\n var alarm = 'Geo4-OUT';\\r\\n }\\r\\n }\\r\\n //Power Off\\r\\n else if ((alarmCodeInt & 256) == 256) {\\r\\n var alarm = 'PWRF';\\r\\n }\\r\\n //Power On\\r\\n else if ((alarmCodeInt & 512) == 512) {\\r\\n var alarm = 'PWRN';\\r\\n }\\r\\n //Motion\\r\\n else if ((alarmCodeInt & 1024) == 1024) {\\r\\n var alarm = 'ALMOV';\\r\\n }\\r\\n //No Motion\\r\\n else if ((alarmCodeInt & 2048) == 2048) {\\r\\n var alarm = 'ALNM';\\r\\n }\\r\\n //SOS\\r\\n else if ((alarmCodeInt & 4096) == 4096) {\\r\\n var alarm = 'ALSOS';\\r\\n } else if ((alarmCodeInt & 8192) == 8192) {\\r\\n var alarm = 'Side1';\\r\\n } else if ((alarmCodeInt & 16384) == 16384) {\\r\\n var alarm = 'Side2';\\r\\n }\\r\\n //Battery charging\\r\\n else if ((alarmCodeInt & 32768) == 32768) {\\r\\n var alarm = 'BATCN';\\r\\n }\\r\\n //Battery no charging\\r\\n else if ((alarmCodeInt & 65536) == 65536) {\\r\\n var alarm = 'BATCF';\\r\\n }\\r\\n //SOS Ending\\r\\n // Temporary Commented until we know exactly how it works. 22/09/2022\\r\\n else if ((alarmCodeInt & 131072) == 131072) {\\r\\n var alarm = 'ALA-F';\\r\\n info = 'Alarm Finished';\\r\\n }\\r\\n //Amber Alert EC03 only\\r\\n else if ((alarmCodeInt & 262144) == 262144) {\\r\\n var alarm = 'ALA';\\r\\n }\\r\\n // welfare Alert check-in ALA-O\\r\\n else if ((alarmCodeInt & 524288) == 524288) {\\r\\n var alarm = 'ALA-O';\\r\\n }\\r\\n // Amber alert Ending ALA-C\\r\\n else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n var alarm = 'ALA-C';\\r\\n }\\r\\n // Amber alert Ending ALA-C\\r\\n //else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n // var alarm = 'ALA-C';\\r\\n //}\\r\\n // Fall-Down Alert ending\\r\\n else if ((alarmCodeInt & 2097152) == 2097152) {\\r\\n var alarm = 'ALF-C';\\r\\n }\\r\\n // welfare Alert Ending ALA\\r\\n else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n var alarm = 'ALA';\\r\\n }\\r\\n // Beacon absent Alert 11/10/22. Need to be added in msg types\\r\\n //else if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n // var alarm = 'BEA';\\r\\n //}\\r\\n general += 'alarm:' + alarm + ',';\\r\\n break;\\r\\n //Custom ID\\r\\n case '03':\\r\\n customID = value;\\r\\n if (!allowedCID.includes(value)) {\\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 //<>,<>,<>,<>,<>\\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 if (!allowedCID.includes(customID)) {\\r\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n AddValue(codeValues, \\\"customID\\\", customID);\\r\\n return\\r\\n }\\r\\n if (statusDevice) {\\r\\n messageForReceiver = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n }\\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;\\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 }\\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 = 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 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 var rawlabel = 'steps';\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=${rawlabel}`);\\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 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 var rawlabel = 'bpm';\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=${rawlabel}`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n }\\r\\n break;\\r\\n // SPO2\\r\\n case '41':\\r\\n var numSPO = (keyLength - 2) / 12;\\r\\n for (let j = 0; j < numSPO; 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 SPOHex = value.substring(8, 10);\\r\\n var SPO = hexToDecimal(SPOHex);\\r\\n var trustLevelHex = value.substring(10, 12);\\r\\n var trustLevel = hexToDecimal(trustLevelHex);\\r\\n info = SPO;\\r\\n //var alarmCode = 'True';\\r\\n var alarm = 'SPO2';\\r\\n general += ' SPO2 rate' + j + ':' + SPO + ',';\\r\\n var rawlabel = '%';\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};SPO2=${info};TLEVEL=${trustLevel};LABEL=${rawlabel}`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n }\\r\\n break;\\r\\n //BLE Connected . For Flic button\\r\\n case '62':\\r\\n location_type = 'BLE';\\r\\n //var alarm = 'EBZI'; \\r\\n //var latitudeHex = '00';\\r\\n //var longitudeHex = '00';\\r\\n //var descr = 'empty';\\r\\n var flag = hexToDecimal(value.substring(0, 2)); // 0= Disconnected, 1= Connected\\r\\n var mac = value.substring(2, 14); // No hace falta darle la vuelta\\r\\n // add : format in MAC\\r\\n mac = mac.match(/.{1,2}/g).join(':');\\r\\n var batLevel = hexToDecimal(value.substring(14, 16)); // 0-100\\r\\n //location_time = timestamp;\\r\\n ble_data = `${flag},${batLevel},${mac}`;\\r\\n general += 'BLE location (State):' + flag + ', (bat):' + batLevel + ', (mac):' + mac + ',';\\r\\n break;\\r\\n }\\r\\n }\\r\\n if (alarmCode) {\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch;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 = (`Watch;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': // Ringer Volume\\r\\n var volume = hexToDecimal(value);\\r\\n imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;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 = (`Watch;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 '0F': // Enable control.... Used for STEP COUNTING SETTINGS\\r\\n // 'FF FF 21 80'\\r\\n var StepStatus = hex2bin(value.substring(4, 6));\\r\\n var enalbleDisable = '';\\r\\n if (StepStatus.substring(7, 8) == '1') {\\r\\n var step = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var step = 'Disable, '\\r\\n };\\r\\n //var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n //hrate += detectingInterval;\\r\\n AddValue(codeValues, \\\"step\\\", step);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadStepsSettings.EnableDisableReadStepsSettings, enalbleDisable);\\r\\n //AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadStepsSettings.EnableDisableReadStepsSettings);\\r\\n //configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\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 = (`Watch;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 '34': //ContactList with name\\r\\n var contactNumber = value.substring(1, 2);\\r\\n var telLength = hexToDecimal(value.substring(2, 4));\\r\\n var tel = '';\\r\\n switch (contactNumber) {\\r\\n // Emergency Number\\r\\n case '0':\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n break;\\r\\n // Speed Dial Number\\r\\n //case '1':\\r\\n // tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n // AddValue(codeValues, \\\"SpeedDialNumber\\\", tel);\\r\\n // AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.SpeedDialNumber, tel);\\r\\n // configsToAck.push(configIds.ReadSpeedDialSettings.SpeedDialNumber);\\r\\n // break;\\r\\n // Gateway Number\\r\\n case '9': //00447781482635,Esendex UK 0034627177148,Esendex Spain 00447507288240,Esendex UK Acceptance\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n if (tel.includes('447781482635') || tel.includes('00447781482635')) {\\r\\n tel = 'Esendex UK'\\r\\n } else if (tel.includes('34627177148') || tel.includes('0034627177148')) {\\r\\n tel = 'Esendex Spain'\\r\\n } else if (tel.includes('447507288240') || tel.includes('00447507288240')) {\\r\\n tel = 'Esendex UK Acceptance'\\r\\n } else {\\r\\n tel = 'Default'\\r\\n }\\r\\n AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n break;\\r\\n default:\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n if (tel.length < 6) {\\r\\n contacts += '';\\r\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n break;\\r\\n }\\r\\n //contacts += 'A' + (contactNumber - 1) + ': ' + tel + ', ';\\r\\n contacts += tel + ', ';\\r\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n break;\\r\\n }\\r\\n break;\\r\\n case '40': // APN\\r\\n //no ACK need\\r\\n AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'));\\r\\n configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\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 = (`Watch;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 = (`Watch;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 '46': //HeartRate\\r\\n // '10 0E 00 80'\\r\\n var HeartRateStatus = hex2bin(value.substring(6, 8));\\r\\n var enalbleDisable = '';\\r\\n if (HeartRateStatus.substring(0, 1) == '1') {\\r\\n var hrate = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var hrate = 'Disable, '\\r\\n };\\r\\n var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n hrate += detectingInterval;\\r\\n AddValue(codeValues, \\\"hrate\\\", hrate);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings);\\r\\n configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\r\\n break;\\r\\n case '47': // Custom Id\\r\\n imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;ACK-CUSTID;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"customeid\\\", value);\\r\\n AddValue(configsToUpdate, configIds.ReadState.CustomId, hex_to_ascii(value)); //now it comes \\\"3036\\\"\\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 // commented until Eview fixes this function\\r\\n /*\\r\\n messageForReceiver = (`Watch;ACK-NOMOTION;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"nomotion\\\", alertSetting);\\r\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings, enableDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n configsToAck.push(configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings);\\r\\n configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n */\\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 = (`Watch;ACK-FALLALERT;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n var sesibityOptionValue = hexToDecimal(value.substring(1, 2));\\r\\n sensibility += sesibityOptionValue;\\r\\n AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n //AddValue(configsToUpdate, configIds.ReadAlertSettings.FallSettings, sensibility);\\r\\n AddValue(configsToUpdate, configIds.ReadFallSettings.EnableDisableFallSettings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadFallSettings.Sensitivity, sesibityOptionValue);\\r\\n //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n configsToAck.push(configIds.ReadFallSettings.EnableDisableFallSettings);\\r\\n configsToAck.push(configIds.ReadFallSettings.Sensitivity);\\r\\n break;\\r\\n case '73': //BeaconList\\r\\n var beaconNumber = hexToDecimal(value.substring(1, 2));\\r\\n var beaconStatus = hex2bin(value.substring(0, 1));\\r\\n beaconStatus = hex_to_ascii(value.substring(30, value.length));\\r\\n //beaconStatus = changeEndianness(value.substring(30, value.length));\\r\\n //homeBeacon += 'B' + (beaconNumber + 1) + ': ' + beaconStatus + ', ';\\r\\n homeBeacon += beaconStatus + ', ';\\r\\n AddValue(codeValues, \\\"homeBeacon\\\", homeBeacon);\\r\\n messageForReceiver = (`Watch;ACK-GDATA;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n break;\\r\\n case '4A': //Wifi Network List\\r\\n var wifiSSIDLenght = hexToDecimal(value.substring(2, 4));\\r\\n var wifiPasswordLenght = hexToDecimal(value.substring(4, 6));\\r\\n var wifiIndex = hexToDecimal(value.substring(1, 2));\\r\\n //var wifiStatus = hexToDecimal(value.substring(0, 1));\\r\\n var wifiStatus = value.substring(0, 1);\\r\\n /*var enalbleDisable = wifiSSID = wifiPassword = homeWifi = '';\\r\\n /var homeWifi = '';\\r\\n if (wifiIndex == '0') { // Only first Wifi of the list\\r\\n if (wifiStatus == '8') {\\r\\n homeWifi += ' Enable, '\\r\\n enalbleDisable = '1';\\r\\n } else {\\r\\n homeWifi += ' Disable, '\\r\\n //enalbleDisable = '0';\\r\\n };*/\\r\\n if ((wifiStatus == '8') || (wifiStatus == 'C')) { // 8 == ON OR C== ON and Connected\\r\\n var wifiSSID = hex_to_ascii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\r\\n var wifiPassword = hex_to_ascii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\r\\n var imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;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 = (`Watch;ACK-SPEED;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"speed\\\", alertSetting);\\r\\n AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\r\\n configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n break;\\r\\n case '7A': //[Length]:05 [Key]:7A [Value]:60 54 00 80\\r\\n // {\\\"spo2Interval\\\":{\\\"interval\\\":21600,\\\"status\\\":1}}\\r\\n var SPOStatus = hex2bin(value.substring(6, 8));\\r\\n var enalbleDisable = '';\\r\\n if (SPOStatus.substring(0, 1) == '1') {\\r\\n var spo = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var spo = 'Disable, '\\r\\n };\\r\\n var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n spo += detectingInterval;\\r\\n AddValue(codeValues, \\\"SPO2\\\", spo);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadSPO2Settings.EnableDisableReadSPO2Settings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadSPO2Settings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadSPO2Settings.EnableDisableReadSPO2Settings);\\r\\n configsToAck.push(configIds.ReadSPO2Settings.ReportingFrequency);\\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 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 = (`Watch-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 = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch-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 if (typeof configIds !== 'undefined' && configIds && configIds.ConfigureDevice && configIds.ConfigureDevice.LastConfigured) { // when is defined\\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 }\\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(hex) { // Hex to Ascii \\r\\n if (hex.length % 2 !== 0) {\\r\\n throw new Error(\\\"Hex string length must be even\\\");\\r\\n }\\r\\n let ascii = '';\\r\\n for (let i = 0; i < hex.length; i += 2) {\\r\\n const byte = hex.substr(i, 2);\\r\\n const charCode = parseInt(byte, 16);\\r\\n if (charCode !== 0) { // remove null character (\\\\u0000)\\r\\n ascii += String.fromCharCode(charCode);\\r\\n }\\r\\n }\\r\\n return ascii;\\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 normalizeLabels(raw) { // output labels as array\\r\\n if (!raw) return [];\\r\\n return [String(raw)];\\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":1765485094},{"Type":1,"NewValue":"{\"Id\":437,\"Name\":\"Access TEC Care Watch\",\"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 // Watch protocol - please see variables and typical values in order below\\r\\n // Watch-CYC;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;SIGNAL=<>;WM=<>;GENERAL=<>\\r\\n // Watch-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\r\\n //\\r\\n // Author: Juanmi Navarro\\r\\n // Created: 01/01/0000\\r\\n // Last modified: 18/09/2025\\r\\n //\\r\\n ///////////////////////////////////////////////////////////////////////////////\\r\\n if (typeof localTesting === \\\"undefined\\\") {\\r\\n let localTesting = false;\\r\\n }\\r\\n const crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,\\r\\n 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,\\r\\n 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,\\r\\n 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,\\r\\n 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,\\r\\n 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,\\r\\n 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,\\r\\n 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,\\r\\n 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,\\r\\n 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,\\r\\n 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,\\r\\n 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,\\r\\n 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,\\r\\n 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,\\r\\n 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,\\r\\n 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,\\r\\n 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,\\r\\n 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,\\r\\n 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,\\r\\n 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,\\r\\n 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,\\r\\n 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n ];\\r\\n var codeValues = [];\\r\\n AddValue(codeValues, 'protocol_template', 'Watch');\\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 = (`Watch-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 var allowedCID = ['3036', '06'];\\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 } else if (oystaTemplate == 'True') { // Oysta Template \\r\\n AddValue(codeValues, 'rawMsg', raw);\\r\\n if ((params.rawlabel) && (params.rawlabel !== '')) { // decode label if exists\\r\\n var labels = normalizeLabels(params.rawlabel); // \\\"steps\\\" -> [\\\"steps\\\"]\\r\\n AddValue(codeValues, 'oysta_labels', labels);\\r\\n //AddValue(codeValues, 'oysta_labels', `[${params.rawlabel}]`);\\r\\n }\\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 //<>,<>,<> \\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];\\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 //<>,<>,<> \\r\\n if (mac2) {\\r\\n AddValue(codeValues, 'beacon_mac', mac2);\\r\\n var simpleQuery2 = [{\\r\\n 'code': 'Mac',\\r\\n 'value': mac2,\\r\\n }];\\r\\n var simpleQueryLabel2 = {\\r\\n 'table': 'beacons',\\r\\n 'select': 'Name',\\r\\n 'query': simpleQuery2\\r\\n };\\r\\n var labels2 = [];\\r\\n labels2.push(JSON.stringify(simpleQueryLabel2));\\r\\n AddValue(codeValues, 'oysta_labels', JSON.stringify(labels2));\\r\\n }\\r\\n if (params.beacon_major) {\\r\\n AddValue(codeValues, 'beacon_major', params.beacon_major);\\r\\n } else {\\r\\n AddValue(codeValues, 'beacon_major', 0);\\r\\n }\\r\\n if (params.beacon_minor) {\\r\\n AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\r\\n } else {\\r\\n AddValue(codeValues, 'beacon_minor', 0);\\r\\n }\\r\\n //AddValue(codeValues,'oysta_labels', label);\\r\\n //AddValue(codeValues,'oysta_value', mac);\\r\\n }\\r\\n /* meter mas tarde... \\r\\n if (params.smart_data !== 'undefined') {\\r\\n var gen_location = params.smart_data.split(',')\\r\\n var latitude = gen_location[0]\\r\\n var longitude = gen_location[1]\\r\\n var location_accuracy = gen_location[2]\\r\\n var altitude = gen_location[3]\\r\\n AddValue(codeValues,'latitude', latitude);\\r\\n AddValue(codeValues,'longitude', longitude);\\r\\n AddValue(codeValues,'altitude', altitude);\\r\\n AddValue(codeValues,'location_accuracy', location_accuracy);\\r\\n }\\r\\n */\\r\\n /*else if ((params.event_time) && (params.event_time == '')) {\\r\\n var event_time = moment.utc().unix();\\r\\n AddValue(codeValues,'event_time', event_time);\\r\\n } revisar mas adelante*/\\r\\n if (params.location_time) {\\r\\n AddValue(codeValues, 'location_time', params.location_time);\\r\\n }\\r\\n if (params.event_time) {\\r\\n AddValue(codeValues, 'event_time', params.event_time);\\r\\n }\\r\\n // to parse SMS info from the device\\r\\n switch (messageTypeLocalCode) {\\r\\n case 'COMM-SMS': // SMS message sent in\\r\\n if (params.data.startsWith('Device location request')) {\\r\\n configsToAck.push(configIds.Controls.RealTimeLocate);\\r\\n } else if (params.data.startsWith('Set IP ok')) {\\r\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n } else if (params.data.startsWith('IMEI:')) {\\r\\n configsToAck.push(configIds.Controls.GetFirmwareVersion);\\r\\n } else if (params.data.startsWith('Set IP ok')) {\\r\\n configsToAck.push(configIds.Controls.ClearBufferedMessages);\\r\\n } else if (params.data.startsWith('flush ok')) {\\r\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n } else if (params.data.startsWith('Set Watch-')) {\\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 = (`Watch-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 = (`Watch;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 = (`Watch;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 = (`Watch-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 // return the object that contains your data\\r\\n return dataToReceiver;\\r\\n // end of main operation\\r\\n // define functions used in operation\\r\\n // decode global msg\\r\\n function decoder(str) { // decode rawdata\\r\\n // CARE Decoder\\r\\n //AddValue(codeValues, 'Message : ', str);\\r\\n var message = str;\\r\\n var index = 18;\\r\\n //parse header & properties\\r\\n var properties = message.substring(2, 4);\\r\\n var lengthLittleEndian = message.substring(4, 8);\\r\\n var total_length = lengthLittleEndian.substring(2, 4) + lengthLittleEndian.substring(0, 2);\\r\\n total_length = 2 * hexToDecimal(total_length.substring(0, 4));\\r\\n var sequenceID = message.substring(12, 16);\\r\\n var command = message.substring(16, 18);\\r\\n //mask bitwise (properties should be '10')\\r\\n if ((parseInt(properties) & 8) == 8) {\\r\\n needsAck = true;\\r\\n } else needsAck = false;\\r\\n // need to check if checksum is correct for possible msg corruption 10/03/23\\r\\n var checksum = message.substring(8, 12);\\r\\n var messageBody = message.substring(16, message.length);\\r\\n debug('message =' + message);\\r\\n debug('checksum =' + checksum);\\r\\n debug('calculateCheckSum =' + calculateCheckSum(messageBody));\\r\\n if (calculateCheckSum(messageBody) == checksum) { // payload is valid\\r\\n debug(\\\"message has valid checksum\\\");\\r\\n var messageBody = command; // update value for the ACK\\r\\n debug('command =' + command);\\r\\n if (command == '01') {\\r\\n while (index < total_length + 16) {\\r\\n 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\\r\\n if ((alarmCodeExtInt & 1) == 1) {\\r\\n var alarm = 'ALF-C';\\r\\n }\\r\\n // Welfare Check-out\\r\\n else if ((alarmCodeExtInt & 2) == 2) {\\r\\n var alarm = 'ALA-C';\\r\\n }\\r\\n // Standard Alerts\\r\\n //Battery low\\r\\n else if ((alarmCodeInt & 1) == 1) {\\r\\n var alarm = 'BATL';\\r\\n }\\r\\n //Overspeed\\r\\n else if ((alarmCodeInt & 2) == 2) {\\r\\n var alarm = 'ALSP';\\r\\n }\\r\\n //Fall\\r\\n else if ((alarmCodeInt & 4) == 4) {\\r\\n var alarm = 'ALF';\\r\\n }\\r\\n //Tilt\\r\\n else if ((alarmCodeInt & 8) == 8) {\\r\\n var alarm = 'TLT';\\r\\n } else if ((alarmCodeInt & 16) == 16) {\\r\\n if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n var alarm = 'Geo1-IN';\\r\\n } else {\\r\\n var alarm = 'Geo1-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 32) == 32) {\\r\\n if ((alarmCodeInt & 33554432) == 33554432) {\\r\\n var alarm = 'Geo2-IN';\\r\\n } else {\\r\\n var alarm = 'Geo2-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 64) == 64) {\\r\\n if ((alarmCodeInt & 67108864) == 67108864) {\\r\\n var alarm = 'Geo3-IN';\\r\\n } else {\\r\\n var alarm = 'Geo3-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 128) == 128) {\\r\\n if ((alarmCodeInt & 134217728) == 134217728) {\\r\\n var alarm = 'Geo4-IN';\\r\\n } else {\\r\\n var alarm = 'Geo4-OUT';\\r\\n }\\r\\n }\\r\\n //Power Off\\r\\n else if ((alarmCodeInt & 256) == 256) {\\r\\n var alarm = 'PWRF';\\r\\n }\\r\\n //Power On\\r\\n else if ((alarmCodeInt & 512) == 512) {\\r\\n var alarm = 'PWRN';\\r\\n }\\r\\n //Motion\\r\\n else if ((alarmCodeInt & 1024) == 1024) {\\r\\n var alarm = 'ALMOV';\\r\\n }\\r\\n //No Motion\\r\\n else if ((alarmCodeInt & 2048) == 2048) {\\r\\n var alarm = 'ALNM';\\r\\n }\\r\\n //SOS\\r\\n else if ((alarmCodeInt & 4096) == 4096) {\\r\\n var alarm = 'ALSOS';\\r\\n } else if ((alarmCodeInt & 8192) == 8192) {\\r\\n var alarm = 'Side1';\\r\\n } else if ((alarmCodeInt & 16384) == 16384) {\\r\\n var alarm = 'Side2';\\r\\n }\\r\\n //Battery charging\\r\\n else if ((alarmCodeInt & 32768) == 32768) {\\r\\n var alarm = 'BATCN';\\r\\n }\\r\\n //Battery no charging\\r\\n else if ((alarmCodeInt & 65536) == 65536) {\\r\\n var alarm = 'BATCF';\\r\\n }\\r\\n //SOS Ending\\r\\n // Temporary Commented until we know exactly how it works. 22/09/2022\\r\\n else if ((alarmCodeInt & 131072) == 131072) {\\r\\n var alarm = 'ALA-F';\\r\\n info = 'Alarm Finished';\\r\\n }\\r\\n //Amber Alert EC03 only\\r\\n else if ((alarmCodeInt & 262144) == 262144) {\\r\\n var alarm = 'ALA';\\r\\n }\\r\\n // welfare Alert check-in ALA-O\\r\\n else if ((alarmCodeInt & 524288) == 524288) {\\r\\n var alarm = 'ALA-O';\\r\\n }\\r\\n // Amber alert Ending ALA-C\\r\\n else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n var alarm = 'ALA-C';\\r\\n }\\r\\n // Amber alert Ending ALA-C\\r\\n //else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n // var alarm = 'ALA-C';\\r\\n //}\\r\\n // Fall-Down Alert ending\\r\\n else if ((alarmCodeInt & 2097152) == 2097152) {\\r\\n var alarm = 'ALF-C';\\r\\n }\\r\\n // welfare Alert Ending ALA\\r\\n else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n var alarm = 'ALA';\\r\\n }\\r\\n // Beacon absent Alert 11/10/22. Need to be added in msg types\\r\\n //else if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n // var alarm = 'BEA';\\r\\n //}\\r\\n general += 'alarm:' + alarm + ',';\\r\\n break;\\r\\n //Custom ID\\r\\n case '03':\\r\\n customID = value;\\r\\n if (!allowedCID.includes(value)) {\\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 //<>,<>,<>,<>,<>\\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 if (!allowedCID.includes(customID)) {\\r\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n AddValue(codeValues, \\\"customID\\\", customID);\\r\\n return\\r\\n }\\r\\n if (statusDevice) {\\r\\n messageForReceiver = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n }\\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;\\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 }\\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 = 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 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 var rawlabel = 'steps';\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=${rawlabel}`);\\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 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 var rawlabel = 'bpm';\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=${rawlabel}`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n }\\r\\n break;\\r\\n // SPO2\\r\\n case '41':\\r\\n var numSPO = (keyLength - 2) / 12;\\r\\n for (let j = 0; j < numSPO; 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 SPOHex = value.substring(8, 10);\\r\\n var SPO = hexToDecimal(SPOHex);\\r\\n var trustLevelHex = value.substring(10, 12);\\r\\n var trustLevel = hexToDecimal(trustLevelHex);\\r\\n info = SPO;\\r\\n //var alarmCode = 'True';\\r\\n var alarm = 'SPO2';\\r\\n general += ' SPO2 rate' + j + ':' + SPO + ',';\\r\\n var rawlabel = '%';\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};SPO2=${info};TLEVEL=${trustLevel};LABEL=${rawlabel}`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n }\\r\\n break;\\r\\n //BLE Connected . For Flic button\\r\\n case '62':\\r\\n location_type = 'BLE';\\r\\n //var alarm = 'EBZI'; \\r\\n //var latitudeHex = '00';\\r\\n //var longitudeHex = '00';\\r\\n //var descr = 'empty';\\r\\n var flag = hexToDecimal(value.substring(0, 2)); // 0= Disconnected, 1= Connected\\r\\n var mac = value.substring(2, 14); // No hace falta darle la vuelta\\r\\n // add : format in MAC\\r\\n mac = mac.match(/.{1,2}/g).join(':');\\r\\n var batLevel = hexToDecimal(value.substring(14, 16)); // 0-100\\r\\n //location_time = timestamp;\\r\\n ble_data = `${flag},${batLevel},${mac}`;\\r\\n general += 'BLE location (State):' + flag + ', (bat):' + batLevel + ', (mac):' + mac + ',';\\r\\n break;\\r\\n }\\r\\n }\\r\\n if (alarmCode) {\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch;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 = (`Watch;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': // Ringer Volume\\r\\n var volume = hexToDecimal(value);\\r\\n imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;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 = (`Watch;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 '0F': // Enable control.... Used for STEP COUNTING SETTINGS\\r\\n // 'FF FF 21 80'\\r\\n var StepStatus = hex2bin(value.substring(4, 6));\\r\\n var enalbleDisable = '';\\r\\n if (StepStatus.substring(7, 8) == '1') {\\r\\n var step = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var step = 'Disable, '\\r\\n };\\r\\n //var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n //hrate += detectingInterval;\\r\\n AddValue(codeValues, \\\"step\\\", step);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadStepsSettings.EnableDisableReadStepsSettings, enalbleDisable);\\r\\n //AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadStepsSettings.EnableDisableReadStepsSettings);\\r\\n //configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\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 = (`Watch;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 '34': //ContactList with name\\r\\n var contactNumber = value.substring(1, 2);\\r\\n var telLength = hexToDecimal(value.substring(2, 4));\\r\\n var tel = '';\\r\\n switch (contactNumber) {\\r\\n // Emergency Number\\r\\n case '0':\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n break;\\r\\n // Speed Dial Number\\r\\n //case '1':\\r\\n // tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n // AddValue(codeValues, \\\"SpeedDialNumber\\\", tel);\\r\\n // AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.SpeedDialNumber, tel);\\r\\n // configsToAck.push(configIds.ReadSpeedDialSettings.SpeedDialNumber);\\r\\n // break;\\r\\n // Gateway Number\\r\\n case '9': //00447781482635,Esendex UK 0034627177148,Esendex Spain 00447507288240,Esendex UK Acceptance\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n if (tel.includes('447781482635') || tel.includes('00447781482635')) {\\r\\n tel = 'Esendex UK'\\r\\n } else if (tel.includes('34627177148') || tel.includes('0034627177148')) {\\r\\n tel = 'Esendex Spain'\\r\\n } else if (tel.includes('447507288240') || tel.includes('00447507288240')) {\\r\\n tel = 'Esendex UK Acceptance'\\r\\n } else {\\r\\n tel = 'Default'\\r\\n }\\r\\n AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n break;\\r\\n default:\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n if (tel.length < 6) {\\r\\n contacts += '';\\r\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n break;\\r\\n }\\r\\n //contacts += 'A' + (contactNumber - 1) + ': ' + tel + ', ';\\r\\n contacts += tel + ', ';\\r\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n break;\\r\\n }\\r\\n break;\\r\\n case '40': // APN\\r\\n //no ACK need\\r\\n AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'));\\r\\n configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\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 = (`Watch;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 = (`Watch;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 '46': //HeartRate\\r\\n // '10 0E 00 80'\\r\\n var HeartRateStatus = hex2bin(value.substring(6, 8));\\r\\n var enalbleDisable = '';\\r\\n if (HeartRateStatus.substring(0, 1) == '1') {\\r\\n var hrate = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var hrate = 'Disable, '\\r\\n };\\r\\n var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n hrate += detectingInterval;\\r\\n AddValue(codeValues, \\\"hrate\\\", hrate);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings);\\r\\n configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\r\\n break;\\r\\n case '47': // Custom Id\\r\\n imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;ACK-CUSTID;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"customeid\\\", value);\\r\\n AddValue(configsToUpdate, configIds.ReadState.CustomId, hex_to_ascii(value)); //now it comes \\\"3036\\\"\\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 // commented until Eview fixes this function\\r\\n /*\\r\\n messageForReceiver = (`Watch;ACK-NOMOTION;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"nomotion\\\", alertSetting);\\r\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings, enableDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n configsToAck.push(configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings);\\r\\n configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n */\\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 = (`Watch;ACK-FALLALERT;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n var sesibityOptionValue = hexToDecimal(value.substring(1, 2));\\r\\n sensibility += sesibityOptionValue;\\r\\n AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n //AddValue(configsToUpdate, configIds.ReadAlertSettings.FallSettings, sensibility);\\r\\n AddValue(configsToUpdate, configIds.ReadFallSettings.EnableDisableFallSettings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadFallSettings.Sensitivity, sesibityOptionValue);\\r\\n //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n configsToAck.push(configIds.ReadFallSettings.EnableDisableFallSettings);\\r\\n configsToAck.push(configIds.ReadFallSettings.Sensitivity);\\r\\n break;\\r\\n case '73': //BeaconList\\r\\n var beaconNumber = hexToDecimal(value.substring(1, 2));\\r\\n var beaconStatus = hex2bin(value.substring(0, 1));\\r\\n beaconStatus = hex_to_ascii(value.substring(30, value.length));\\r\\n //beaconStatus = changeEndianness(value.substring(30, value.length));\\r\\n //homeBeacon += 'B' + (beaconNumber + 1) + ': ' + beaconStatus + ', ';\\r\\n homeBeacon += beaconStatus + ', ';\\r\\n AddValue(codeValues, \\\"homeBeacon\\\", homeBeacon);\\r\\n messageForReceiver = (`Watch;ACK-GDATA;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n break;\\r\\n case '4A': //Wifi Network List\\r\\n var wifiSSIDLenght = hexToDecimal(value.substring(2, 4));\\r\\n var wifiPasswordLenght = hexToDecimal(value.substring(4, 6));\\r\\n var wifiIndex = hexToDecimal(value.substring(1, 2));\\r\\n //var wifiStatus = hexToDecimal(value.substring(0, 1));\\r\\n var wifiStatus = value.substring(0, 1);\\r\\n /*var enalbleDisable = wifiSSID = wifiPassword = homeWifi = '';\\r\\n /var homeWifi = '';\\r\\n if (wifiIndex == '0') { // Only first Wifi of the list\\r\\n if (wifiStatus == '8') {\\r\\n homeWifi += ' Enable, '\\r\\n enalbleDisable = '1';\\r\\n } else {\\r\\n homeWifi += ' Disable, '\\r\\n //enalbleDisable = '0';\\r\\n };*/\\r\\n if ((wifiStatus == '8') || (wifiStatus == 'C')) { // 8 == ON OR C== ON and Connected\\r\\n var wifiSSID = hex_to_ascii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\r\\n var wifiPassword = hex_to_ascii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\r\\n var imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;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 = (`Watch;ACK-SPEED;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"speed\\\", alertSetting);\\r\\n AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\r\\n configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n break;\\r\\n case '7A': //[Length]:05 [Key]:7A [Value]:60 54 00 80\\r\\n // {\\\"spo2Interval\\\":{\\\"interval\\\":21600,\\\"status\\\":1}}\\r\\n var SPOStatus = hex2bin(value.substring(6, 8));\\r\\n var enalbleDisable = '';\\r\\n if (SPOStatus.substring(0, 1) == '1') {\\r\\n var spo = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var spo = 'Disable, '\\r\\n };\\r\\n var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n spo += detectingInterval;\\r\\n AddValue(codeValues, \\\"SPO2\\\", spo);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadSPO2Settings.EnableDisableReadSPO2Settings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadSPO2Settings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadSPO2Settings.EnableDisableReadSPO2Settings);\\r\\n configsToAck.push(configIds.ReadSPO2Settings.ReportingFrequency);\\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 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 = (`Watch-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 = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch-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 if (typeof configIds !== 'undefined' && configIds && configIds.ConfigureDevice && configIds.ConfigureDevice.LastConfigured) { // when is defined\\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 }\\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(hex) { // Hex to Ascii \\r\\n if (hex.length % 2 !== 0) {\\r\\n throw new Error(\\\"Hex string length must be even\\\");\\r\\n }\\r\\n let ascii = '';\\r\\n for (let i = 0; i < hex.length; i += 2) {\\r\\n const byte = hex.substr(i, 2);\\r\\n const charCode = parseInt(byte, 16);\\r\\n if (charCode !== 0) { // remove null character (\\\\u0000)\\r\\n ascii += String.fromCharCode(charCode);\\r\\n }\\r\\n }\\r\\n return ascii;\\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 normalizeLabels(raw) { // output labels as array\\r\\n if (!raw) return [];\\r\\n return [String(raw)];\\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}\\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":1765485476},{"Type":1,"NewValue":"{\"Id\":437,\"Name\":\"Access TEC Care Watch\",\"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 // Watch protocol - please see variables and typical values in order below\\r\\n // Watch-CYC;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;SIGNAL=<>;WM=<>;GENERAL=<>\\r\\n // Watch-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\r\\n //\\r\\n // Author: Juanmi Navarro\\r\\n // Created: 01/01/0000\\r\\n // Last modified: 18/09/2025\\r\\n //\\r\\n ///////////////////////////////////////////////////////////////////////////////\\r\\n if (typeof localTesting === \\\"undefined\\\") {\\r\\n let localTesting = false;\\r\\n }\\r\\n const crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,\\r\\n 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,\\r\\n 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,\\r\\n 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,\\r\\n 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,\\r\\n 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,\\r\\n 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,\\r\\n 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,\\r\\n 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,\\r\\n 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,\\r\\n 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,\\r\\n 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,\\r\\n 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,\\r\\n 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,\\r\\n 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,\\r\\n 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,\\r\\n 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,\\r\\n 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,\\r\\n 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,\\r\\n 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,\\r\\n 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,\\r\\n 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n ];\\r\\n var codeValues = [];\\r\\n AddValue(codeValues, 'protocol_template', 'Watch');\\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 = (`Watch-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 var allowedCID = ['3036', '06'];\\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 } else if (oystaTemplate == 'True') { // Oysta Template \\r\\n AddValue(codeValues, \\\"rawMsg\\\", raw);\\r\\n if ((params.rawlabel) && (params.rawlabel !== '')) { // decode label if exists\\r\\n //var labels = normalizeLabels(params.rawlabel); // \\\"steps\\\" -> [\\\"steps\\\"]\\r\\n //AddValue(codeValues, 'oysta_labels', labels);\\r\\n AddValue(codeValues, \\\"oysta_labels\\\", params.rawlabel);\\r\\n }\\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 //<>,<>,<> \\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];\\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 //<>,<>,<> \\r\\n if (mac2) {\\r\\n AddValue(codeValues, 'beacon_mac', mac2);\\r\\n var simpleQuery2 = [{\\r\\n 'code': 'Mac',\\r\\n 'value': mac2,\\r\\n }];\\r\\n var simpleQueryLabel2 = {\\r\\n 'table': 'beacons',\\r\\n 'select': 'Name',\\r\\n 'query': simpleQuery2\\r\\n };\\r\\n var labels2 = [];\\r\\n labels2.push(JSON.stringify(simpleQueryLabel2));\\r\\n AddValue(codeValues, 'oysta_labels', JSON.stringify(labels2));\\r\\n }\\r\\n if (params.beacon_major) {\\r\\n AddValue(codeValues, 'beacon_major', params.beacon_major);\\r\\n } else {\\r\\n AddValue(codeValues, 'beacon_major', 0);\\r\\n }\\r\\n if (params.beacon_minor) {\\r\\n AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\r\\n } else {\\r\\n AddValue(codeValues, 'beacon_minor', 0);\\r\\n }\\r\\n //AddValue(codeValues,'oysta_labels', label);\\r\\n //AddValue(codeValues,'oysta_value', mac);\\r\\n }\\r\\n /* meter mas tarde... \\r\\n if (params.smart_data !== 'undefined') {\\r\\n var gen_location = params.smart_data.split(',')\\r\\n var latitude = gen_location[0]\\r\\n var longitude = gen_location[1]\\r\\n var location_accuracy = gen_location[2]\\r\\n var altitude = gen_location[3]\\r\\n AddValue(codeValues,'latitude', latitude);\\r\\n AddValue(codeValues,'longitude', longitude);\\r\\n AddValue(codeValues,'altitude', altitude);\\r\\n AddValue(codeValues,'location_accuracy', location_accuracy);\\r\\n }\\r\\n */\\r\\n /*else if ((params.event_time) && (params.event_time == '')) {\\r\\n var event_time = moment.utc().unix();\\r\\n AddValue(codeValues,'event_time', event_time);\\r\\n } revisar mas adelante*/\\r\\n if (params.location_time) {\\r\\n AddValue(codeValues, 'location_time', params.location_time);\\r\\n }\\r\\n if (params.event_time) {\\r\\n AddValue(codeValues, 'event_time', params.event_time);\\r\\n }\\r\\n // to parse SMS info from the device\\r\\n switch (messageTypeLocalCode) {\\r\\n case 'COMM-SMS': // SMS message sent in\\r\\n if (params.data.startsWith('Device location request')) {\\r\\n configsToAck.push(configIds.Controls.RealTimeLocate);\\r\\n } else if (params.data.startsWith('Set IP ok')) {\\r\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n } else if (params.data.startsWith('IMEI:')) {\\r\\n configsToAck.push(configIds.Controls.GetFirmwareVersion);\\r\\n } else if (params.data.startsWith('Set IP ok')) {\\r\\n configsToAck.push(configIds.Controls.ClearBufferedMessages);\\r\\n } else if (params.data.startsWith('flush ok')) {\\r\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n } else if (params.data.startsWith('Set Watch-')) {\\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 = (`Watch-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 = (`Watch;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 = (`Watch;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 = (`Watch-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 // return the object that contains your data\\r\\n return dataToReceiver;\\r\\n // end of main operation\\r\\n // define functions used in operation\\r\\n // decode global msg\\r\\n function decoder(str) { // decode rawdata\\r\\n // CARE Decoder\\r\\n //AddValue(codeValues, 'Message : ', str);\\r\\n var message = str;\\r\\n var index = 18;\\r\\n //parse header & properties\\r\\n var properties = message.substring(2, 4);\\r\\n var lengthLittleEndian = message.substring(4, 8);\\r\\n var total_length = lengthLittleEndian.substring(2, 4) + lengthLittleEndian.substring(0, 2);\\r\\n total_length = 2 * hexToDecimal(total_length.substring(0, 4));\\r\\n var sequenceID = message.substring(12, 16);\\r\\n var command = message.substring(16, 18);\\r\\n //mask bitwise (properties should be '10')\\r\\n if ((parseInt(properties) & 8) == 8) {\\r\\n needsAck = true;\\r\\n } else needsAck = false;\\r\\n // need to check if checksum is correct for possible msg corruption 10/03/23\\r\\n var checksum = message.substring(8, 12);\\r\\n var messageBody = message.substring(16, message.length);\\r\\n debug('message =' + message);\\r\\n debug('checksum =' + checksum);\\r\\n debug('calculateCheckSum =' + calculateCheckSum(messageBody));\\r\\n if (calculateCheckSum(messageBody) == checksum) { // payload is valid\\r\\n debug(\\\"message has valid checksum\\\");\\r\\n var messageBody = command; // update value for the ACK\\r\\n debug('command =' + command);\\r\\n if (command == '01') {\\r\\n while (index < total_length + 16) {\\r\\n 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\\r\\n if ((alarmCodeExtInt & 1) == 1) {\\r\\n var alarm = 'ALF-C';\\r\\n }\\r\\n // Welfare Check-out\\r\\n else if ((alarmCodeExtInt & 2) == 2) {\\r\\n var alarm = 'ALA-C';\\r\\n }\\r\\n // Standard Alerts\\r\\n //Battery low\\r\\n else if ((alarmCodeInt & 1) == 1) {\\r\\n var alarm = 'BATL';\\r\\n }\\r\\n //Overspeed\\r\\n else if ((alarmCodeInt & 2) == 2) {\\r\\n var alarm = 'ALSP';\\r\\n }\\r\\n //Fall\\r\\n else if ((alarmCodeInt & 4) == 4) {\\r\\n var alarm = 'ALF';\\r\\n }\\r\\n //Tilt\\r\\n else if ((alarmCodeInt & 8) == 8) {\\r\\n var alarm = 'TLT';\\r\\n } else if ((alarmCodeInt & 16) == 16) {\\r\\n if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n var alarm = 'Geo1-IN';\\r\\n } else {\\r\\n var alarm = 'Geo1-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 32) == 32) {\\r\\n if ((alarmCodeInt & 33554432) == 33554432) {\\r\\n var alarm = 'Geo2-IN';\\r\\n } else {\\r\\n var alarm = 'Geo2-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 64) == 64) {\\r\\n if ((alarmCodeInt & 67108864) == 67108864) {\\r\\n var alarm = 'Geo3-IN';\\r\\n } else {\\r\\n var alarm = 'Geo3-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 128) == 128) {\\r\\n if ((alarmCodeInt & 134217728) == 134217728) {\\r\\n var alarm = 'Geo4-IN';\\r\\n } else {\\r\\n var alarm = 'Geo4-OUT';\\r\\n }\\r\\n }\\r\\n //Power Off\\r\\n else if ((alarmCodeInt & 256) == 256) {\\r\\n var alarm = 'PWRF';\\r\\n }\\r\\n //Power On\\r\\n else if ((alarmCodeInt & 512) == 512) {\\r\\n var alarm = 'PWRN';\\r\\n }\\r\\n //Motion\\r\\n else if ((alarmCodeInt & 1024) == 1024) {\\r\\n var alarm = 'ALMOV';\\r\\n }\\r\\n //No Motion\\r\\n else if ((alarmCodeInt & 2048) == 2048) {\\r\\n var alarm = 'ALNM';\\r\\n }\\r\\n //SOS\\r\\n else if ((alarmCodeInt & 4096) == 4096) {\\r\\n var alarm = 'ALSOS';\\r\\n } else if ((alarmCodeInt & 8192) == 8192) {\\r\\n var alarm = 'Side1';\\r\\n } else if ((alarmCodeInt & 16384) == 16384) {\\r\\n var alarm = 'Side2';\\r\\n }\\r\\n //Battery charging\\r\\n else if ((alarmCodeInt & 32768) == 32768) {\\r\\n var alarm = 'BATCN';\\r\\n }\\r\\n //Battery no charging\\r\\n else if ((alarmCodeInt & 65536) == 65536) {\\r\\n var alarm = 'BATCF';\\r\\n }\\r\\n //SOS Ending\\r\\n // Temporary Commented until we know exactly how it works. 22/09/2022\\r\\n else if ((alarmCodeInt & 131072) == 131072) {\\r\\n var alarm = 'ALA-F';\\r\\n info = 'Alarm Finished';\\r\\n }\\r\\n //Amber Alert EC03 only\\r\\n else if ((alarmCodeInt & 262144) == 262144) {\\r\\n var alarm = 'ALA';\\r\\n }\\r\\n // welfare Alert check-in ALA-O\\r\\n else if ((alarmCodeInt & 524288) == 524288) {\\r\\n var alarm = 'ALA-O';\\r\\n }\\r\\n // Amber alert Ending ALA-C\\r\\n else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n var alarm = 'ALA-C';\\r\\n }\\r\\n // Amber alert Ending ALA-C\\r\\n //else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n // var alarm = 'ALA-C';\\r\\n //}\\r\\n // Fall-Down Alert ending\\r\\n else if ((alarmCodeInt & 2097152) == 2097152) {\\r\\n var alarm = 'ALF-C';\\r\\n }\\r\\n // welfare Alert Ending ALA\\r\\n else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n var alarm = 'ALA';\\r\\n }\\r\\n // Beacon absent Alert 11/10/22. Need to be added in msg types\\r\\n //else if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n // var alarm = 'BEA';\\r\\n //}\\r\\n general += 'alarm:' + alarm + ',';\\r\\n break;\\r\\n //Custom ID\\r\\n case '03':\\r\\n customID = value;\\r\\n if (!allowedCID.includes(value)) {\\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 //<>,<>,<>,<>,<>\\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 if (!allowedCID.includes(customID)) {\\r\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n AddValue(codeValues, \\\"customID\\\", customID);\\r\\n return\\r\\n }\\r\\n if (statusDevice) {\\r\\n messageForReceiver = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n }\\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;\\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 }\\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 = 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 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 var rawlabel = 'steps';\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=${rawlabel}`);\\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 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 var rawlabel = 'bpm';\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=${rawlabel}`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n }\\r\\n break;\\r\\n // SPO2\\r\\n case '41':\\r\\n var numSPO = (keyLength - 2) / 12;\\r\\n for (let j = 0; j < numSPO; 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 SPOHex = value.substring(8, 10);\\r\\n var SPO = hexToDecimal(SPOHex);\\r\\n var trustLevelHex = value.substring(10, 12);\\r\\n var trustLevel = hexToDecimal(trustLevelHex);\\r\\n info = SPO;\\r\\n //var alarmCode = 'True';\\r\\n var alarm = 'SPO2';\\r\\n general += ' SPO2 rate' + j + ':' + SPO + ',';\\r\\n var rawlabel = '%';\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};SPO2=${info};TLEVEL=${trustLevel};LABEL=${rawlabel}`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n }\\r\\n break;\\r\\n //BLE Connected . For Flic button\\r\\n case '62':\\r\\n location_type = 'BLE';\\r\\n //var alarm = 'EBZI'; \\r\\n //var latitudeHex = '00';\\r\\n //var longitudeHex = '00';\\r\\n //var descr = 'empty';\\r\\n var flag = hexToDecimal(value.substring(0, 2)); // 0= Disconnected, 1= Connected\\r\\n var mac = value.substring(2, 14); // No hace falta darle la vuelta\\r\\n // add : format in MAC\\r\\n mac = mac.match(/.{1,2}/g).join(':');\\r\\n var batLevel = hexToDecimal(value.substring(14, 16)); // 0-100\\r\\n //location_time = timestamp;\\r\\n ble_data = `${flag},${batLevel},${mac}`;\\r\\n general += 'BLE location (State):' + flag + ', (bat):' + batLevel + ', (mac):' + mac + ',';\\r\\n break;\\r\\n }\\r\\n }\\r\\n if (alarmCode) {\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch;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 = (`Watch;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': // Ringer Volume\\r\\n var volume = hexToDecimal(value);\\r\\n imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;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 = (`Watch;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 '0F': // Enable control.... Used for STEP COUNTING SETTINGS\\r\\n // 'FF FF 21 80'\\r\\n var StepStatus = hex2bin(value.substring(4, 6));\\r\\n var enalbleDisable = '';\\r\\n if (StepStatus.substring(7, 8) == '1') {\\r\\n var step = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var step = 'Disable, '\\r\\n };\\r\\n //var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n //hrate += detectingInterval;\\r\\n AddValue(codeValues, \\\"step\\\", step);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadStepsSettings.EnableDisableReadStepsSettings, enalbleDisable);\\r\\n //AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadStepsSettings.EnableDisableReadStepsSettings);\\r\\n //configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\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 = (`Watch;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 '34': //ContactList with name\\r\\n var contactNumber = value.substring(1, 2);\\r\\n var telLength = hexToDecimal(value.substring(2, 4));\\r\\n var tel = '';\\r\\n switch (contactNumber) {\\r\\n // Emergency Number\\r\\n case '0':\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n break;\\r\\n // Speed Dial Number\\r\\n //case '1':\\r\\n // tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n // AddValue(codeValues, \\\"SpeedDialNumber\\\", tel);\\r\\n // AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.SpeedDialNumber, tel);\\r\\n // configsToAck.push(configIds.ReadSpeedDialSettings.SpeedDialNumber);\\r\\n // break;\\r\\n // Gateway Number\\r\\n case '9': //00447781482635,Esendex UK 0034627177148,Esendex Spain 00447507288240,Esendex UK Acceptance\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n if (tel.includes('447781482635') || tel.includes('00447781482635')) {\\r\\n tel = 'Esendex UK'\\r\\n } else if (tel.includes('34627177148') || tel.includes('0034627177148')) {\\r\\n tel = 'Esendex Spain'\\r\\n } else if (tel.includes('447507288240') || tel.includes('00447507288240')) {\\r\\n tel = 'Esendex UK Acceptance'\\r\\n } else {\\r\\n tel = 'Default'\\r\\n }\\r\\n AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n break;\\r\\n default:\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n if (tel.length < 6) {\\r\\n contacts += '';\\r\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n break;\\r\\n }\\r\\n //contacts += 'A' + (contactNumber - 1) + ': ' + tel + ', ';\\r\\n contacts += tel + ', ';\\r\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n break;\\r\\n }\\r\\n break;\\r\\n case '40': // APN\\r\\n //no ACK need\\r\\n AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'));\\r\\n configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\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 = (`Watch;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 = (`Watch;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 '46': //HeartRate\\r\\n // '10 0E 00 80'\\r\\n var HeartRateStatus = hex2bin(value.substring(6, 8));\\r\\n var enalbleDisable = '';\\r\\n if (HeartRateStatus.substring(0, 1) == '1') {\\r\\n var hrate = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var hrate = 'Disable, '\\r\\n };\\r\\n var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n hrate += detectingInterval;\\r\\n AddValue(codeValues, \\\"hrate\\\", hrate);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings);\\r\\n configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\r\\n break;\\r\\n case '47': // Custom Id\\r\\n imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;ACK-CUSTID;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"customeid\\\", value);\\r\\n AddValue(configsToUpdate, configIds.ReadState.CustomId, hex_to_ascii(value)); //now it comes \\\"3036\\\"\\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 // commented until Eview fixes this function\\r\\n /*\\r\\n messageForReceiver = (`Watch;ACK-NOMOTION;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"nomotion\\\", alertSetting);\\r\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings, enableDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n configsToAck.push(configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings);\\r\\n configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n */\\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 = (`Watch;ACK-FALLALERT;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n var sesibityOptionValue = hexToDecimal(value.substring(1, 2));\\r\\n sensibility += sesibityOptionValue;\\r\\n AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n //AddValue(configsToUpdate, configIds.ReadAlertSettings.FallSettings, sensibility);\\r\\n AddValue(configsToUpdate, configIds.ReadFallSettings.EnableDisableFallSettings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadFallSettings.Sensitivity, sesibityOptionValue);\\r\\n //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n configsToAck.push(configIds.ReadFallSettings.EnableDisableFallSettings);\\r\\n configsToAck.push(configIds.ReadFallSettings.Sensitivity);\\r\\n break;\\r\\n case '73': //BeaconList\\r\\n var beaconNumber = hexToDecimal(value.substring(1, 2));\\r\\n var beaconStatus = hex2bin(value.substring(0, 1));\\r\\n beaconStatus = hex_to_ascii(value.substring(30, value.length));\\r\\n //beaconStatus = changeEndianness(value.substring(30, value.length));\\r\\n //homeBeacon += 'B' + (beaconNumber + 1) + ': ' + beaconStatus + ', ';\\r\\n homeBeacon += beaconStatus + ', ';\\r\\n AddValue(codeValues, \\\"homeBeacon\\\", homeBeacon);\\r\\n messageForReceiver = (`Watch;ACK-GDATA;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n break;\\r\\n case '4A': //Wifi Network List\\r\\n var wifiSSIDLenght = hexToDecimal(value.substring(2, 4));\\r\\n var wifiPasswordLenght = hexToDecimal(value.substring(4, 6));\\r\\n var wifiIndex = hexToDecimal(value.substring(1, 2));\\r\\n //var wifiStatus = hexToDecimal(value.substring(0, 1));\\r\\n var wifiStatus = value.substring(0, 1);\\r\\n /*var enalbleDisable = wifiSSID = wifiPassword = homeWifi = '';\\r\\n /var homeWifi = '';\\r\\n if (wifiIndex == '0') { // Only first Wifi of the list\\r\\n if (wifiStatus == '8') {\\r\\n homeWifi += ' Enable, '\\r\\n enalbleDisable = '1';\\r\\n } else {\\r\\n homeWifi += ' Disable, '\\r\\n //enalbleDisable = '0';\\r\\n };*/\\r\\n if ((wifiStatus == '8') || (wifiStatus == 'C')) { // 8 == ON OR C== ON and Connected\\r\\n var wifiSSID = hex_to_ascii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\r\\n var wifiPassword = hex_to_ascii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\r\\n var imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;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 = (`Watch;ACK-SPEED;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"speed\\\", alertSetting);\\r\\n AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\r\\n configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n break;\\r\\n case '7A': //[Length]:05 [Key]:7A [Value]:60 54 00 80\\r\\n // {\\\"spo2Interval\\\":{\\\"interval\\\":21600,\\\"status\\\":1}}\\r\\n var SPOStatus = hex2bin(value.substring(6, 8));\\r\\n var enalbleDisable = '';\\r\\n if (SPOStatus.substring(0, 1) == '1') {\\r\\n var spo = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var spo = 'Disable, '\\r\\n };\\r\\n var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n spo += detectingInterval;\\r\\n AddValue(codeValues, \\\"SPO2\\\", spo);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadSPO2Settings.EnableDisableReadSPO2Settings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadSPO2Settings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadSPO2Settings.EnableDisableReadSPO2Settings);\\r\\n configsToAck.push(configIds.ReadSPO2Settings.ReportingFrequency);\\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 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 = (`Watch-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 = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch-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 if (typeof configIds !== 'undefined' && configIds && configIds.ConfigureDevice && configIds.ConfigureDevice.LastConfigured) { // when is defined\\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 }\\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(hex) { // Hex to Ascii \\r\\n if (hex.length % 2 !== 0) {\\r\\n throw new Error(\\\"Hex string length must be even\\\");\\r\\n }\\r\\n let ascii = '';\\r\\n for (let i = 0; i < hex.length; i += 2) {\\r\\n const byte = hex.substr(i, 2);\\r\\n const charCode = parseInt(byte, 16);\\r\\n if (charCode !== 0) { // remove null character (\\\\u0000)\\r\\n ascii += String.fromCharCode(charCode);\\r\\n }\\r\\n }\\r\\n return ascii;\\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 normalizeLabels(raw) { // output labels as array\\r\\n if (!raw) return [];\\r\\n return [String(raw)];\\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}\\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":1765486097},{"Type":1,"NewValue":"{\"Id\":437,\"Name\":\"Access TEC Care Watch\",\"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 // Watch protocol - please see variables and typical values in order below\\r\\n // Watch-CYC;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;SIGNAL=<>;WM=<>;GENERAL=<>\\r\\n // Watch-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\r\\n //\\r\\n // Author: Juanmi Navarro\\r\\n // Created: 01/01/0000\\r\\n // Last modified: 18/09/2025\\r\\n //\\r\\n ///////////////////////////////////////////////////////////////////////////////\\r\\n if (typeof localTesting === \\\"undefined\\\") {\\r\\n let localTesting = false;\\r\\n }\\r\\n const crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,\\r\\n 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,\\r\\n 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,\\r\\n 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,\\r\\n 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,\\r\\n 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,\\r\\n 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,\\r\\n 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,\\r\\n 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,\\r\\n 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,\\r\\n 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,\\r\\n 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,\\r\\n 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,\\r\\n 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,\\r\\n 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,\\r\\n 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,\\r\\n 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,\\r\\n 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,\\r\\n 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,\\r\\n 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,\\r\\n 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,\\r\\n 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n ];\\r\\n var codeValues = [];\\r\\n AddValue(codeValues, 'protocol_template', 'Watch');\\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 = (`Watch-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 var allowedCID = ['3036', '06'];\\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 } else if (oystaTemplate == 'True') { // Oysta Template \\r\\n AddValue(codeValues, \\\"rawMsg\\\", raw);\\r\\n if ((params.rawlabel) && (params.rawlabel !== '')) { // decode label if exists\\r\\n //var labels = normalizeLabels(params.rawlabel); // \\\"steps\\\" -> [\\\"steps\\\"]\\r\\n //AddValue(codeValues, 'oysta_labels', labels);\\r\\n AddValue(codeValues, \\\"oysta_labels\\\", params.rawlabel);\\r\\n }\\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 //<>,<>,<> \\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];\\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 //<>,<>,<> \\r\\n if (mac2) {\\r\\n AddValue(codeValues, 'beacon_mac', mac2);\\r\\n var simpleQuery2 = [{\\r\\n 'code': 'Mac',\\r\\n 'value': mac2,\\r\\n }];\\r\\n var simpleQueryLabel2 = {\\r\\n 'table': 'beacons',\\r\\n 'select': 'Name',\\r\\n 'query': simpleQuery2\\r\\n };\\r\\n var labels2 = [];\\r\\n labels2.push(JSON.stringify(simpleQueryLabel2));\\r\\n AddValue(codeValues, 'oysta_labels', JSON.stringify(labels2));\\r\\n }\\r\\n if (params.beacon_major) {\\r\\n AddValue(codeValues, 'beacon_major', params.beacon_major);\\r\\n } else {\\r\\n AddValue(codeValues, 'beacon_major', 0);\\r\\n }\\r\\n if (params.beacon_minor) {\\r\\n AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\r\\n } else {\\r\\n AddValue(codeValues, 'beacon_minor', 0);\\r\\n }\\r\\n //AddValue(codeValues,'oysta_labels', label);\\r\\n //AddValue(codeValues,'oysta_value', mac);\\r\\n }\\r\\n /* meter mas tarde... \\r\\n if (params.smart_data !== 'undefined') {\\r\\n var gen_location = params.smart_data.split(',')\\r\\n var latitude = gen_location[0]\\r\\n var longitude = gen_location[1]\\r\\n var location_accuracy = gen_location[2]\\r\\n var altitude = gen_location[3]\\r\\n AddValue(codeValues,'latitude', latitude);\\r\\n AddValue(codeValues,'longitude', longitude);\\r\\n AddValue(codeValues,'altitude', altitude);\\r\\n AddValue(codeValues,'location_accuracy', location_accuracy);\\r\\n }\\r\\n */\\r\\n /*else if ((params.event_time) && (params.event_time == '')) {\\r\\n var event_time = moment.utc().unix();\\r\\n AddValue(codeValues,'event_time', event_time);\\r\\n } revisar mas adelante*/\\r\\n if (params.location_time) {\\r\\n AddValue(codeValues, 'location_time', params.location_time);\\r\\n }\\r\\n if (params.event_time) {\\r\\n AddValue(codeValues, 'event_time', params.event_time);\\r\\n }\\r\\n // to parse SMS info from the device\\r\\n switch (messageTypeLocalCode) {\\r\\n case 'COMM-SMS': // SMS message sent in\\r\\n if (params.data.startsWith('Device location request')) {\\r\\n configsToAck.push(configIds.Controls.RealTimeLocate);\\r\\n } else if (params.data.startsWith('Set IP ok')) {\\r\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n } else if (params.data.startsWith('IMEI:')) {\\r\\n configsToAck.push(configIds.Controls.GetFirmwareVersion);\\r\\n } else if (params.data.startsWith('Set IP ok')) {\\r\\n configsToAck.push(configIds.Controls.ClearBufferedMessages);\\r\\n } else if (params.data.startsWith('flush ok')) {\\r\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n } else if (params.data.startsWith('Set Watch-')) {\\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 = (`Watch-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 = (`Watch;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 = (`Watch;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 = (`Watch-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(JSON.stringify(dataToReceiver));\\r\\n // return the object that contains your data\\r\\n return dataToReceiver;\\r\\n // end of main operation\\r\\n // define functions used in operation\\r\\n // decode global msg\\r\\n function decoder(str) { // decode rawdata\\r\\n // CARE Decoder\\r\\n //AddValue(codeValues, 'Message : ', str);\\r\\n var message = str;\\r\\n var index = 18;\\r\\n //parse header & properties\\r\\n var properties = message.substring(2, 4);\\r\\n var lengthLittleEndian = message.substring(4, 8);\\r\\n var total_length = lengthLittleEndian.substring(2, 4) + lengthLittleEndian.substring(0, 2);\\r\\n total_length = 2 * hexToDecimal(total_length.substring(0, 4));\\r\\n var sequenceID = message.substring(12, 16);\\r\\n var command = message.substring(16, 18);\\r\\n //mask bitwise (properties should be '10')\\r\\n if ((parseInt(properties) & 8) == 8) {\\r\\n needsAck = true;\\r\\n } else needsAck = false;\\r\\n // need to check if checksum is correct for possible msg corruption 10/03/23\\r\\n var checksum = message.substring(8, 12);\\r\\n var messageBody = message.substring(16, message.length);\\r\\n debug('message =' + message);\\r\\n debug('checksum =' + checksum);\\r\\n debug('calculateCheckSum =' + calculateCheckSum(messageBody));\\r\\n if (calculateCheckSum(messageBody) == checksum) { // payload is valid\\r\\n debug(\\\"message has valid checksum\\\");\\r\\n var messageBody = command; // update value for the ACK\\r\\n debug('command =' + command);\\r\\n if (command == '01') {\\r\\n while (index < total_length + 16) {\\r\\n 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\\r\\n if ((alarmCodeExtInt & 1) == 1) {\\r\\n var alarm = 'ALF-C';\\r\\n }\\r\\n // Welfare Check-out\\r\\n else if ((alarmCodeExtInt & 2) == 2) {\\r\\n var alarm = 'ALA-C';\\r\\n }\\r\\n // Standard Alerts\\r\\n //Battery low\\r\\n else if ((alarmCodeInt & 1) == 1) {\\r\\n var alarm = 'BATL';\\r\\n }\\r\\n //Overspeed\\r\\n else if ((alarmCodeInt & 2) == 2) {\\r\\n var alarm = 'ALSP';\\r\\n }\\r\\n //Fall\\r\\n else if ((alarmCodeInt & 4) == 4) {\\r\\n var alarm = 'ALF';\\r\\n }\\r\\n //Tilt\\r\\n else if ((alarmCodeInt & 8) == 8) {\\r\\n var alarm = 'TLT';\\r\\n } else if ((alarmCodeInt & 16) == 16) {\\r\\n if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n var alarm = 'Geo1-IN';\\r\\n } else {\\r\\n var alarm = 'Geo1-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 32) == 32) {\\r\\n if ((alarmCodeInt & 33554432) == 33554432) {\\r\\n var alarm = 'Geo2-IN';\\r\\n } else {\\r\\n var alarm = 'Geo2-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 64) == 64) {\\r\\n if ((alarmCodeInt & 67108864) == 67108864) {\\r\\n var alarm = 'Geo3-IN';\\r\\n } else {\\r\\n var alarm = 'Geo3-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 128) == 128) {\\r\\n if ((alarmCodeInt & 134217728) == 134217728) {\\r\\n var alarm = 'Geo4-IN';\\r\\n } else {\\r\\n var alarm = 'Geo4-OUT';\\r\\n }\\r\\n }\\r\\n //Power Off\\r\\n else if ((alarmCodeInt & 256) == 256) {\\r\\n var alarm = 'PWRF';\\r\\n }\\r\\n //Power On\\r\\n else if ((alarmCodeInt & 512) == 512) {\\r\\n var alarm = 'PWRN';\\r\\n }\\r\\n //Motion\\r\\n else if ((alarmCodeInt & 1024) == 1024) {\\r\\n var alarm = 'ALMOV';\\r\\n }\\r\\n //No Motion\\r\\n else if ((alarmCodeInt & 2048) == 2048) {\\r\\n var alarm = 'ALNM';\\r\\n }\\r\\n //SOS\\r\\n else if ((alarmCodeInt & 4096) == 4096) {\\r\\n var alarm = 'ALSOS';\\r\\n } else if ((alarmCodeInt & 8192) == 8192) {\\r\\n var alarm = 'Side1';\\r\\n } else if ((alarmCodeInt & 16384) == 16384) {\\r\\n var alarm = 'Side2';\\r\\n }\\r\\n //Battery charging\\r\\n else if ((alarmCodeInt & 32768) == 32768) {\\r\\n var alarm = 'BATCN';\\r\\n }\\r\\n //Battery no charging\\r\\n else if ((alarmCodeInt & 65536) == 65536) {\\r\\n var alarm = 'BATCF';\\r\\n }\\r\\n //SOS Ending\\r\\n // Temporary Commented until we know exactly how it works. 22/09/2022\\r\\n else if ((alarmCodeInt & 131072) == 131072) {\\r\\n var alarm = 'ALA-F';\\r\\n info = 'Alarm Finished';\\r\\n }\\r\\n //Amber Alert EC03 only\\r\\n else if ((alarmCodeInt & 262144) == 262144) {\\r\\n var alarm = 'ALA';\\r\\n }\\r\\n // welfare Alert check-in ALA-O\\r\\n else if ((alarmCodeInt & 524288) == 524288) {\\r\\n var alarm = 'ALA-O';\\r\\n }\\r\\n // Amber alert Ending ALA-C\\r\\n else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n var alarm = 'ALA-C';\\r\\n }\\r\\n // Amber alert Ending ALA-C\\r\\n //else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n // var alarm = 'ALA-C';\\r\\n //}\\r\\n // Fall-Down Alert ending\\r\\n else if ((alarmCodeInt & 2097152) == 2097152) {\\r\\n var alarm = 'ALF-C';\\r\\n }\\r\\n // welfare Alert Ending ALA\\r\\n else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n var alarm = 'ALA';\\r\\n }\\r\\n // Beacon absent Alert 11/10/22. Need to be added in msg types\\r\\n //else if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n // var alarm = 'BEA';\\r\\n //}\\r\\n general += 'alarm:' + alarm + ',';\\r\\n break;\\r\\n //Custom ID\\r\\n case '03':\\r\\n customID = value;\\r\\n if (!allowedCID.includes(value)) {\\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 //<>,<>,<>,<>,<>\\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 if (!allowedCID.includes(customID)) {\\r\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n AddValue(codeValues, \\\"customID\\\", customID);\\r\\n return\\r\\n }\\r\\n if (statusDevice) {\\r\\n messageForReceiver = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n }\\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;\\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 }\\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 = 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 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 var rawlabel = 'steps';\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=${rawlabel}`);\\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 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 var rawlabel = 'bpm';\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=${rawlabel}`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n }\\r\\n break;\\r\\n // SPO2\\r\\n case '41':\\r\\n var numSPO = (keyLength - 2) / 12;\\r\\n for (let j = 0; j < numSPO; 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 SPOHex = value.substring(8, 10);\\r\\n var SPO = hexToDecimal(SPOHex);\\r\\n var trustLevelHex = value.substring(10, 12);\\r\\n var trustLevel = hexToDecimal(trustLevelHex);\\r\\n info = SPO;\\r\\n //var alarmCode = 'True';\\r\\n var alarm = 'SPO2';\\r\\n general += ' SPO2 rate' + j + ':' + SPO + ',';\\r\\n var rawlabel = '%';\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};SPO2=${info};TLEVEL=${trustLevel};LABEL=${rawlabel}`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n }\\r\\n break;\\r\\n //BLE Connected . For Flic button\\r\\n case '62':\\r\\n location_type = 'BLE';\\r\\n //var alarm = 'EBZI'; \\r\\n //var latitudeHex = '00';\\r\\n //var longitudeHex = '00';\\r\\n //var descr = 'empty';\\r\\n var flag = hexToDecimal(value.substring(0, 2)); // 0= Disconnected, 1= Connected\\r\\n var mac = value.substring(2, 14); // No hace falta darle la vuelta\\r\\n // add : format in MAC\\r\\n mac = mac.match(/.{1,2}/g).join(':');\\r\\n var batLevel = hexToDecimal(value.substring(14, 16)); // 0-100\\r\\n //location_time = timestamp;\\r\\n ble_data = `${flag},${batLevel},${mac}`;\\r\\n general += 'BLE location (State):' + flag + ', (bat):' + batLevel + ', (mac):' + mac + ',';\\r\\n break;\\r\\n }\\r\\n }\\r\\n if (alarmCode) {\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch;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 = (`Watch;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': // Ringer Volume\\r\\n var volume = hexToDecimal(value);\\r\\n imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;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 = (`Watch;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 '0F': // Enable control.... Used for STEP COUNTING SETTINGS\\r\\n // 'FF FF 21 80'\\r\\n var StepStatus = hex2bin(value.substring(4, 6));\\r\\n var enalbleDisable = '';\\r\\n if (StepStatus.substring(7, 8) == '1') {\\r\\n var step = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var step = 'Disable, '\\r\\n };\\r\\n //var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n //hrate += detectingInterval;\\r\\n AddValue(codeValues, \\\"step\\\", step);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadStepsSettings.EnableDisableReadStepsSettings, enalbleDisable);\\r\\n //AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadStepsSettings.EnableDisableReadStepsSettings);\\r\\n //configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\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 = (`Watch;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 '34': //ContactList with name\\r\\n var contactNumber = value.substring(1, 2);\\r\\n var telLength = hexToDecimal(value.substring(2, 4));\\r\\n var tel = '';\\r\\n switch (contactNumber) {\\r\\n // Emergency Number\\r\\n case '0':\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n break;\\r\\n // Speed Dial Number\\r\\n //case '1':\\r\\n // tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n // AddValue(codeValues, \\\"SpeedDialNumber\\\", tel);\\r\\n // AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.SpeedDialNumber, tel);\\r\\n // configsToAck.push(configIds.ReadSpeedDialSettings.SpeedDialNumber);\\r\\n // break;\\r\\n // Gateway Number\\r\\n case '9': //00447781482635,Esendex UK 0034627177148,Esendex Spain 00447507288240,Esendex UK Acceptance\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n if (tel.includes('447781482635') || tel.includes('00447781482635')) {\\r\\n tel = 'Esendex UK'\\r\\n } else if (tel.includes('34627177148') || tel.includes('0034627177148')) {\\r\\n tel = 'Esendex Spain'\\r\\n } else if (tel.includes('447507288240') || tel.includes('00447507288240')) {\\r\\n tel = 'Esendex UK Acceptance'\\r\\n } else {\\r\\n tel = 'Default'\\r\\n }\\r\\n AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n break;\\r\\n default:\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n if (tel.length < 6) {\\r\\n contacts += '';\\r\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n break;\\r\\n }\\r\\n //contacts += 'A' + (contactNumber - 1) + ': ' + tel + ', ';\\r\\n contacts += tel + ', ';\\r\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n break;\\r\\n }\\r\\n break;\\r\\n case '40': // APN\\r\\n //no ACK need\\r\\n AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'));\\r\\n configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\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 = (`Watch;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 = (`Watch;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 '46': //HeartRate\\r\\n // '10 0E 00 80'\\r\\n var HeartRateStatus = hex2bin(value.substring(6, 8));\\r\\n var enalbleDisable = '';\\r\\n if (HeartRateStatus.substring(0, 1) == '1') {\\r\\n var hrate = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var hrate = 'Disable, '\\r\\n };\\r\\n var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n hrate += detectingInterval;\\r\\n AddValue(codeValues, \\\"hrate\\\", hrate);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings);\\r\\n configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\r\\n break;\\r\\n case '47': // Custom Id\\r\\n imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;ACK-CUSTID;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"customeid\\\", value);\\r\\n AddValue(configsToUpdate, configIds.ReadState.CustomId, hex_to_ascii(value)); //now it comes \\\"3036\\\"\\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 // commented until Eview fixes this function\\r\\n /*\\r\\n messageForReceiver = (`Watch;ACK-NOMOTION;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"nomotion\\\", alertSetting);\\r\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings, enableDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n configsToAck.push(configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings);\\r\\n configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n */\\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 = (`Watch;ACK-FALLALERT;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n var sesibityOptionValue = hexToDecimal(value.substring(1, 2));\\r\\n sensibility += sesibityOptionValue;\\r\\n AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n //AddValue(configsToUpdate, configIds.ReadAlertSettings.FallSettings, sensibility);\\r\\n AddValue(configsToUpdate, configIds.ReadFallSettings.EnableDisableFallSettings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadFallSettings.Sensitivity, sesibityOptionValue);\\r\\n //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n configsToAck.push(configIds.ReadFallSettings.EnableDisableFallSettings);\\r\\n configsToAck.push(configIds.ReadFallSettings.Sensitivity);\\r\\n break;\\r\\n case '73': //BeaconList\\r\\n var beaconNumber = hexToDecimal(value.substring(1, 2));\\r\\n var beaconStatus = hex2bin(value.substring(0, 1));\\r\\n beaconStatus = hex_to_ascii(value.substring(30, value.length));\\r\\n //beaconStatus = changeEndianness(value.substring(30, value.length));\\r\\n //homeBeacon += 'B' + (beaconNumber + 1) + ': ' + beaconStatus + ', ';\\r\\n homeBeacon += beaconStatus + ', ';\\r\\n AddValue(codeValues, \\\"homeBeacon\\\", homeBeacon);\\r\\n messageForReceiver = (`Watch;ACK-GDATA;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n break;\\r\\n case '4A': //Wifi Network List\\r\\n var wifiSSIDLenght = hexToDecimal(value.substring(2, 4));\\r\\n var wifiPasswordLenght = hexToDecimal(value.substring(4, 6));\\r\\n var wifiIndex = hexToDecimal(value.substring(1, 2));\\r\\n //var wifiStatus = hexToDecimal(value.substring(0, 1));\\r\\n var wifiStatus = value.substring(0, 1);\\r\\n /*var enalbleDisable = wifiSSID = wifiPassword = homeWifi = '';\\r\\n /var homeWifi = '';\\r\\n if (wifiIndex == '0') { // Only first Wifi of the list\\r\\n if (wifiStatus == '8') {\\r\\n homeWifi += ' Enable, '\\r\\n enalbleDisable = '1';\\r\\n } else {\\r\\n homeWifi += ' Disable, '\\r\\n //enalbleDisable = '0';\\r\\n };*/\\r\\n if ((wifiStatus == '8') || (wifiStatus == 'C')) { // 8 == ON OR C== ON and Connected\\r\\n var wifiSSID = hex_to_ascii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\r\\n var wifiPassword = hex_to_ascii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\r\\n var imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;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 = (`Watch;ACK-SPEED;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"speed\\\", alertSetting);\\r\\n AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\r\\n configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n break;\\r\\n case '7A': //[Length]:05 [Key]:7A [Value]:60 54 00 80\\r\\n // {\\\"spo2Interval\\\":{\\\"interval\\\":21600,\\\"status\\\":1}}\\r\\n var SPOStatus = hex2bin(value.substring(6, 8));\\r\\n var enalbleDisable = '';\\r\\n if (SPOStatus.substring(0, 1) == '1') {\\r\\n var spo = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var spo = 'Disable, '\\r\\n };\\r\\n var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n spo += detectingInterval;\\r\\n AddValue(codeValues, \\\"SPO2\\\", spo);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadSPO2Settings.EnableDisableReadSPO2Settings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadSPO2Settings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadSPO2Settings.EnableDisableReadSPO2Settings);\\r\\n configsToAck.push(configIds.ReadSPO2Settings.ReportingFrequency);\\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 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 = (`Watch-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 = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch-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 if (typeof configIds !== 'undefined' && configIds && configIds.ConfigureDevice && configIds.ConfigureDevice.LastConfigured) { // when is defined\\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 }\\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(hex) { // Hex to Ascii \\r\\n if (hex.length % 2 !== 0) {\\r\\n throw new Error(\\\"Hex string length must be even\\\");\\r\\n }\\r\\n let ascii = '';\\r\\n for (let i = 0; i < hex.length; i += 2) {\\r\\n const byte = hex.substr(i, 2);\\r\\n const charCode = parseInt(byte, 16);\\r\\n if (charCode !== 0) { // remove null character (\\\\u0000)\\r\\n ascii += String.fromCharCode(charCode);\\r\\n }\\r\\n }\\r\\n return ascii;\\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 normalizeLabels(raw) { // output labels as array\\r\\n if (!raw) return [];\\r\\n return [String(raw)];\\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}\\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":1765522431},{"Type":1,"NewValue":"{\"Id\":437,\"Name\":\"Access TEC Care Watch\",\"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 // Watch protocol - please see variables and typical values in order below\\r\\n // Watch-CYC;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;SIGNAL=<>;WM=<>;GENERAL=<>\\r\\n // Watch-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\r\\n //\\r\\n // Author: Juanmi Navarro\\r\\n // Created: 01/01/0000\\r\\n // Last modified: 18/09/2025\\r\\n //\\r\\n ///////////////////////////////////////////////////////////////////////////////\\r\\n if (typeof localTesting === \\\"undefined\\\") {\\r\\n let localTesting = false;\\r\\n }\\r\\n const crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,\\r\\n 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,\\r\\n 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,\\r\\n 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,\\r\\n 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,\\r\\n 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,\\r\\n 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,\\r\\n 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,\\r\\n 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,\\r\\n 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,\\r\\n 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,\\r\\n 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,\\r\\n 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,\\r\\n 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,\\r\\n 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,\\r\\n 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,\\r\\n 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,\\r\\n 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,\\r\\n 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,\\r\\n 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,\\r\\n 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,\\r\\n 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n ];\\r\\n var codeValues = [];\\r\\n AddValue(codeValues, \\\"protocol_template\\\", \\\"Watch\\\");\\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 = (`Watch-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 var allowedCID = ['3036', '06'];\\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 } else if (oystaTemplate == 'True') { // Oysta Template \\r\\n AddValue(codeValues, \\\"rawMsg\\\", raw);\\r\\n if ((params.rawlabel) && (params.rawlabel !== '')) { // decode label if exists\\r\\n var labels = normalizeLabels(params.rawlabel); // \\\"steps\\\" -> [\\\"steps\\\"]\\r\\n AddValue(codeValues, \\\"oysta_labels\\\", labels);\\r\\n //AddValue(codeValues, \\\"oysta_labels\\\", params.rawlabel);\\r\\n }\\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 //<>,<>,<> \\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];\\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 //<>,<>,<> \\r\\n if (mac2) {\\r\\n AddValue(codeValues, 'beacon_mac', mac2);\\r\\n var simpleQuery2 = [{\\r\\n 'code': 'Mac',\\r\\n 'value': mac2,\\r\\n }];\\r\\n var simpleQueryLabel2 = {\\r\\n 'table': 'beacons',\\r\\n 'select': 'Name',\\r\\n 'query': simpleQuery2\\r\\n };\\r\\n var labels2 = [];\\r\\n labels2.push(JSON.stringify(simpleQueryLabel2));\\r\\n AddValue(codeValues, 'oysta_labels', JSON.stringify(labels2));\\r\\n }\\r\\n if (params.beacon_major) {\\r\\n AddValue(codeValues, 'beacon_major', params.beacon_major);\\r\\n } else {\\r\\n AddValue(codeValues, 'beacon_major', 0);\\r\\n }\\r\\n if (params.beacon_minor) {\\r\\n AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\r\\n } else {\\r\\n AddValue(codeValues, 'beacon_minor', 0);\\r\\n }\\r\\n //AddValue(codeValues,'oysta_labels', label);\\r\\n //AddValue(codeValues,'oysta_value', mac);\\r\\n }\\r\\n /* meter mas tarde... \\r\\n if (params.smart_data !== 'undefined') {\\r\\n var gen_location = params.smart_data.split(',')\\r\\n var latitude = gen_location[0]\\r\\n var longitude = gen_location[1]\\r\\n var location_accuracy = gen_location[2]\\r\\n var altitude = gen_location[3]\\r\\n AddValue(codeValues,'latitude', latitude);\\r\\n AddValue(codeValues,'longitude', longitude);\\r\\n AddValue(codeValues,'altitude', altitude);\\r\\n AddValue(codeValues,'location_accuracy', location_accuracy);\\r\\n }\\r\\n */\\r\\n /*else if ((params.event_time) && (params.event_time == '')) {\\r\\n var event_time = moment.utc().unix();\\r\\n AddValue(codeValues,'event_time', event_time);\\r\\n } revisar mas adelante*/\\r\\n if (params.location_time) {\\r\\n AddValue(codeValues, 'location_time', params.location_time);\\r\\n }\\r\\n if (params.event_time) {\\r\\n AddValue(codeValues, 'event_time', params.event_time);\\r\\n }\\r\\n // to parse SMS info from the device\\r\\n switch (messageTypeLocalCode) {\\r\\n case 'COMM-SMS': // SMS message sent in\\r\\n if (params.data.startsWith('Device location request')) {\\r\\n configsToAck.push(configIds.Controls.RealTimeLocate);\\r\\n } else if (params.data.startsWith('Set IP ok')) {\\r\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n } else if (params.data.startsWith('IMEI:')) {\\r\\n configsToAck.push(configIds.Controls.GetFirmwareVersion);\\r\\n } else if (params.data.startsWith('Set IP ok')) {\\r\\n configsToAck.push(configIds.Controls.ClearBufferedMessages);\\r\\n } else if (params.data.startsWith('flush ok')) {\\r\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n } else if (params.data.startsWith('Set Watch-')) {\\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 = (`Watch-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 = (`Watch;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 = (`Watch;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 = (`Watch-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(JSON.stringify(dataToReceiver));\\r\\n // return the object that contains your data\\r\\n return dataToReceiver;\\r\\n // end of main operation\\r\\n // define functions used in operation\\r\\n // decode global msg\\r\\n function decoder(str) { // decode rawdata\\r\\n // CARE Decoder\\r\\n //AddValue(codeValues, 'Message : ', str);\\r\\n var message = str;\\r\\n var index = 18;\\r\\n //parse header & properties\\r\\n var properties = message.substring(2, 4);\\r\\n var lengthLittleEndian = message.substring(4, 8);\\r\\n var total_length = lengthLittleEndian.substring(2, 4) + lengthLittleEndian.substring(0, 2);\\r\\n total_length = 2 * hexToDecimal(total_length.substring(0, 4));\\r\\n var sequenceID = message.substring(12, 16);\\r\\n var command = message.substring(16, 18);\\r\\n //mask bitwise (properties should be '10')\\r\\n if ((parseInt(properties) & 8) == 8) {\\r\\n needsAck = true;\\r\\n } else needsAck = false;\\r\\n // need to check if checksum is correct for possible msg corruption 10/03/23\\r\\n var checksum = message.substring(8, 12);\\r\\n var messageBody = message.substring(16, message.length);\\r\\n debug('message =' + message);\\r\\n debug('checksum =' + checksum);\\r\\n debug('calculateCheckSum =' + calculateCheckSum(messageBody));\\r\\n if (calculateCheckSum(messageBody) == checksum) { // payload is valid\\r\\n debug(\\\"message has valid checksum\\\");\\r\\n var messageBody = command; // update value for the ACK\\r\\n debug('command =' + command);\\r\\n if (command == '01') {\\r\\n while (index < total_length + 16) {\\r\\n 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\\r\\n if ((alarmCodeExtInt & 1) == 1) {\\r\\n var alarm = 'ALF-C';\\r\\n }\\r\\n // Welfare Check-out\\r\\n else if ((alarmCodeExtInt & 2) == 2) {\\r\\n var alarm = 'ALA-C';\\r\\n }\\r\\n // Standard Alerts\\r\\n //Battery low\\r\\n else if ((alarmCodeInt & 1) == 1) {\\r\\n var alarm = 'BATL';\\r\\n }\\r\\n //Overspeed\\r\\n else if ((alarmCodeInt & 2) == 2) {\\r\\n var alarm = 'ALSP';\\r\\n }\\r\\n //Fall\\r\\n else if ((alarmCodeInt & 4) == 4) {\\r\\n var alarm = 'ALF';\\r\\n }\\r\\n //Tilt\\r\\n else if ((alarmCodeInt & 8) == 8) {\\r\\n var alarm = 'TLT';\\r\\n } else if ((alarmCodeInt & 16) == 16) {\\r\\n if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n var alarm = 'Geo1-IN';\\r\\n } else {\\r\\n var alarm = 'Geo1-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 32) == 32) {\\r\\n if ((alarmCodeInt & 33554432) == 33554432) {\\r\\n var alarm = 'Geo2-IN';\\r\\n } else {\\r\\n var alarm = 'Geo2-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 64) == 64) {\\r\\n if ((alarmCodeInt & 67108864) == 67108864) {\\r\\n var alarm = 'Geo3-IN';\\r\\n } else {\\r\\n var alarm = 'Geo3-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 128) == 128) {\\r\\n if ((alarmCodeInt & 134217728) == 134217728) {\\r\\n var alarm = 'Geo4-IN';\\r\\n } else {\\r\\n var alarm = 'Geo4-OUT';\\r\\n }\\r\\n }\\r\\n //Power Off\\r\\n else if ((alarmCodeInt & 256) == 256) {\\r\\n var alarm = 'PWRF';\\r\\n }\\r\\n //Power On\\r\\n else if ((alarmCodeInt & 512) == 512) {\\r\\n var alarm = 'PWRN';\\r\\n }\\r\\n //Motion\\r\\n else if ((alarmCodeInt & 1024) == 1024) {\\r\\n var alarm = 'ALMOV';\\r\\n }\\r\\n //No Motion\\r\\n else if ((alarmCodeInt & 2048) == 2048) {\\r\\n var alarm = 'ALNM';\\r\\n }\\r\\n //SOS\\r\\n else if ((alarmCodeInt & 4096) == 4096) {\\r\\n var alarm = 'ALSOS';\\r\\n } else if ((alarmCodeInt & 8192) == 8192) {\\r\\n var alarm = 'Side1';\\r\\n } else if ((alarmCodeInt & 16384) == 16384) {\\r\\n var alarm = 'Side2';\\r\\n }\\r\\n //Battery charging\\r\\n else if ((alarmCodeInt & 32768) == 32768) {\\r\\n var alarm = 'BATCN';\\r\\n }\\r\\n //Battery no charging\\r\\n else if ((alarmCodeInt & 65536) == 65536) {\\r\\n var alarm = 'BATCF';\\r\\n }\\r\\n //SOS Ending\\r\\n // Temporary Commented until we know exactly how it works. 22/09/2022\\r\\n else if ((alarmCodeInt & 131072) == 131072) {\\r\\n var alarm = 'ALA-F';\\r\\n info = 'Alarm Finished';\\r\\n }\\r\\n //Amber Alert EC03 only\\r\\n else if ((alarmCodeInt & 262144) == 262144) {\\r\\n var alarm = 'ALA';\\r\\n }\\r\\n // welfare Alert check-in ALA-O\\r\\n else if ((alarmCodeInt & 524288) == 524288) {\\r\\n var alarm = 'ALA-O';\\r\\n }\\r\\n // Amber alert Ending ALA-C\\r\\n else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n var alarm = 'ALA-C';\\r\\n }\\r\\n // Amber alert Ending ALA-C\\r\\n //else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n // var alarm = 'ALA-C';\\r\\n //}\\r\\n // Fall-Down Alert ending\\r\\n else if ((alarmCodeInt & 2097152) == 2097152) {\\r\\n var alarm = 'ALF-C';\\r\\n }\\r\\n // welfare Alert Ending ALA\\r\\n else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n var alarm = 'ALA';\\r\\n }\\r\\n // Beacon absent Alert 11/10/22. Need to be added in msg types\\r\\n //else if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n // var alarm = 'BEA';\\r\\n //}\\r\\n general += 'alarm:' + alarm + ',';\\r\\n break;\\r\\n //Custom ID\\r\\n case '03':\\r\\n customID = value;\\r\\n if (!allowedCID.includes(value)) {\\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 //<>,<>,<>,<>,<>\\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 if (!allowedCID.includes(customID)) {\\r\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n AddValue(codeValues, \\\"customID\\\", customID);\\r\\n return\\r\\n }\\r\\n if (statusDevice) {\\r\\n messageForReceiver = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n }\\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;\\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 }\\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 = 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 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 var rawlabel = 'steps';\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=${rawlabel}`);\\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 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 var rawlabel = 'bpm';\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=${rawlabel}`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n }\\r\\n break;\\r\\n // SPO2\\r\\n case '41':\\r\\n var numSPO = (keyLength - 2) / 12;\\r\\n for (let j = 0; j < numSPO; 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 SPOHex = value.substring(8, 10);\\r\\n var SPO = hexToDecimal(SPOHex);\\r\\n var trustLevelHex = value.substring(10, 12);\\r\\n var trustLevel = hexToDecimal(trustLevelHex);\\r\\n info = SPO;\\r\\n //var alarmCode = 'True';\\r\\n var alarm = 'SPO2';\\r\\n general += ' SPO2 rate' + j + ':' + SPO + ',';\\r\\n var rawlabel = '%';\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};SPO2=${info};TLEVEL=${trustLevel};LABEL=${rawlabel}`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n }\\r\\n break;\\r\\n //BLE Connected . For Flic button\\r\\n case '62':\\r\\n location_type = 'BLE';\\r\\n //var alarm = 'EBZI'; \\r\\n //var latitudeHex = '00';\\r\\n //var longitudeHex = '00';\\r\\n //var descr = 'empty';\\r\\n var flag = hexToDecimal(value.substring(0, 2)); // 0= Disconnected, 1= Connected\\r\\n var mac = value.substring(2, 14); // No hace falta darle la vuelta\\r\\n // add : format in MAC\\r\\n mac = mac.match(/.{1,2}/g).join(':');\\r\\n var batLevel = hexToDecimal(value.substring(14, 16)); // 0-100\\r\\n //location_time = timestamp;\\r\\n ble_data = `${flag},${batLevel},${mac}`;\\r\\n general += 'BLE location (State):' + flag + ', (bat):' + batLevel + ', (mac):' + mac + ',';\\r\\n break;\\r\\n }\\r\\n }\\r\\n if (alarmCode) {\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch;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 = (`Watch;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': // Ringer Volume\\r\\n var volume = hexToDecimal(value);\\r\\n imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;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 = (`Watch;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 '0F': // Enable control.... Used for STEP COUNTING SETTINGS\\r\\n // 'FF FF 21 80'\\r\\n var StepStatus = hex2bin(value.substring(4, 6));\\r\\n var enalbleDisable = '';\\r\\n if (StepStatus.substring(7, 8) == '1') {\\r\\n var step = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var step = 'Disable, '\\r\\n };\\r\\n //var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n //hrate += detectingInterval;\\r\\n AddValue(codeValues, \\\"step\\\", step);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadStepsSettings.EnableDisableReadStepsSettings, enalbleDisable);\\r\\n //AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadStepsSettings.EnableDisableReadStepsSettings);\\r\\n //configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\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 = (`Watch;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 '34': //ContactList with name\\r\\n var contactNumber = value.substring(1, 2);\\r\\n var telLength = hexToDecimal(value.substring(2, 4));\\r\\n var tel = '';\\r\\n switch (contactNumber) {\\r\\n // Emergency Number\\r\\n case '0':\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n break;\\r\\n // Speed Dial Number\\r\\n //case '1':\\r\\n // tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n // AddValue(codeValues, \\\"SpeedDialNumber\\\", tel);\\r\\n // AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.SpeedDialNumber, tel);\\r\\n // configsToAck.push(configIds.ReadSpeedDialSettings.SpeedDialNumber);\\r\\n // break;\\r\\n // Gateway Number\\r\\n case '9': //00447781482635,Esendex UK 0034627177148,Esendex Spain 00447507288240,Esendex UK Acceptance\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n if (tel.includes('447781482635') || tel.includes('00447781482635')) {\\r\\n tel = 'Esendex UK'\\r\\n } else if (tel.includes('34627177148') || tel.includes('0034627177148')) {\\r\\n tel = 'Esendex Spain'\\r\\n } else if (tel.includes('447507288240') || tel.includes('00447507288240')) {\\r\\n tel = 'Esendex UK Acceptance'\\r\\n } else {\\r\\n tel = 'Default'\\r\\n }\\r\\n AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n break;\\r\\n default:\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n if (tel.length < 6) {\\r\\n contacts += '';\\r\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n break;\\r\\n }\\r\\n //contacts += 'A' + (contactNumber - 1) + ': ' + tel + ', ';\\r\\n contacts += tel + ', ';\\r\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n break;\\r\\n }\\r\\n break;\\r\\n case '40': // APN\\r\\n //no ACK need\\r\\n AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'));\\r\\n configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\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 = (`Watch;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 = (`Watch;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 '46': //HeartRate\\r\\n // '10 0E 00 80'\\r\\n var HeartRateStatus = hex2bin(value.substring(6, 8));\\r\\n var enalbleDisable = '';\\r\\n if (HeartRateStatus.substring(0, 1) == '1') {\\r\\n var hrate = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var hrate = 'Disable, '\\r\\n };\\r\\n var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n hrate += detectingInterval;\\r\\n AddValue(codeValues, \\\"hrate\\\", hrate);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings);\\r\\n configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\r\\n break;\\r\\n case '47': // Custom Id\\r\\n imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;ACK-CUSTID;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"customeid\\\", value);\\r\\n AddValue(configsToUpdate, configIds.ReadState.CustomId, hex_to_ascii(value)); //now it comes \\\"3036\\\"\\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 // commented until Eview fixes this function\\r\\n /*\\r\\n messageForReceiver = (`Watch;ACK-NOMOTION;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"nomotion\\\", alertSetting);\\r\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings, enableDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n configsToAck.push(configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings);\\r\\n configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n */\\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 = (`Watch;ACK-FALLALERT;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n var sesibityOptionValue = hexToDecimal(value.substring(1, 2));\\r\\n sensibility += sesibityOptionValue;\\r\\n AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n //AddValue(configsToUpdate, configIds.ReadAlertSettings.FallSettings, sensibility);\\r\\n AddValue(configsToUpdate, configIds.ReadFallSettings.EnableDisableFallSettings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadFallSettings.Sensitivity, sesibityOptionValue);\\r\\n //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n configsToAck.push(configIds.ReadFallSettings.EnableDisableFallSettings);\\r\\n configsToAck.push(configIds.ReadFallSettings.Sensitivity);\\r\\n break;\\r\\n case '73': //BeaconList\\r\\n var beaconNumber = hexToDecimal(value.substring(1, 2));\\r\\n var beaconStatus = hex2bin(value.substring(0, 1));\\r\\n beaconStatus = hex_to_ascii(value.substring(30, value.length));\\r\\n //beaconStatus = changeEndianness(value.substring(30, value.length));\\r\\n //homeBeacon += 'B' + (beaconNumber + 1) + ': ' + beaconStatus + ', ';\\r\\n homeBeacon += beaconStatus + ', ';\\r\\n AddValue(codeValues, \\\"homeBeacon\\\", homeBeacon);\\r\\n messageForReceiver = (`Watch;ACK-GDATA;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n break;\\r\\n case '4A': //Wifi Network List\\r\\n var wifiSSIDLenght = hexToDecimal(value.substring(2, 4));\\r\\n var wifiPasswordLenght = hexToDecimal(value.substring(4, 6));\\r\\n var wifiIndex = hexToDecimal(value.substring(1, 2));\\r\\n //var wifiStatus = hexToDecimal(value.substring(0, 1));\\r\\n var wifiStatus = value.substring(0, 1);\\r\\n /*var enalbleDisable = wifiSSID = wifiPassword = homeWifi = '';\\r\\n /var homeWifi = '';\\r\\n if (wifiIndex == '0') { // Only first Wifi of the list\\r\\n if (wifiStatus == '8') {\\r\\n homeWifi += ' Enable, '\\r\\n enalbleDisable = '1';\\r\\n } else {\\r\\n homeWifi += ' Disable, '\\r\\n //enalbleDisable = '0';\\r\\n };*/\\r\\n if ((wifiStatus == '8') || (wifiStatus == 'C')) { // 8 == ON OR C== ON and Connected\\r\\n var wifiSSID = hex_to_ascii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\r\\n var wifiPassword = hex_to_ascii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\r\\n var imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;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 = (`Watch;ACK-SPEED;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"speed\\\", alertSetting);\\r\\n AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\r\\n configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n break;\\r\\n case '7A': //[Length]:05 [Key]:7A [Value]:60 54 00 80\\r\\n // {\\\"spo2Interval\\\":{\\\"interval\\\":21600,\\\"status\\\":1}}\\r\\n var SPOStatus = hex2bin(value.substring(6, 8));\\r\\n var enalbleDisable = '';\\r\\n if (SPOStatus.substring(0, 1) == '1') {\\r\\n var spo = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var spo = 'Disable, '\\r\\n };\\r\\n var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n spo += detectingInterval;\\r\\n AddValue(codeValues, \\\"SPO2\\\", spo);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadSPO2Settings.EnableDisableReadSPO2Settings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadSPO2Settings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadSPO2Settings.EnableDisableReadSPO2Settings);\\r\\n configsToAck.push(configIds.ReadSPO2Settings.ReportingFrequency);\\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 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 = (`Watch-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 = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch-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 if (typeof configIds !== 'undefined' && configIds && configIds.ConfigureDevice && configIds.ConfigureDevice.LastConfigured) { // when is defined\\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 }\\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(hex) { // Hex to Ascii \\r\\n if (hex.length % 2 !== 0) {\\r\\n throw new Error(\\\"Hex string length must be even\\\");\\r\\n }\\r\\n let ascii = '';\\r\\n for (let i = 0; i < hex.length; i += 2) {\\r\\n const byte = hex.substr(i, 2);\\r\\n const charCode = parseInt(byte, 16);\\r\\n if (charCode !== 0) { // remove null character (\\\\u0000)\\r\\n ascii += String.fromCharCode(charCode);\\r\\n }\\r\\n }\\r\\n return ascii;\\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 normalizeLabels(raw) { // output labels as array\\r\\n if (!raw) return [];\\r\\n return [String(raw)];\\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}\\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":1765522901}]},{"Id":436,"Name":"OnUpdateProtocol_CareWatch","Operation":"/*\r\nlet configsToUpdate = [];\r\nif (configs.HeartRateMonitor.EnableDisableHeartRateMonitor === \"\") {\r\n configsToUpdate.push({\r\n 'code': configIds.HeartRateMonitor.EnableDisableHeartRateMonitor,\r\n 'value': 'false'\r\n });\r\n}\r\nif (configs.HeartRateMonitor.HeartRateDetectingInterval === \"\") {\r\n configsToUpdate.push({\r\n 'code': configIds.HeartRateMonitor.HeartRateDetectingInterval,\r\n 'value': '10'\r\n });\r\n}\r\nif (configs.StepCounting.EnableDisableStepCounting === \"\") {\r\n configsToUpdate.push({\r\n 'code': configIds.StepCounting.EnableDisableStepCounting,\r\n 'value': 'false'\r\n });\r\n}\r\nif (configs.StepCounting.StepCountingInterval === \"\") {\r\n configsToUpdate.push({\r\n 'code': configIds.StepCounting.StepCountingInterval,\r\n 'value': '10'\r\n });\r\n}\r\nif (configs.DeviceVersion.DeviceVersion === \"\") {\r\n configsToUpdate.push({\r\n 'code': configIds.DeviceVersion.DeviceVersion,\r\n 'value': '1'\r\n });\r\n}\r\nif (configs.NoActivity.EnableDisableNoActivity === \"\") {\r\n configsToUpdate.push({\r\n 'code': configIds.NoActivity.EnableDisableNoActivity,\r\n 'value': 'false'\r\n });\r\n}\r\nif (configs.NoActivity.NoActivity === \"\") {\r\n configsToUpdate.push({\r\n 'code': configIds.NoActivity.NoActivity,\r\n 'value': '3600'\r\n });\r\n}\r\nif (configs.VoicePrompt.Activity === \"\") {\r\n configsToUpdate.push({\r\n 'code': configIds.VoicePrompt.Activity,\r\n 'value': 'true'\r\n });\r\n}\r\nif (configs.VoicePrompt.AlarmCancel === \"\") {\r\n configsToUpdate.push({\r\n 'code': configIds.VoicePrompt.AlarmCancel,\r\n 'value': 'true'\r\n });\r\n}\r\nif (configs.VoicePrompt.AlarmComplete === \"\") {\r\n configsToUpdate.push({\r\n 'code': configIds.VoicePrompt.AlarmComplete,\r\n 'value': 'true'\r\n });\r\n}\r\nif (configs.VoicePrompt.BaseLocation === \"\") {\r\n configsToUpdate.push({\r\n 'code': configIds.VoicePrompt.BaseLocation,\r\n 'value': 'true'\r\n });\r\n}\r\nif (configs.VoicePrompt.Battery === \"\") {\r\n configsToUpdate.push({\r\n 'code': configIds.VoicePrompt.Battery,\r\n 'value': 'true'\r\n });\r\n}\r\nif (configs.VoicePrompt.Beep === \"\") {\r\n configsToUpdate.push({\r\n 'code': configIds.VoicePrompt.Beep,\r\n 'value': 'true'\r\n });\r\n}\r\nif (configs.VoicePrompt.BLE === \"\") {\r\n configsToUpdate.push({\r\n 'code': configIds.VoicePrompt.BLE,\r\n 'value': 'true'\r\n });\r\n}\r\nif (configs.VoicePrompt.Call1 === \"\") {\r\n configsToUpdate.push({\r\n 'code': configIds.VoicePrompt.Call1,\r\n 'value': 'true'\r\n });\r\n}\r\nif (configs.VoicePrompt.Call2 === \"\") {\r\n configsToUpdate.push({\r\n 'code': configIds.VoicePrompt.Call2,\r\n 'value': 'true'\r\n });\r\n}\r\nif (configs.VoicePrompt.Call3 === \"\") {\r\n configsToUpdate.push({\r\n 'code': configIds.VoicePrompt.Call3,\r\n 'value': 'true'\r\n });\r\n}\r\nif (configs.VoicePrompt.Call4 === \"\") {\r\n configsToUpdate.push({\r\n 'code': configIds.VoicePrompt.Call4,\r\n 'value': 'true'\r\n });\r\n}\r\nif (configs.VoicePrompt.Call5 === \"\") {\r\n configsToUpdate.push({\r\n 'code': configIds.VoicePrompt.Call5,\r\n 'value': 'true'\r\n });\r\n}\r\nif (configs.VoicePrompt.Call6 === \"\") {\r\n configsToUpdate.push({\r\n 'code': configIds.VoicePrompt.Call6,\r\n 'value': 'true'\r\n });\r\n}\r\nif (configs.VoicePrompt.Call7 === \"\") {\r\n configsToUpdate.push({\r\n 'code': configIds.VoicePrompt.Call7,\r\n 'value': 'true'\r\n });\r\n}\r\nif (configs.VoicePrompt.Call8 === \"\") {\r\n configsToUpdate.push({\r\n 'code': configIds.VoicePrompt.Call8,\r\n 'value': 'true'\r\n });\r\n}\r\nif (configs.VoicePrompt.Call9 === \"\") {\r\n configsToUpdate.push({\r\n 'code': configIds.VoicePrompt.Call9,\r\n 'value': 'true'\r\n });\r\n}\r\nif (configs.VoicePrompt.Call10 === \"\") {\r\n configsToUpdate.push({\r\n 'code': configIds.VoicePrompt.Call10,\r\n 'value': 'true'\r\n });\r\n}\r\nif (configs.VoicePrompt.CallDisconnected === \"\") {\r\n configsToUpdate.push({\r\n 'code': configIds.VoicePrompt.CallDisconnected,\r\n 'value': 'true'\r\n });\r\n}\r\nif (configs.VoicePrompt.CallError === \"\") {\r\n configsToUpdate.push({\r\n 'code': configIds.VoicePrompt.CallError,\r\n 'value': 'true'\r\n });\r\n}\r\nif (configs.VoicePrompt.CallHang === \"\") {\r\n configsToUpdate.push({\r\n 'code': configIds.VoicePrompt.CallHang,\r\n 'value': 'true'\r\n });\r\n}\r\nif (configs.VoicePrompt.Charging === \"\") {\r\n configsToUpdate.push({\r\n 'code': configIds.VoicePrompt.Charging,\r\n 'value': 'true'\r\n });\r\n}\r\nif (configs.VoicePrompt.Click === \"\") {\r\n configsToUpdate.push({\r\n 'code': configIds.VoicePrompt.Click,\r\n 'value': 'true'\r\n });\r\n}\r\nif (configs.VoicePrompt.Fall === \"\") {\r\n configsToUpdate.push({\r\n 'code': configIds.VoicePrompt.Fall,\r\n 'value': 'true'\r\n });\r\n}\r\nif (configs.VoicePrompt.Find === \"\") {\r\n configsToUpdate.push({\r\n 'code': configIds.VoicePrompt.Find,\r\n 'value': 'true'\r\n });\r\n}\r\nif (configs.VoicePrompt.Motion === \"\") {\r\n configsToUpdate.push({\r\n 'code': configIds.VoicePrompt.Motion,\r\n 'value': 'true'\r\n });\r\n}\r\nif (configs.VoicePrompt.NoMotion === \"\") {\r\n configsToUpdate.push({\r\n 'code': configIds.VoicePrompt.NoMotion,\r\n 'value': 'true'\r\n });\r\n}\r\nif (configs.VoicePrompt.SOS === \"\") {\r\n configsToUpdate.push({\r\n 'code': configIds.VoicePrompt.SOS,\r\n 'value': 'true'\r\n });\r\n}\r\nif (configs.VoicePrompt.Tilt === \"\") {\r\n configsToUpdate.push({\r\n 'code': configIds.VoicePrompt.Tilt,\r\n 'value': 'true'\r\n });\r\n}\r\nif (configs.VoicePrompt.TiltCancel === \"\") {\r\n configsToUpdate.push({\r\n 'code': configIds.VoicePrompt.TiltCancel,\r\n 'value': 'true'\r\n });\r\n}\r\nif (configs.VoicePrompt.Time === \"\") {\r\n configsToUpdate.push({\r\n 'code': configIds.VoicePrompt.Time,\r\n 'value': 'true'\r\n });\r\n}\r\nif (configs.EnableControl.Step === \"\") {\r\n configsToUpdate.push({\r\n 'code': configIds.EnableControl.Step,\r\n 'value': 'false'\r\n });\r\n}\r\nif (configs.SystemLanguage.Language === \"\") {\r\n configsToUpdate.push({\r\n 'code': configIds.SystemLanguage.Language,\r\n 'value': 'en-US'\r\n });\r\n}\r\nif (configs.WelfareCheck.EnableDisableWelfareCheck === \"\") {\r\n configsToUpdate.push({\r\n 'code': configIds.WelfareCheck.EnableDisableWelfareCheck,\r\n 'value': 'false'\r\n });\r\n}\r\nif (configs.WelfareCheck.CheckTime === \"\") {\r\n configsToUpdate.push({\r\n 'code': configIds.WelfareCheck.CheckTime,\r\n 'value': '60'\r\n });\r\n}\r\nif (configs.WelfareCheck.WarningTime === \"\") {\r\n configsToUpdate.push({\r\n 'code': configIds.WelfareCheck.WarningTime,\r\n 'value': '10'\r\n });\r\n}\r\nif (configs.WelfareCheck.DialWarningTime === \"\") {\r\n configsToUpdate.push({\r\n 'code': configIds.WelfareCheck.DialWarningTime,\r\n 'value': 'false'\r\n });\r\n}\r\nvar msg = {\r\n 'configsToUpdate': configsToUpdate\r\n};\r\nconsole.log(msg); */","Type":1,"ProtocolActionObjects":[]}],"Groups":[{"Id":7366,"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":7367,"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7368,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7369,"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":7368,"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7368,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7369,"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":[]},{"Id":7369,"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7368,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7369,"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":7370,"Parent":{"Id":7367,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7368,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7369,"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":[]},{"Id":7371,"Parent":{"Id":7367,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7368,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7369,"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":[]},{"Id":7372,"Parent":{"Id":7367,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7368,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7369,"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7373,"Parent":{"Id":7367,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7368,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7369,"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":[]},{"Id":7374,"Parent":{"Id":7369,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7368,"Name":"Controls","Json":{"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":[]},{"Id":7375,"Parent":{"Id":7369,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7368,"Name":"Controls","Json":{"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":7376,"Parent":{"Id":7369,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7368,"Name":"Controls","Json":{"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":[]},{"Id":7377,"Parent":{"Id":7369,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7368,"Name":"Controls","Json":{"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":[]},{"Id":7378,"Parent":{"Id":7367,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7368,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7369,"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":[]},{"Id":7379,"Parent":{"Id":7369,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7368,"Name":"Controls","Json":{"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":[]},{"Id":7380,"Parent":{"Id":7367,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7368,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7369,"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":[]},{"Id":7384,"Parent":{"Id":7376,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7369,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7368,"Name":"Controls","Json":{"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":7374,"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":7375,"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":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"Fall Settings","Json":"{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]}","DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[]},{"Id":7385,"Parent":{"Id":7376,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7369,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7368,"Name":"Controls","Json":{"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":7374,"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":7375,"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":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"No Activity","Json":"{\"description\":\"\",\"columns\":1,\"order\":5,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]}","DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[]},{"Id":7387,"Parent":{"Id":7378,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7367,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7368,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7369,"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":7370,"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":7371,"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":7372,"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":7373,"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":7380,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","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 Fall Settings","Json":"{\"description\":\"\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]}","DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[]},{"Id":7388,"Parent":{"Id":7378,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7367,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7368,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7369,"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":7370,"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":7371,"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":7372,"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":7373,"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":7380,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","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 Non Movement Settings","Json":"{\"description\":\"\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]}","DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[{"Type":2,"NewValue":"{\"Id\":7388,\"Parent\":{\"Id\":7378,\"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\":7388,\"Name\":\"Read Non Movement Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]}]},\"Name\":\"Read Non Movement Settings\",\"Json\":\"{\\\"description\\\":\\\"\\\",\\\"columns\\\":1,\\\"order\\\":1,\\\"listSize\\\":1,\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\"]}\",\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"LanguageId\":null,\"ProtocolActionObjects\":[]}","Timestamp":1751039724}]},{"Id":7389,"Parent":{"Id":7377,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7369,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7368,"Name":"Controls","Json":{"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7379,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Name":"Beacon List","Json":"{\"description\":null,\"columns\":1,\"order\":3,\"listSize\":20,\"toTranslate\":[\"name\",\"description\"]}","DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[]},{"Id":7390,"Parent":{"Id":7377,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7369,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7368,"Name":"Controls","Json":{"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7379,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Name":"Approved Contacts","Json":"{\"description\":\"\",\"columns\":1,\"order\":2,\"listSize\":7,\"toTranslate\":[\"name\",\"description\"]}","DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":7390,\"Parent\":{\"Id\":7377,\"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\":7390,\"Name\":\"Approved Contacts\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":2,\"listSize\":8,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":true,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[{\"Id\":7394,\"Name\":\"Eulalia\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":2,\"listSize\":7,\"toTranslate\":[\"name\",\"description\"],\"index\":1},\"Device\":null,\"DeviceRelated\":true,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":7398,\"Name\":\"juan\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":2,\"listSize\":7,\"toTranslate\":[\"name\",\"description\"],\"index\":1},\"Device\":null,\"DeviceRelated\":true,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":7399,\"Name\":\"ana\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":2,\"listSize\":7,\"toTranslate\":[\"name\",\"description\"],\"index\":2},\"Device\":null,\"DeviceRelated\":true,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":7402,\"Name\":\"Teams Luton\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":2,\"listSize\":7,\"toTranslate\":[\"name\",\"description\"],\"index\":1},\"Device\":null,\"DeviceRelated\":true,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]}]},{\"Id\":7389,\"Name\":\"Beacon List\",\"Json\":{\"description\":null,\"columns\":1,\"order\":3,\"listSize\":20,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":true,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]}]},\"Name\":\"Approved Contacts\",\"Json\":\"{\\\"description\\\":\\\"\\\",\\\"columns\\\":1,\\\"order\\\":2,\\\"listSize\\\":8,\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\"]}\",\"DeviceRelated\":true,\"IsList\":false,\"IsAdminOnly\":false,\"LanguageId\":null,\"ProtocolActionObjects\":[]}","Timestamp":1748619953},{"Type":1,"NewValue":"{\"Id\":7390,\"Parent\":{\"Id\":7377,\"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\":7390,\"Name\":\"Approved Contacts\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":2,\"listSize\":8,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":true,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":7389,\"Name\":\"Beacon List\",\"Json\":{\"description\":null,\"columns\":1,\"order\":3,\"listSize\":20,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":true,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]}]},\"Name\":\"Approved Contacts\",\"Json\":\"{\\\"description\\\":\\\"\\\",\\\"columns\\\":1,\\\"order\\\":2,\\\"listSize\\\":8,\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\"]}\",\"DeviceRelated\":true,\"IsList\":false,\"IsAdminOnly\":false,\"LanguageId\":null,\"ProtocolActionObjects\":[]}","Timestamp":1748622501}]},{"Id":7391,"Parent":{"Id":7376,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7369,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7368,"Name":"Controls","Json":{"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":7374,"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":7375,"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":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"Non Movement Settings","Json":"{\"description\":null,\"columns\":1,\"order\":3,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]}","DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[{"Type":2,"NewValue":"{\"Id\":7391,\"Parent\":{\"Id\":7376,\"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\":7391,\"Name\":\"Non Movement Settings\",\"Json\":{\"description\":null,\"columns\":1,\"order\":3,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]}]},\"Name\":\"Non Movement Settings\",\"Json\":\"{\\\"description\\\":null,\\\"columns\\\":1,\\\"order\\\":3,\\\"listSize\\\":1,\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\"]}\",\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"LanguageId\":null,\"ProtocolActionObjects\":[]}","Timestamp":1751039819}]},{"Id":7394,"Parent":{"Id":7390,"Name":"Approved Contacts","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":{"Id":7377,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7369,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7368,"Name":"Controls","Json":{"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7379,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"Eulalia","Json":"{ \"description\": \"\", \"columns\": 1, \"order\": 2, \"listSize\": 7, \"toTranslate\": [ \"name\", \"description\" ], \"index\": 1}","DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[]},{"Id":7398,"Parent":{"Id":7390,"Name":"Approved Contacts","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":{"Id":7377,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7369,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7368,"Name":"Controls","Json":{"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7379,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"juan","Json":"{ \"description\": \"\", \"columns\": 1, \"order\": 2, \"listSize\": 7, \"toTranslate\": [ \"name\", \"description\" ], \"index\": 1}","DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[]},{"Id":7399,"Parent":{"Id":7390,"Name":"Approved Contacts","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":{"Id":7377,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7369,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7368,"Name":"Controls","Json":{"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7379,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"ana","Json":"{ \"description\": \"\", \"columns\": 1, \"order\": 2, \"listSize\": 7, \"toTranslate\": [ \"name\", \"description\" ], \"index\": 2}","DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[]},{"Id":7401,"Parent":{"Id":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":{"Id":7377,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7369,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7368,"Name":"Controls","Json":{"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7379,"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":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"office","Json":"{ \"description\": null, \"columns\": 1, \"order\": 3, \"listSize\": 20, \"toTranslate\": [ \"name\", \"description\" ], \"index\": 1}","DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[]},{"Id":7402,"Parent":{"Id":7390,"Name":"Approved Contacts","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":{"Id":7377,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7369,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7368,"Name":"Controls","Json":{"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7379,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"Teams Luton","Json":"{ \"description\": \"\", \"columns\": 1, \"order\": 2, \"listSize\": 7, \"toTranslate\": [ \"name\", \"description\" ], \"index\": 1}","DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[]},{"Id":7411,"Parent":{"Id":7369,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7374,"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":7375,"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":7376,"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":7377,"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":7379,"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":7411,"Name":"TeleHealth","Json":{"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":"TeleHealth","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\":7411,\"Parent\":{\"Id\":7369,\"Name\":\"Configure Device\",\"Json\":{\"description\":null,\"columns\":1,\"order\":3,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":{\"Id\":7366,\"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\":7374,\"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\":7375,\"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\":7376,\"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\":7377,\"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\":7379,\"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\":7411,\"Name\":\"TeleHealth\",\"Json\":{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]}]},\"Name\":\"TeleHealth\",\"Json\":\"{\\\"description\\\":null,\\\"columns\\\":1,\\\"order\\\":1,\\\"listSize\\\":1,\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\"]}\",\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"LanguageId\":null,\"ProtocolActionObjects\":[]}","Timestamp":1748623706},{"Type":1,"NewValue":"{\"Id\":7411,\"Parent\":{\"Id\":7369,\"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\":7411,\"Name\":\"TeleHealth 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\":7374,\"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\":7375,\"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\":7376,\"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\":7377,\"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\":7379,\"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\":\"TeleHealth Settings\",\"Json\":\"{\\\"description\\\":null,\\\"columns\\\":1,\\\"order\\\":1,\\\"listSize\\\":1,\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\"]}\",\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"LanguageId\":null,\"ProtocolActionObjects\":[]}","Timestamp":1748623754},{"Type":1,"NewValue":"{\"Id\":7411,\"Parent\":{\"Id\":7369,\"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\":7411,\"Name\":\"TeleHealth Settings\",\"Json\":{\"description\":\"A group for telehealth metrics such as steps and SPO2\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":7374,\"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\":7375,\"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\":7376,\"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\":7377,\"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\":7379,\"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\":\"TeleHealth Settings\",\"Json\":\"{\\\"description\\\":\\\"A group for telehealth metrics such as steps and SPO2\\\",\\\"columns\\\":1,\\\"order\\\":1,\\\"listSize\\\":1,\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\"]}\",\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"LanguageId\":null,\"ProtocolActionObjects\":[]}","Timestamp":1748623780},{"Type":1,"NewValue":"{\"Id\":7411,\"Parent\":{\"Id\":7369,\"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\":7411,\"Name\":\"TeleHealth Settings\",\"Json\":{\"description\":\"A group for Telehealth metrics, such as Heart Rate and Steps.\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[{\"Id\":7415,\"Name\":\"Steps 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\":7416,\"Name\":\"Heartrate 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\":7374,\"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\":7375,\"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\":7376,\"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\":7377,\"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\":7379,\"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\":\"TeleHealth Settings\",\"Json\":\"{\\\"description\\\":\\\"A group for Telehealth metrics, such as Heart Rate and Steps.\\\",\\\"columns\\\":1,\\\"order\\\":1,\\\"listSize\\\":1,\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\"]}\",\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"LanguageId\":null,\"ProtocolActionObjects\":[]}","Timestamp":1749657024}]},{"Id":7412,"Parent":{"Id":7367,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7380,"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":7412,"Name":"Read TeleHealth Settings","Json":{"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 TeleHealth Settings","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\":7412,\"Parent\":{\"Id\":7367,\"Name\":\"On Device\",\"Json\":{\"description\":null,\"columns\":1,\"order\":2,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":{\"Id\":7366,\"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\":7370,\"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\":7371,\"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\":7372,\"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\":7373,\"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\":7378,\"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\":7380,\"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\":7412,\"Name\":\"Read TeleHealth Settings\",\"Json\":{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]}]},\"Name\":\"Read TeleHealth Settings\",\"Json\":\"{\\\"description\\\":null,\\\"columns\\\":1,\\\"order\\\":1,\\\"listSize\\\":1,\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\"]}\",\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"LanguageId\":null,\"ProtocolActionObjects\":[]}","Timestamp":1748623827},{"Type":1,"NewValue":"{\"Id\":7412,\"Parent\":{\"Id\":7367,\"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\":7412,\"Name\":\"Read TeleHealth Settings\",\"Json\":{\"description\":\"Read TeleHealth Settings\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":7370,\"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\":7371,\"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\":7372,\"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\":7373,\"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\":7378,\"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\":7380,\"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 TeleHealth Settings\",\"Json\":\"{\\\"description\\\":\\\"Read TeleHealth Settings\\\",\\\"columns\\\":1,\\\"order\\\":1,\\\"listSize\\\":1,\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\"]}\",\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"LanguageId\":null,\"ProtocolActionObjects\":[]}","Timestamp":1748624307}]},{"Id":7413,"Parent":{"Id":7412,"Name":"Read TeleHealth Settings","Json":{"description":"Read TeleHealth Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7367,"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":7413,"Name":"Read Steps Settings","Json":{"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 Steps Settings","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\":7413,\"Parent\":{\"Id\":7412,\"Name\":\"Read TeleHealth Settings\",\"Json\":{\"description\":\"Read TeleHealth Settings\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":{\"Id\":7367,\"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\":7413,\"Name\":\"Read Steps Settings\",\"Json\":{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]}]},\"Name\":\"Read Steps Settings\",\"Json\":\"{\\\"description\\\":null,\\\"columns\\\":1,\\\"order\\\":1,\\\"listSize\\\":1,\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\"]}\",\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"LanguageId\":null,\"ProtocolActionObjects\":[]}","Timestamp":1748625010},{"Type":1,"NewValue":"{\"Id\":7413,\"Parent\":{\"Id\":7412,\"Name\":\"Read TeleHealth Settings\",\"Json\":{\"description\":\"Read TeleHealth Settings\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[{\"Id\":7413,\"Name\":\"Read Steps 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\":7414,\"Name\":\"Read Heartrate Settings\",\"Json\":{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]}]},\"Name\":\"Read Steps Settings\",\"Json\":\"{\\\"description\\\":null,\\\"columns\\\":1,\\\"order\\\":2,\\\"listSize\\\":1,\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\"]}\",\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"LanguageId\":null,\"ProtocolActionObjects\":[]}","Timestamp":1748971795}]},{"Id":7414,"Parent":{"Id":7412,"Name":"Read TeleHealth Settings","Json":{"description":"Read TeleHealth Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7367,"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":7413,"Name":"Read Steps Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7414,"Name":"Read Heartrate Settings","Json":{"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 Heartrate Settings","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\":7414,\"Parent\":{\"Id\":7412,\"Name\":\"Read TeleHealth Settings\",\"Json\":{\"description\":\"Read TeleHealth Settings\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":{\"Id\":7367,\"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\":7413,\"Name\":\"Read Steps 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\":7414,\"Name\":\"Read Heartrate Settings\",\"Json\":{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]}]},\"Name\":\"Read Heartrate Settings\",\"Json\":\"{\\\"description\\\":null,\\\"columns\\\":1,\\\"order\\\":1,\\\"listSize\\\":1,\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\"]}\",\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"LanguageId\":null,\"ProtocolActionObjects\":[]}","Timestamp":1748625569},{"Type":1,"NewValue":"{\"Id\":7414,\"Parent\":{\"Id\":7412,\"Name\":\"Read TeleHealth Settings\",\"Json\":{\"description\":\"Read TeleHealth Settings\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[{\"Id\":7414,\"Name\":\"Read Heartrate 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\":7413,\"Name\":\"Read Steps Settings\",\"Json\":{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]}]},\"Name\":\"Read Heartrate Settings\",\"Json\":\"{\\\"description\\\":null,\\\"columns\\\":1,\\\"order\\\":2,\\\"listSize\\\":1,\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\"]}\",\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"LanguageId\":null,\"ProtocolActionObjects\":[]}","Timestamp":1748625577},{"Type":1,"NewValue":"{\"Id\":7414,\"Parent\":{\"Id\":7412,\"Name\":\"Read TeleHealth Settings\",\"Json\":{\"description\":\"Read TeleHealth Settings\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[{\"Id\":7414,\"Name\":\"Read Heartrate 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\":7413,\"Name\":\"Read Steps Settings\",\"Json\":{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]}]},\"Name\":\"Read Heartrate Settings\",\"Json\":\"{\\\"description\\\":null,\\\"columns\\\":1,\\\"order\\\":1,\\\"listSize\\\":1,\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\"]}\",\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"LanguageId\":null,\"ProtocolActionObjects\":[]}","Timestamp":1748971793}]},{"Id":7415,"Parent":{"Id":7411,"Name":"TeleHealth Settings","Json":{"description":"A group for telehealth metrics such as steps and SPO2","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7369,"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":7415,"Name":"Steps Settings","Json":{"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":"Steps Settings","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\":7415,\"Parent\":{\"Id\":7411,\"Name\":\"TeleHealth Settings\",\"Json\":{\"description\":\"A group for telehealth metrics such as steps and SPO2\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":{\"Id\":7369,\"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\":7415,\"Name\":\"Steps Settings\",\"Json\":{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]}]},\"Name\":\"Steps Settings\",\"Json\":\"{\\\"description\\\":null,\\\"columns\\\":1,\\\"order\\\":1,\\\"listSize\\\":1,\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\"]}\",\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"LanguageId\":null,\"ProtocolActionObjects\":[]}","Timestamp":1748625950},{"Type":1,"NewValue":"{\"Id\":7415,\"Parent\":{\"Id\":7411,\"Name\":\"TeleHealth Settings\",\"Json\":{\"description\":\"A group for telehealth metrics such as steps and SPO2\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[{\"Id\":7415,\"Name\":\"Steps 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\":7416,\"Name\":\"Heartrate Settings\",\"Json\":{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]}]},\"Name\":\"Steps Settings\",\"Json\":\"{\\\"description\\\":null,\\\"columns\\\":1,\\\"order\\\":2,\\\"listSize\\\":1,\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\"]}\",\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"LanguageId\":null,\"ProtocolActionObjects\":[]}","Timestamp":1748972021}]},{"Id":7416,"Parent":{"Id":7411,"Name":"TeleHealth Settings","Json":{"description":"A group for telehealth metrics such as steps and SPO2","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7369,"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":7415,"Name":"Steps Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7416,"Name":"Heartrate Settings","Json":{"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":"Heartrate Settings","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\":7416,\"Parent\":{\"Id\":7411,\"Name\":\"TeleHealth Settings\",\"Json\":{\"description\":\"A group for telehealth metrics such as steps and SPO2\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":{\"Id\":7369,\"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\":7415,\"Name\":\"Steps 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\":7416,\"Name\":\"Heartrate Settings\",\"Json\":{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]}]},\"Name\":\"Heartrate Settings\",\"Json\":\"{\\\"description\\\":null,\\\"columns\\\":1,\\\"order\\\":1,\\\"listSize\\\":1,\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\"]}\",\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"LanguageId\":null,\"ProtocolActionObjects\":[]}","Timestamp":1748625984}]},{"Id":7454,"Parent":{"Id":7411,"Name":"TeleHealth Settings","Json":{"description":"A group for Telehealth metrics, such as Heart Rate and Steps.","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7369,"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":7415,"Name":"Steps Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7416,"Name":"Heartrate Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7454,"Name":"SPO2 Settings","Json":{"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":"SPO2 Settings","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\":7454,\"Parent\":{\"Id\":7411,\"Name\":\"TeleHealth Settings\",\"Json\":{\"description\":\"A group for Telehealth metrics, such as Heart Rate and Steps.\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":{\"Id\":7369,\"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\":7415,\"Name\":\"Steps 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\":7416,\"Name\":\"Heartrate 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\":7454,\"Name\":\"SPO2 Settings\",\"Json\":{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]}]},\"Name\":\"SPO2 Settings\",\"Json\":\"{\\\"description\\\":null,\\\"columns\\\":1,\\\"order\\\":1,\\\"listSize\\\":1,\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\"]}\",\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"LanguageId\":null,\"ProtocolActionObjects\":[]}","Timestamp":1762892832}]},{"Id":7457,"Parent":{"Id":7412,"Name":"Read TeleHealth Settings","Json":{"description":"Read TeleHealth Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7367,"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":7413,"Name":"Read Steps Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7414,"Name":"Read Heartrate Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7457,"Name":"Read SPO2 Settings","Json":{"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 SPO2 Settings","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\":7457,\"Parent\":{\"Id\":7412,\"Name\":\"Read TeleHealth Settings\",\"Json\":{\"description\":\"Read TeleHealth Settings\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":{\"Id\":7367,\"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\":7413,\"Name\":\"Read Steps 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\":7414,\"Name\":\"Read Heartrate 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\":7457,\"Name\":\"Read SPO2 Settings\",\"Json\":{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]}]},\"Name\":\"Read SPO2 Settings\",\"Json\":\"{\\\"description\\\":null,\\\"columns\\\":1,\\\"order\\\":1,\\\"listSize\\\":1,\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\"]}\",\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"LanguageId\":null,\"ProtocolActionObjects\":[]}","Timestamp":1763059210}]}],"GroupParams":[{"Id":12292,"Group":{"Id":7367,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7368,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7369,"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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\"]}","Default":"false","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":12293,"Group":{"Id":7367,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7368,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7369,"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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\"]}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":12295,"Group":{"Id":7368,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7369,"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":[{"Type":1,"NewValue":"{\"Id\":12295,\"Group\":{\"Id\":7368,\"Name\":\"Controls\",\"Json\":{\"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 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\\\":12}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1750165379}],"LanguageId":null,"Tags":[]},{"Id":12296,"Group":{"Id":7368,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7369,"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":[{"Type":1,"NewValue":"{\"Id\":12296,\"Group\":{\"Id\":7368,\"Name\":\"Controls\",\"Json\":{\"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 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\\\":10}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1750165370}],"LanguageId":null,"Tags":[]},{"Id":12297,"Group":{"Id":7368,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7369,"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":12298,"Group":{"Id":7368,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7369,"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":12300,"Group":{"Id":7368,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7369,"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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\":12300,\"Group\":{\"Id\":7368,\"Name\":\"Controls\",\"Json\":{\"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\\\":6}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1750165353}],"LanguageId":null,"Tags":[]},{"Id":12301,"Group":{"Id":7368,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7369,"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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\":12301,\"Group\":{\"Id\":7368,\"Name\":\"Controls\",\"Json\":{\"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\\\":7}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1750165357}],"LanguageId":null,"Tags":[]},{"Id":12302,"Group":{"Id":7368,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7369,"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":[],"LanguageId":null,"Tags":[]},{"Id":12303,"Group":{"Id":7368,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7369,"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":[{"Type":1,"NewValue":"{\"Id\":12303,\"Group\":{\"Id\":7368,\"Name\":\"Controls\",\"Json\":{\"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\":\"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\\\":5}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1750165349}],"LanguageId":null,"Tags":[]},{"Id":12304,"Group":{"Id":7368,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7369,"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":[],"LanguageId":null,"Tags":[]},{"Id":12305,"Group":{"Id":7368,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7369,"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":[{"Type":1,"NewValue":"{\"Id\":12305,\"Group\":{\"Id\":7368,\"Name\":\"Controls\",\"Json\":{\"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 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\\\":11}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1750165375}],"LanguageId":null,"Tags":[]},{"Id":12307,"Group":{"Id":7368,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7369,"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":[],"LanguageId":null,"Tags":[]},{"Id":12306,"Group":{"Id":7368,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7369,"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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\":12306,\"Group\":{\"Id\":7368,\"Name\":\"Controls\",\"Json\":{\"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\\\":8}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1750165361}],"LanguageId":null,"Tags":[]},{"Id":12291,"Group":{"Id":7368,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7369,"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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 NOTE: Only by GPRS action\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":null,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":12291,\"Group\":{\"Id\":7368,\"Name\":\"Controls\",\"Json\":{\"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 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 to the factory defaults.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1749472684},{"Type":1,"NewValue":"{\"Id\":12291,\"Group\":{\"Id\":7368,\"Name\":\"Controls\",\"Json\":{\"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 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 to the factory defaults.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":9}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1750165365}],"LanguageId":null,"Tags":[]},{"Id":12299,"Group":{"Id":7369,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7368,"Name":"Controls","Json":{"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":12294,"Group":{"Id":7369,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7368,"Name":"Controls","Json":{"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":12320,"Group":{"Id":7370,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7367,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7368,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7369,"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":12313,"Group":{"Id":7371,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7367,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7368,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7369,"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":7370,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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\"]}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":12312,"Group":{"Id":7371,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7367,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7368,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7369,"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":7370,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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\"]}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":12310,"Group":{"Id":7372,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7367,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7368,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7369,"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":7370,"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":7371,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":"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":12309,"Group":{"Id":7372,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7367,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7368,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7369,"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":7370,"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":7371,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":"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":12311,"Group":{"Id":7372,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7367,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7368,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7369,"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":7370,"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":7371,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":"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":12308,"Group":{"Id":7373,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7367,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7368,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7369,"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":7370,"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":7371,"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":7372,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":"Home Beacon","Json":"{\"name\":\"Home Beacon\",\"default\":\"\",\"description\":\"Current Home Beacon\",\"type\":\"text\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":true,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":null,\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":12319,"Group":{"Id":7373,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7367,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7368,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7369,"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":7370,"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":7371,"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":7372,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":"Approved Contacts","Json":"{\"name\":\"Approved Contacts\",\"default\":\"\",\"description\":\"Current Approved Contacts\",\"type\":\"text\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":true,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":null,\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":12325,"Group":{"Id":7374,"Name":"System Settings","Json":{"description":"","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7369,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7368,"Name":"Controls","Json":{"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":[],"LanguageId":null,"Tags":[]},{"Id":12323,"Group":{"Id":7374,"Name":"System Settings","Json":{"description":"","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7369,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7368,"Name":"Controls","Json":{"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":[],"LanguageId":null,"Tags":[]},{"Id":12330,"Group":{"Id":7374,"Name":"System Settings","Json":{"description":"","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7369,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7368,"Name":"Controls","Json":{"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":[],"LanguageId":null,"Tags":[]},{"Id":12329,"Group":{"Id":7374,"Name":"System Settings","Json":{"description":"","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7369,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7368,"Name":"Controls","Json":{"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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\":12329,\"Group\":{\"Id\":7374,\"Name\":\"System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":5,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"SystemLanguage\",\"Json\":\"{\\\"name\\\":\\\"SystemLanguage\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"System Language\\\",\\\"type\\\":\\\"select\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"System Language\\\",\\\"options\\\":[{\\\"label\\\":\\\"en-US (English)\\\",\\\"value\\\":\\\"en-US\\\"},{\\\"label\\\":\\\"es (Español)\\\",\\\"value\\\":\\\"es\\\"},{\\\"label\\\":\\\"fr (French)\\\",\\\"value\\\":\\\"fr\\\"},{\\\"label\\\":\\\"nl (Dutch)\\\",\\\"value\\\":\\\"nl\\\"},{\\\"label\\\":\\\"ja (Japanese)\\\",\\\"value\\\":\\\"ja\\\"},{\\\"label\\\":\\\"cn (Chinese)\\\",\\\"value\\\":\\\"cn\\\"},{\\\"label\\\":\\\"de (German)\\\",\\\"value\\\":\\\"de\\\"},{\\\"label\\\":\\\"pl (Polish)\\\",\\\"value\\\":\\\"pl\\\"},{\\\"label\\\":\\\"pt (portuguese)\\\",\\\"value\\\":\\\"pt\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1750272360},{"Type":1,"NewValue":"{\"Id\":12329,\"Group\":{\"Id\":7374,\"Name\":\"System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":5,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"SystemLanguage\",\"Json\":\"{\\\"name\\\":\\\"SystemLanguage\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"System Language\\\",\\\"type\\\":\\\"select\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"System Language\\\",\\\"options\\\":[{\\\"value\\\":\\\"en-US\\\",\\\"label\\\":\\\"en-US (English)\\\"},{\\\"value\\\":\\\"es\\\",\\\"label\\\":\\\"es (Español)\\\"},{\\\"value\\\":\\\"fr\\\",\\\"label\\\":\\\"fr (French)\\\"},{\\\"value\\\":\\\"nl\\\",\\\"label\\\":\\\"nl (Dutch)\\\"},{\\\"value\\\":\\\"ja\\\",\\\"label\\\":\\\"ja (Japanese)\\\"},{\\\"value\\\":\\\"cn\\\",\\\"label\\\":\\\"cn (Chinese)\\\"},{\\\"value\\\":\\\"de\\\",\\\"label\\\":\\\"de (German)\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1750348556},{"Type":1,"NewValue":"{\"Id\":12329,\"Group\":{\"Id\":7374,\"Name\":\"System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":5,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"SystemLanguage\",\"Json\":\"{\\\"name\\\":\\\"SystemLanguage\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"System Language\\\",\\\"type\\\":\\\"select\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"System Language\\\",\\\"options\\\":[{\\\"value\\\":\\\"en-US\\\",\\\"label\\\":\\\"en-US (English)\\\"},{\\\"label\\\":\\\"es (Español)\\\",\\\"value\\\":\\\"es-US\\\"},{\\\"label\\\":\\\"pt (Portuguese)\\\",\\\"value\\\":\\\"pt-PT\\\"},{\\\"label\\\":\\\"fr (French)\\\",\\\"value\\\":\\\"fr-FR\\\"},{\\\"label\\\":\\\"nl (Dutch)\\\",\\\"value\\\":\\\"nl-NL\\\"},{\\\"label\\\":\\\"de (German)\\\",\\\"value\\\":\\\"de-DE\\\"},{\\\"label\\\":\\\"ja (Japanese)\\\",\\\"value\\\":\\\"ja-JP\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751442394}],"LanguageId":null,"Tags":[]},{"Id":12327,"Group":{"Id":7375,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7369,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7368,"Name":"Controls","Json":{"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":7374,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":"SMS Gateway","Json":"{\"name\":\"SMS Gateway\",\"default\":\"\",\"description\":\"Set SMS Gateway\",\"type\":\"select\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Select the SMS gateway that the device will use to send and receive SMSs (Esendex UK/Esendex Spain)\",\"options\":[{\"value\":\"00447781482635,Esendex UK\",\"label\":\"Esendex UK\"},{\"value\":\"0034627177148,Esendex Spain\",\"label\":\"Esendex Spain\"},{\"value\":\"00447507288240,Esendex UK Acceptance\",\"label\":\"Esendex UK Acceptance\"},{\"value\":\"default\",\"label\":\"default\"}],\"toTranslate\":[\"name\",\"description\",\"helpText\",\"label\"]}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":12322,"Group":{"Id":7375,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7369,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7368,"Name":"Controls","Json":{"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":7374,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":"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\" }, { \"value\": \"everywhere,eesecure,eesecure\", \"label\": \"EE Secure [uk]\" } ], \"toTranslate\": [ \"name\", \"description\", \"helpText\", \"label\" ]}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":12326,"Group":{"Id":7375,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7369,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7368,"Name":"Controls","Json":{"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":7374,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":"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":12324,"Group":{"Id":7376,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7369,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7368,"Name":"Controls","Json":{"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":7374,"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":7375,"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":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"Emergency Number","Json":"{\"name\":\"Emergency Number\",\"default\":\"\",\"description\":\"Emergency Number\",\"type\":\"phone\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"The number called when the default SOS button is pushed on the device (typically the ARC)\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":12314,"Group":{"Id":7378,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7367,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7368,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7369,"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":7370,"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":7371,"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":7372,"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":7373,"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":7380,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","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":"No Motion Alert","Json":"{\"name\":\"No Motion Alert\",\"default\":\"\",\"description\":\"No Motion Alert\",\"type\":\"text\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":true,\"isHidden\":true,\"minLength\":null,\"maxLength\":null,\"helpText\":\"No Motion Alert Debugging only\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":12316,"Group":{"Id":7378,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7367,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7368,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7369,"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":7370,"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":7371,"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":7372,"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":7373,"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":7380,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","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":"Emergency Number","Json":"{\"name\":\"Emergency Number\",\"default\":\"\",\"description\":\"Current Emergency Number\",\"type\":\"text\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":true,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"This is the number the device will call when the SOS button is pushed\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":12315,"Group":{"Id":7378,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7367,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7368,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7369,"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":7370,"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":7371,"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":7372,"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":7373,"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":7380,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","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":"Fall Settings","Json":"{\"name\":\"Fall Settings\",\"default\":\"\",\"description\":\"Fall Settings\",\"type\":\"text\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":true,\"isHidden\":true,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Fall Settings debugging only\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":12321,"Group":{"Id":7379,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7369,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7368,"Name":"Controls","Json":{"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"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":12328,"Group":{"Id":7380,"Name":"Read System Settings","Json":{"description":"","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7367,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7368,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7369,"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Auto Answer","Json":"{\"name\":\"Auto Answer\",\"default\":\"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":[],"LanguageId":null,"Tags":[]},{"Id":12317,"Group":{"Id":7380,"Name":"Read System Settings","Json":{"description":"","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7367,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7368,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7369,"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"System Language","Json":"{\"name\":\"System Language\",\"default\":\"\",\"description\":\"System Language\",\"type\":\"text\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":true,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"System Language\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"],\"order\":2}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":12318,"Group":{"Id":7380,"Name":"Read System Settings","Json":{"description":"","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7367,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7368,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7369,"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Allow List","Json":"{\"name\":\"Allow List\",\"default\":\"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":[],"LanguageId":null,"Tags":[]},{"Id":12331,"Group":{"Id":7380,"Name":"Read System Settings","Json":{"description":"","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7367,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7368,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7369,"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Volume","Json":"{\"name\":\"Volume\",\"default\":\"\",\"description\":\"Volume\",\"type\":\"radioGroup\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":true,\"isHidden\":false,\"minLength\":1,\"maxLength\":100,\"helpText\":\"Volume 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":[]},{"Id":12342,"Group":{"Id":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7376,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7369,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7368,"Name":"Controls","Json":{"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":7374,"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":7375,"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":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Sensitivity","Json":"{\"name\":\"Sensitivity\",\"default\":\"\",\"description\":\"Sensitivity\",\"type\":\"radioGroup\",\"suffix\":null,\"prefix\":null,\"min\":1,\"max\":9,\"futureOnly\":false,\"integerOnly\":true,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"1-9 (9 high sensitivity/low trigger)\",\"options\":[{\"value\":\"3\",\"label\":\"Low\"},{\"value\":\"6\",\"label\":\"Medium\"},{\"value\":\"9\",\"label\":\"High\"}],\"toTranslate\":[\"name\",\"description\",\"helpText\",\"label\"]}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":12343,"Group":{"Id":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7376,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7369,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7368,"Name":"Controls","Json":{"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":7374,"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":7375,"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":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Enable Disable Fall Settings","Json":"{\"name\":\"Enable Disable Fall Settings\",\"default\":\"false\",\"description\":\"Toggle Fall alert\",\"type\":\"enable\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Toggle feature that raises an alarm when the VIP falls and breaches the specified sensitivity setting\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"true","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":12344,"Group":{"Id":7385,"Name":"No Activity","Json":{"description":"","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7376,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7369,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7368,"Name":"Controls","Json":{"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":7374,"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":7375,"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":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Enable Disable No Activity","Json":"{\"name\":\"Enable Disable No Activity\",\"default\":\"true\",\"description\":\"Enable Disable No Activity \",\"type\":\"enable\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Enable or disable no activity alerts\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"true","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[{"Id":2219,"Name":"activateNoActivity","BackendAction":"activateNoActivity","Value":""}]},{"Id":12345,"Group":{"Id":7385,"Name":"No Activity","Json":{"description":"","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7376,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7369,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7368,"Name":"Controls","Json":{"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":7374,"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":7375,"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":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"No Activity","Json":"{\"name\":\"No Activity\",\"default\":\"\",\"description\":\"Set No Activity Events\",\"type\":\"number\",\"suffix\":null,\"prefix\":null,\"min\":5,\"max\":10080,\"futureOnly\":false,\"integerOnly\":true,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Set No Activity Alerts in minutes. If the device does not report in the time frame it triggers a No Activity alert\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[{"Id":2218,"Name":"noActivityInterval","BackendAction":"noActivityInterval","Value":""}]},{"Id":12336,"Group":{"Id":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7378,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7367,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7368,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7369,"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":7370,"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":7371,"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":7372,"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":7373,"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":7380,"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":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Sensitivity","Json":"{\"name\":\"Sensitivity\",\"default\":\"\",\"description\":\"Sensitivity\",\"type\":\"radioGroup\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":true,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"1-9 (9 high sensitivity/low trigger)\",\"options\":[{\"value\":\"3\",\"label\":\"Low\"},{\"label\":\"Medium\",\"value\":\"6\"},{\"label\":\"High\",\"value\":\"9\"}],\"toTranslate\":[\"name\",\"description\",\"helpText\",\"label\"]}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":12335,"Group":{"Id":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7378,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7367,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7368,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7369,"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":7370,"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":7371,"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":7372,"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":7373,"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":7380,"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":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Enable Disable Fall Settings","Json":"{\"name\":\"Enable Disable Fall Settings\",\"default\":\"false\",\"description\":\"Enable Disable Fall Settings\",\"type\":\"enable\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Enable Disable Fall Settings\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"true","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":12349,"Group":{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7378,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7367,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7368,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7369,"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":7370,"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":7371,"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":7372,"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":7373,"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":7380,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Enable Disable Non Movement Settings","Json":"{\"name\":\"Enable Disable Non Movement Settings\",\"default\":\"false\",\"description\":\"Enable Disable Non Movement Settings\",\"type\":\"enable\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Enable Disable Non Movement Settings\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"true","Command":null,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":12349,\"Group\":{\"Id\":7388,\"Name\":\"Read Non Movement Settings\",\"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\":\"Enable Disable Non Movement Settings\",\"Json\":\"{\\\"name\\\":\\\"Enable Disable Non Movement Settings\\\",\\\"default\\\":\\\"true\\\",\\\"description\\\":\\\"Enable Disable Non Movement Settings\\\",\\\"type\\\":\\\"enable\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":true,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Enable Disable Non Movement Settings\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"true\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1750696557},{"Type":2,"NewValue":"{\"Id\":12349,\"Group\":{\"Id\":7388,\"Name\":\"Read Non Movement Settings\",\"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\":\"Enable Disable Non Movement Settings\",\"Json\":\"{\\\"name\\\":\\\"Enable Disable Non Movement Settings\\\",\\\"default\\\":\\\"true\\\",\\\"description\\\":\\\"Enable Disable Non Movement Settings\\\",\\\"type\\\":\\\"enable\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":true,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Enable Disable Non Movement Settings\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"true\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751039678}],"LanguageId":null,"Tags":[]},{"Id":12350,"Group":{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7378,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7367,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7368,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7369,"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":7370,"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":7371,"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":7372,"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":7373,"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":7380,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Time","Json":"{\"name\":\"Time\",\"default\":\"\",\"description\":\"Time in non-movement\",\"type\":\"radioGroup\",\"suffix\":\"seconds\",\"prefix\":null,\"min\":60,\"max\":123,\"futureOnly\":false,\"integerOnly\":true,\"isReadOnly\":true,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Time in non-movement\",\"options\":[{\"value\":\"1800\",\"label\":\"30 minutes\"},{\"value\":\"3600\",\"label\":\"1 hour\"},{\"value\":\"5400\",\"label\":\"1 hour 30 minutes\"},{\"value\":\"7200\",\"label\":\"2 hours\"}],\"toTranslate\":[\"name\",\"description\",\"helpText\",\"label\"]}","Default":"","Command":null,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":12350,\"Group\":{\"Id\":7388,\"Name\":\"Read Non Movement Settings\",\"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\":\"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\\\":true,\\\"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\":[]}","Timestamp":1750696570},{"Type":2,"NewValue":"{\"Id\":12350,\"Group\":{\"Id\":7388,\"Name\":\"Read Non Movement Settings\",\"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\":\"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\\\":true,\\\"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\":[]}","Timestamp":1751039709}],"LanguageId":null,"Tags":[]},{"Id":12348,"Group":{"Id":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":{"Id":7377,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7369,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7368,"Name":"Controls","Json":{"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7379,"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":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"Beacon","Json":"{\"name\":\"Beacon\",\"default\":\"\",\"description\":null,\"type\":\"beacon\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Select beacon from the list\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":12337,"Group":{"Id":7390,"Name":"Approved Contacts","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":{"Id":7377,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7369,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7368,"Name":"Controls","Json":{"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7379,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"Contact","Json":"{\"name\":\"Contact\",\"default\":\"\",\"description\":\"Contact\",\"type\":\"phone\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Phone number of the contact\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":null,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":12337,\"Group\":{\"Id\":7390,\"Name\":\"Approved Contacts\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":2,\"listSize\":8,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":true,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Contact\",\"Json\":\"{\\\"name\\\":\\\"Contact\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Contact\\\",\\\"type\\\":\\\"phone\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Phone number of the contact\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1764100128},{"Type":0,"NewValue":"{\"Id\":12337,\"Group\":{\"Id\":7390,\"Name\":\"Approved Contacts\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":2,\"listSize\":8,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":true,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Contact\",\"Json\":\"{\\\"name\\\":\\\"Contact\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Contact\\\",\\\"type\\\":\\\"phone\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Phone number of the contact\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"\",\"Command\":{\"Id\":5806,\"Protocol\":{\"Id\":297,\"Code\":\"Access TEC Care Watch\",\"Version\":\"1.6\",\"FirmwareVersion\":\"V06.8601.2501\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"setWatchSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"// Watch Settings\\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 Watch Settings' Only enable y disable:\\r\\n// params.StepCounting.EnableDisableStepCounting == 'true'\\r\\n// params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true'\\r\\n//var params = {StepCounting:{'EnableDisableStepCounting':'true'},HeartRateMonitor:{'EnableDisableHeartRateMonitor':'true'}, DeviceVersion:{'DeviceVersion':2}}\\r\\n// Test enabled both\\r\\n// AB 10 13 00 99 6A 0A 00 02 11 36 00 08 1B 00 00 0E 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step on HRT off\\r\\n// AB 10 13 00 DD 0C 0B 00 02 11 36 00 08 0B 00 00 0C 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step off HRT on\\r\\n// AB 10 13 00 B5 D0 09 00 02 11 36 00 08 13 00 00 0A 00 00 00 14 00 00 00 03 0A 01\\r\\n// test both off \\r\\n// AB 10 13 00 F1 B6 0C 00 02 11 36 00 08 03 00 00 08 00 00 00 14 00 00 00 03 0A 01 \\r\\n// comando para Contact on ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 4C 2E 03 00 02 11 36 00 08 1B 00 00 4E 00 00 00 14 00 00 00 03 0A 01\\r\\n// comando para contact off ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 C2 8C 04 00 02 11 36 00 08 1B 00 00 46 00 00 00 14 00 00 00 03 0A 01\\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\n// To store the quantity of contacts in the whitelist to enable disable the contact menu\\r\\nvar contactos = params.ApprovedContacts && params.ApprovedContacts.Contact;\\r\\nvar numDuplas = Array.isArray(contactos) ? contactos.length : 0;\\r\\n// configuration command (0X02) , lenght and key\\r\\nvar messageBody = '021136';\\r\\n// step count/heart value display\\r\\n// Watch setting related FACE ID\\r\\nmessageBody += '00'; // Default FACE ID 0 \\r\\n// Future\\r\\n//if (params.WatchFace.SetWatchFace) {\\r\\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \\r\\n//} else {\\r\\n// messageBody += '00'; // Analog Face Default FACE ID 0 \\r\\n//}\\r\\n// Watch Display setting related to Step and heart rate settings\\r\\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '081B0000'; //both displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += (numDuplas > 2) ? 'E' : '6';\\r\\n //messageBody += '6'; //menu 1 and 2 \\r\\n //messageBody += 'E'; //menu 1 and 2 and contact (menu 3) \\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '080B0000'; // step display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '4'; //menu 2 \\r\\n //messageBody += 'C'; // menu 2 and contact (menu 3) \\r\\n messageBody += (numDuplas > 2) ? 'C' : '4';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '08130000'; // heart display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '2'; //menu 1 no contact (menu 3) \\r\\n //messageBody += 'A'; //menu 1 and contact (menu 3) \\r\\n messageBody += (numDuplas > 2) ? 'A' : '2';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '08030000'; // no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '0000000'; // no menu , //08 only contact\\r\\n //messageBody += '8'; // //08 only contact\\r\\n messageBody += (numDuplas > 2) ? '8' : '0';\\r\\n messageBody += '000000'; // other settings\\r\\n} else {\\r\\n messageBody += '08030000'; //no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '0000000'; // no menu..\\r\\n}\\r\\n//menu items for the future\\r\\n/*if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '06000000'; //menu 1 and 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '04000000'; //menu 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '02000000'; //menu 1\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '00000000'; // no menu\\r\\n} else {\\r\\n messageBody += '00000000'; // no menu\\r\\n}*/\\r\\n// from autohome page to the end\\r\\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\\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\\n//AddValueSMS('dataSMS', dataSMS);\\r\\nvar commandConfigs = {\\r\\n template: \\\"main\\\",\\r\\n configs: configs //,\\r\\n //configsSMS: configsSMS\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n// functions\\r\\nfunction AddValue(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n var arr1 = [];\\r\\n for (var n = 0, l = str.length; n < l; n++) {\\r\\n var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n arr1.push(hex);\\r\\n }\\r\\n return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n var crc = 0x0000;\\r\\n var j, i;\\r\\n for (i = 0; i < s.length; i++) {\\r\\n c = s[i];\\r\\n if (c > 255) {\\r\\n throw new RangeError();\\r\\n }\\r\\n j = (c ^ (crc >> 8)) & 0xFF;\\r\\n crc = crcTable[j] ^ (crc << 8);\\r\\n }\\r\\n return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n var splitStr = []\\r\\n var j = 0\\r\\n for (let i = 0; i < str.length; i += 2) {\\r\\n splitStr[j] = str.substring(i, i + 2)\\r\\n j++\\r\\n }\\r\\n var bytes = []\\r\\n var bytePos = 0\\r\\n for (let i = 0; i < splitStr.length; i++) {\\r\\n var byteStr = splitStr[i]\\r\\n var b = parseInt(byteStr, 16)\\r\\n if (b < 256) {\\r\\n bytes[bytePos] = b\\r\\n bytePos++\\r\\n }\\r\\n }\\r\\n return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n hexString = str.toString(16);\\r\\n return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n let bin = 0;\\r\\n let rem, i = 1,\\r\\n step = 1;\\r\\n while (x != 0) {\\r\\n rem = x % 2;\\r\\n x = parseInt(x / 2);\\r\\n bin = bin + rem * i;\\r\\n i = i * 10;\\r\\n }\\r\\n return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n var hexa = parseInt(x, 2).toString(16);\\r\\n return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n const result = [];\\r\\n let len = string.length - 2;\\r\\n while (len >= 0) {\\r\\n result.push(string.substr(len, 2));\\r\\n len -= 2;\\r\\n }\\r\\n return result.join('');\\r\\n}\",\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":true,\"SendAttempts\":4,\"Order\":null},\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1764100131},{"Type":1,"NewValue":"{\"Id\":12337,\"Group\":{\"Id\":7390,\"Name\":\"Approved Contacts\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":2,\"listSize\":8,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":true,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Contact\",\"Json\":\"{\\\"name\\\":\\\"Contact\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Contact\\\",\\\"type\\\":\\\"phone\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Phone number of the contact\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1764101901},{"Type":2,"NewValue":"{\"Id\":12337,\"Group\":{\"Id\":7390,\"Name\":\"Approved Contacts\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":2,\"listSize\":8,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":true,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Contact\",\"Json\":\"{\\\"name\\\":\\\"Contact\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Contact\\\",\\\"type\\\":\\\"phone\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Phone number of the contact\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"\",\"Command\":{\"Id\":5806,\"Protocol\":{\"Id\":297,\"Code\":\"Access TEC Care Watch\",\"Version\":\"1.6\",\"FirmwareVersion\":\"V06.8601.2501\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"setWatchSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"// Watch Settings\\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 Watch Settings' Only enable y disable:\\r\\n// params.StepCounting.EnableDisableStepCounting == 'true'\\r\\n// params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true'\\r\\n//var params = {StepCounting:{'EnableDisableStepCounting':'true'},HeartRateMonitor:{'EnableDisableHeartRateMonitor':'true'}, DeviceVersion:{'DeviceVersion':2}}\\r\\n// Test enabled both\\r\\n// AB 10 13 00 99 6A 0A 00 02 11 36 00 08 1B 00 00 0E 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step on HRT off\\r\\n// AB 10 13 00 DD 0C 0B 00 02 11 36 00 08 0B 00 00 0C 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step off HRT on\\r\\n// AB 10 13 00 B5 D0 09 00 02 11 36 00 08 13 00 00 0A 00 00 00 14 00 00 00 03 0A 01\\r\\n// test both off \\r\\n// AB 10 13 00 F1 B6 0C 00 02 11 36 00 08 03 00 00 08 00 00 00 14 00 00 00 03 0A 01 \\r\\n// comando para Contact on ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 4C 2E 03 00 02 11 36 00 08 1B 00 00 4E 00 00 00 14 00 00 00 03 0A 01\\r\\n// comando para contact off ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 C2 8C 04 00 02 11 36 00 08 1B 00 00 46 00 00 00 14 00 00 00 03 0A 01\\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\n// To store the quantity of contacts in the whitelist to enable disable the contact menu\\r\\n//var contactos = params.ApprovedContacts && params.ApprovedContacts.Contact;\\r\\nvar numDuplas = Array.isArray(params.ApprovedContacts) ? params.ApprovedContacts.length : 0;\\r\\n// configuration command (0X02) , lenght and key\\r\\nvar messageBody = '021136';\\r\\n// step count/heart value display\\r\\n// Watch setting related FACE ID\\r\\nmessageBody += '00'; // Default FACE ID 0 \\r\\n// Future\\r\\n//if (params.WatchFace.SetWatchFace) {\\r\\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \\r\\n//} else {\\r\\n// messageBody += '00'; // Analog Face Default FACE ID 0 \\r\\n//}\\r\\n// Watch Display setting related to Step and heart rate settings\\r\\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '081B0000'; //both displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += (numDuplas > 0) ? 'E' : '6';\\r\\n //messageBody += '6'; //menu 1 and 2 \\r\\n //messageBody += 'E'; //menu 1 and 2 and contact (menu 3) \\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '080B0000'; // step display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '4'; //menu 2 \\r\\n //messageBody += 'C'; // menu 2 and contact (menu 3) \\r\\n messageBody += (numDuplas > 0) ? 'C' : '4';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '08130000'; // heart display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '2'; //menu 1 no contact (menu 3) \\r\\n //messageBody += 'A'; //menu 1 and contact (menu 3) \\r\\n messageBody += (numDuplas > 0) ? 'A' : '2';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '08030000'; // no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '0000000'; // no menu , //08 only contact\\r\\n //messageBody += '8'; // //08 only contact\\r\\n messageBody += (numDuplas > 0) ? '8' : '0';\\r\\n messageBody += '000000'; // other settings\\r\\n} else {\\r\\n messageBody += '08030000'; //no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '0000000'; // no menu..\\r\\n}\\r\\n//menu items for the future\\r\\n/*if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '06000000'; //menu 1 and 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '04000000'; //menu 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '02000000'; //menu 1\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '00000000'; // no menu\\r\\n} else {\\r\\n messageBody += '00000000'; // no menu\\r\\n}*/\\r\\n// from autohome page to the end\\r\\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\\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\\n//AddValueSMS('dataSMS', dataSMS);\\r\\nvar commandConfigs = {\\r\\n template: \\\"main\\\",\\r\\n configs: configs //,\\r\\n //configsSMS: configsSMS\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n// functions\\r\\nfunction AddValue(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n var arr1 = [];\\r\\n for (var n = 0, l = str.length; n < l; n++) {\\r\\n var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n arr1.push(hex);\\r\\n }\\r\\n return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n var crc = 0x0000;\\r\\n var j, i;\\r\\n for (i = 0; i < s.length; i++) {\\r\\n c = s[i];\\r\\n if (c > 255) {\\r\\n throw new RangeError();\\r\\n }\\r\\n j = (c ^ (crc >> 8)) & 0xFF;\\r\\n crc = crcTable[j] ^ (crc << 8);\\r\\n }\\r\\n return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n var splitStr = []\\r\\n var j = 0\\r\\n for (let i = 0; i < str.length; i += 2) {\\r\\n splitStr[j] = str.substring(i, i + 2)\\r\\n j++\\r\\n }\\r\\n var bytes = []\\r\\n var bytePos = 0\\r\\n for (let i = 0; i < splitStr.length; i++) {\\r\\n var byteStr = splitStr[i]\\r\\n var b = parseInt(byteStr, 16)\\r\\n if (b < 256) {\\r\\n bytes[bytePos] = b\\r\\n bytePos++\\r\\n }\\r\\n }\\r\\n return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n hexString = str.toString(16);\\r\\n return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n let bin = 0;\\r\\n let rem, i = 1,\\r\\n step = 1;\\r\\n while (x != 0) {\\r\\n rem = x % 2;\\r\\n x = parseInt(x / 2);\\r\\n bin = bin + rem * i;\\r\\n i = i * 10;\\r\\n }\\r\\n return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n var hexa = parseInt(x, 2).toString(16);\\r\\n return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n const result = [];\\r\\n let len = string.length - 2;\\r\\n while (len >= 0) {\\r\\n result.push(string.substr(len, 2));\\r\\n len -= 2;\\r\\n }\\r\\n return result.join('');\\r\\n}\",\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":true,\"SendAttempts\":4,\"Order\":null},\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1764101904},{"Type":1,"NewValue":"{\"Id\":12337,\"Group\":{\"Id\":7390,\"Name\":\"Approved Contacts\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":2,\"listSize\":8,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":true,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Contact\",\"Json\":\"{\\\"name\\\":\\\"Contact\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Contact\\\",\\\"type\\\":\\\"phone\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Phone number of the contact\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1764837345},{"Type":0,"NewValue":"{\"Id\":12337,\"Group\":{\"Id\":7390,\"Name\":\"Approved Contacts\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":2,\"listSize\":8,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":true,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Contact\",\"Json\":\"{\\\"name\\\":\\\"Contact\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Contact\\\",\\\"type\\\":\\\"phone\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Phone number of the contact\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"\",\"Command\":{\"Id\":5806,\"Protocol\":{\"Id\":297,\"Code\":\"Access TEC Care Watch\",\"Version\":\"1.6\",\"FirmwareVersion\":\"V06.8601.2501\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"setWatchSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"// Watch Settings\\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 Watch Settings' Only enable y disable:\\r\\n// params.StepCounting.EnableDisableStepCounting == 'true'\\r\\n// params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true'\\r\\n//var params = {StepCounting:{'EnableDisableStepCounting':'true'},HeartRateMonitor:{'EnableDisableHeartRateMonitor':'true'}, DeviceVersion:{'DeviceVersion':2}}\\r\\n// Test enabled both\\r\\n// AB 10 13 00 99 6A 0A 00 02 11 36 00 08 1B 00 00 0E 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step on HRT off\\r\\n// AB 10 13 00 DD 0C 0B 00 02 11 36 00 08 0B 00 00 0C 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step off HRT on\\r\\n// AB 10 13 00 B5 D0 09 00 02 11 36 00 08 13 00 00 0A 00 00 00 14 00 00 00 03 0A 01\\r\\n// test both off \\r\\n// AB 10 13 00 F1 B6 0C 00 02 11 36 00 08 03 00 00 08 00 00 00 14 00 00 00 03 0A 01 \\r\\n// comando para Contact on ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 4C 2E 03 00 02 11 36 00 08 1B 00 00 4E 00 00 00 14 00 00 00 03 0A 01\\r\\n// comando para contact off ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 C2 8C 04 00 02 11 36 00 08 1B 00 00 46 00 00 00 14 00 00 00 03 0A 01\\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\n// To store the quantity of contacts in the whitelist to enable disable the contact menu\\r\\n//var contactos = params.ApprovedContacts && params.ApprovedContacts.Contact;\\r\\nvar numDuplas = Array.isArray(params.ApprovedContacts) ? params.ApprovedContacts.length : 0;\\r\\n// configuration command (0X02) , lenght and key\\r\\nvar messageBody = '021136';\\r\\n// step count/heart value display\\r\\n// Watch setting related FACE ID\\r\\nmessageBody += '00'; // Default FACE ID 0 \\r\\n// Future\\r\\n//if (params.WatchFace.SetWatchFace) {\\r\\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \\r\\n//} else {\\r\\n// messageBody += '00'; // Analog Face Default FACE ID 0 \\r\\n//}\\r\\n// Watch Display setting related to Step and heart rate settings\\r\\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '081B0000'; //both displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += (numDuplas > 0) ? 'E' : '6';\\r\\n //messageBody += '6'; //menu 1 and 2 \\r\\n //messageBody += 'E'; //menu 1 and 2 and contact (menu 3) \\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '080B0000'; // step display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '4'; //menu 2 \\r\\n //messageBody += 'C'; // menu 2 and contact (menu 3) \\r\\n messageBody += (numDuplas > 0) ? 'C' : '4';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '08130000'; // heart display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '2'; //menu 1 no contact (menu 3) \\r\\n //messageBody += 'A'; //menu 1 and contact (menu 3) \\r\\n messageBody += (numDuplas > 0) ? 'A' : '2';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '08030000'; // no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '0000000'; // no menu , //08 only contact\\r\\n //messageBody += '8'; // //08 only contact\\r\\n messageBody += (numDuplas > 0) ? '8' : '0';\\r\\n messageBody += '000000'; // other settings\\r\\n} else {\\r\\n messageBody += '08030000'; //no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '0000000'; // no menu..\\r\\n}\\r\\n//menu items for the future\\r\\n/*if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '06000000'; //menu 1 and 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '04000000'; //menu 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '02000000'; //menu 1\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '00000000'; // no menu\\r\\n} else {\\r\\n messageBody += '00000000'; // no menu\\r\\n}*/\\r\\n// from autohome page to the end\\r\\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\\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\\n//AddValueSMS('dataSMS', dataSMS);\\r\\nvar commandConfigs = {\\r\\n template: \\\"main\\\",\\r\\n configs: configs //,\\r\\n //configsSMS: configsSMS\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n// functions\\r\\nfunction AddValue(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n var arr1 = [];\\r\\n for (var n = 0, l = str.length; n < l; n++) {\\r\\n var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n arr1.push(hex);\\r\\n }\\r\\n return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n var crc = 0x0000;\\r\\n var j, i;\\r\\n for (i = 0; i < s.length; i++) {\\r\\n c = s[i];\\r\\n if (c > 255) {\\r\\n throw new RangeError();\\r\\n }\\r\\n j = (c ^ (crc >> 8)) & 0xFF;\\r\\n crc = crcTable[j] ^ (crc << 8);\\r\\n }\\r\\n return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n var splitStr = []\\r\\n var j = 0\\r\\n for (let i = 0; i < str.length; i += 2) {\\r\\n splitStr[j] = str.substring(i, i + 2)\\r\\n j++\\r\\n }\\r\\n var bytes = []\\r\\n var bytePos = 0\\r\\n for (let i = 0; i < splitStr.length; i++) {\\r\\n var byteStr = splitStr[i]\\r\\n var b = parseInt(byteStr, 16)\\r\\n if (b < 256) {\\r\\n bytes[bytePos] = b\\r\\n bytePos++\\r\\n }\\r\\n }\\r\\n return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n hexString = str.toString(16);\\r\\n return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n let bin = 0;\\r\\n let rem, i = 1,\\r\\n step = 1;\\r\\n while (x != 0) {\\r\\n rem = x % 2;\\r\\n x = parseInt(x / 2);\\r\\n bin = bin + rem * i;\\r\\n i = i * 10;\\r\\n }\\r\\n return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n var hexa = parseInt(x, 2).toString(16);\\r\\n return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n const result = [];\\r\\n let len = string.length - 2;\\r\\n while (len >= 0) {\\r\\n result.push(string.substr(len, 2));\\r\\n len -= 2;\\r\\n }\\r\\n return result.join('');\\r\\n}\",\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":true,\"SendAttempts\":4,\"Order\":null},\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1764837349},{"Type":1,"NewValue":"{\"Id\":12337,\"Group\":{\"Id\":7390,\"Name\":\"Approved Contacts\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":2,\"listSize\":8,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":true,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Contact\",\"Json\":\"{\\\"name\\\":\\\"Contact\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Contact\\\",\\\"type\\\":\\\"phone\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Phone number of the contact\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1764838452},{"Type":2,"NewValue":"{\"Id\":12337,\"Group\":{\"Id\":7390,\"Name\":\"Approved Contacts\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":2,\"listSize\":8,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":true,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Contact\",\"Json\":\"{\\\"name\\\":\\\"Contact\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Contact\\\",\\\"type\\\":\\\"phone\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Phone number of the contact\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"\",\"Command\":{\"Id\":5806,\"Protocol\":{\"Id\":297,\"Code\":\"Access TEC Care Watch\",\"Version\":\"1.6\",\"FirmwareVersion\":\"V06.8601.2501\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"setWatchSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"// Watch Settings\\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 Watch Settings' Only enable y disable:\\r\\n// params.StepCounting.EnableDisableStepCounting == 'true'\\r\\n// params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true'\\r\\n//var params = {StepCounting:{'EnableDisableStepCounting':'true'},HeartRateMonitor:{'EnableDisableHeartRateMonitor':'true'}, DeviceVersion:{'DeviceVersion':2}}\\r\\n// Test enabled both\\r\\n// AB 10 13 00 99 6A 0A 00 02 11 36 00 08 1B 00 00 0E 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step on HRT off\\r\\n// AB 10 13 00 DD 0C 0B 00 02 11 36 00 08 0B 00 00 0C 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step off HRT on\\r\\n// AB 10 13 00 B5 D0 09 00 02 11 36 00 08 13 00 00 0A 00 00 00 14 00 00 00 03 0A 01\\r\\n// test both off \\r\\n// AB 10 13 00 F1 B6 0C 00 02 11 36 00 08 03 00 00 08 00 00 00 14 00 00 00 03 0A 01 \\r\\n// comando para Contact on ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 4C 2E 03 00 02 11 36 00 08 1B 00 00 4E 00 00 00 14 00 00 00 03 0A 01\\r\\n// comando para contact off ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 C2 8C 04 00 02 11 36 00 08 1B 00 00 46 00 00 00 14 00 00 00 03 0A 01\\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\n// To store the quantity of contacts in the whitelist to enable disable the contact menu\\r\\n//var contactos = params.ApprovedContacts && params.ApprovedContacts.Contact;\\r\\nvar numDuplas = Array.isArray(params.ApprovedContacts) ? params.ApprovedContacts.length : 0;\\r\\n// configuration command (0X02) , lenght and key\\r\\nvar messageBody = '021136';\\r\\n// step count/heart value display\\r\\n// Watch setting related FACE ID\\r\\nmessageBody += '00'; // Default FACE ID 0 \\r\\n// Future\\r\\n//if (params.WatchFace.SetWatchFace) {\\r\\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \\r\\n//} else {\\r\\n// messageBody += '00'; // Analog Face Default FACE ID 0 \\r\\n//}\\r\\n// Watch Display setting related to Step and heart rate settings\\r\\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '081B0000'; //both displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += (numDuplas > 0) ? 'E' : '6';\\r\\n //messageBody += '6'; //menu 1 and 2 \\r\\n //messageBody += 'E'; //menu 1 and 2 and contact (menu 3) \\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '080B0000'; // step display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '4'; //menu 2 \\r\\n //messageBody += 'C'; // menu 2 and contact (menu 3) \\r\\n messageBody += (numDuplas > 0) ? 'C' : '4';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '08130000'; // heart display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '2'; //menu 1 no contact (menu 3) \\r\\n //messageBody += 'A'; //menu 1 and contact (menu 3) \\r\\n messageBody += (numDuplas > 0) ? 'A' : '2';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '08030000'; // no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '0000000'; // no menu , //08 only contact\\r\\n //messageBody += '8'; // //08 only contact\\r\\n messageBody += (numDuplas > 0) ? '8' : '0';\\r\\n messageBody += '000000'; // other settings\\r\\n} else {\\r\\n messageBody += '08030000'; //no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '0000000'; // no menu..\\r\\n}\\r\\n//menu items for the future\\r\\n/*if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '06000000'; //menu 1 and 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '04000000'; //menu 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '02000000'; //menu 1\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '00000000'; // no menu\\r\\n} else {\\r\\n messageBody += '00000000'; // no menu\\r\\n}*/\\r\\n// from autohome page to the end\\r\\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\\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\\n//AddValueSMS('dataSMS', dataSMS);\\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// functions\\r\\nfunction AddValue(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n var arr1 = [];\\r\\n for (var n = 0, l = str.length; n < l; n++) {\\r\\n var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n arr1.push(hex);\\r\\n }\\r\\n return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n var crc = 0x0000;\\r\\n var j, i;\\r\\n for (i = 0; i < s.length; i++) {\\r\\n c = s[i];\\r\\n if (c > 255) {\\r\\n throw new RangeError();\\r\\n }\\r\\n j = (c ^ (crc >> 8)) & 0xFF;\\r\\n crc = crcTable[j] ^ (crc << 8);\\r\\n }\\r\\n return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n var splitStr = []\\r\\n var j = 0\\r\\n for (let i = 0; i < str.length; i += 2) {\\r\\n splitStr[j] = str.substring(i, i + 2)\\r\\n j++\\r\\n }\\r\\n var bytes = []\\r\\n var bytePos = 0\\r\\n for (let i = 0; i < splitStr.length; i++) {\\r\\n var byteStr = splitStr[i]\\r\\n var b = parseInt(byteStr, 16)\\r\\n if (b < 256) {\\r\\n bytes[bytePos] = b\\r\\n bytePos++\\r\\n }\\r\\n }\\r\\n return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n hexString = str.toString(16);\\r\\n return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n let bin = 0;\\r\\n let rem, i = 1,\\r\\n step = 1;\\r\\n while (x != 0) {\\r\\n rem = x % 2;\\r\\n x = parseInt(x / 2);\\r\\n bin = bin + rem * i;\\r\\n i = i * 10;\\r\\n }\\r\\n return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n var hexa = parseInt(x, 2).toString(16);\\r\\n return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n const result = [];\\r\\n let len = string.length - 2;\\r\\n while (len >= 0) {\\r\\n result.push(string.substr(len, 2));\\r\\n len -= 2;\\r\\n }\\r\\n return result.join('');\\r\\n}\",\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":true,\"SendAttempts\":4,\"Order\":null},\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1764838456},{"Type":1,"NewValue":"{\"Id\":12337,\"Group\":{\"Id\":7390,\"Name\":\"Approved Contacts\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":2,\"listSize\":8,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":true,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Contact\",\"Json\":\"{\\\"name\\\":\\\"Contact\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Contact\\\",\\\"type\\\":\\\"phone\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Phone number of the contact\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1765219387},{"Type":0,"NewValue":"{\"Id\":12337,\"Group\":{\"Id\":7390,\"Name\":\"Approved Contacts\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":2,\"listSize\":8,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":true,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Contact\",\"Json\":\"{\\\"name\\\":\\\"Contact\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Contact\\\",\\\"type\\\":\\\"phone\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Phone number of the contact\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"\",\"Command\":{\"Id\":5819,\"Protocol\":{\"Id\":297,\"Code\":\"Access TEC Care Watch\",\"Version\":\"1.6\",\"FirmwareVersion\":\"V06.8601.2501\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"setAuthorisedNumbersAndWatchSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"// Combinated version setAuthorisedNumber with Watch Settings for EV06\\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// AB 10 22 00 32 FA 00 00 02 11 36 00 00 00 00 00 00 00 00 00 14 00 00 00 00 0A 00 0E 34 80 09 31 32 33 34 35 36 37 38 39 00 00\\r\\n// [Length]:11 [Key]:36 [Value]:00 00 00 00 00 00 00 00 00 14 00 00 00 00 0A 00\\r\\n//{\\\"watch\\\":{\\\"status18\\\":0,\\\"status17\\\":0,\\\"status19\\\":0,\\\"status10\\\":0,\\\"flagValue\\\":0,\\\"status12\\\":0,\\\"faceId\\\":0,\\\"status11\\\":0,\\\"status14\\\":0,\\\"status13\\\":0,\\\"status16\\\":0,\\\"status15\\\":0,\\\"status0\\\":0,\\\"status1\\\":0,\\\"menu8\\\":0,\\\"menu7\\\":0,\\\"menu6\\\":0,\\\"menu5\\\":0,\\\"menu4\\\":0,\\\"menu3\\\":0,\\\"menu2\\\":0,\\\"menu1\\\":0,\\\"autoTime\\\":20,\\\"brightNess\\\":0,\\\"logoIndex\\\":0,\\\"status20\\\":0,\\\"status8\\\":0,\\\"status9\\\":0,\\\"status2\\\":0,\\\"status3\\\":0,\\\"brightTime\\\":10}}\\r\\n//[Length]:0E [Key]:34 [Value]:80 09 31 32 33 34 35 36 37 38 39 00 00\\r\\n//{\\\"numberNamePhoto\\\":{\\\"call\\\":0,\\\"noCard\\\":0,\\\"number\\\":\\\"123456789\\\",\\\"enable\\\":1,\\\"sms\\\":0,\\\"name\\\":\\\"\\\",\\\"headURL\\\":\\\"\\\",\\\"index\\\":0}}\\r\\n// para pruebas en local Contact':\\r\\n//AB 10 12 00 94 ED 00 00 02 10 34 E0 09 31 32 33 34 35 36 37 38 39 02 79 6F 00\\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 phoneNumber = '';\\r\\nvar numberLength = '00';\\r\\nvar numberHex = '';\\r\\nvar nameLength = '00';\\r\\nvar nameHex = '';\\r\\nvar value = '02';\\r\\nvar keyLength = '00';\\r\\nvar confTel = '';\\r\\nvar count = 1; // approved contact will be from A2 to A9 - index 1 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 += \\\"0534\\\" + 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 phoneNumber = params.ApprovedContacts[contact].Contact;\\r\\n if (phoneNumber.startsWith(\\\"+\\\")) {\\r\\n phoneNumber = \\\"00\\\" + phoneNumber.substring(1);\\r\\n }\\r\\n numberHex = ascii_to_hexa(phoneNumber).toUpperCase();\\r\\n numberLength = ('00' + decimalToHex(phoneNumber.length)).slice(-2).toUpperCase();\\r\\n nameHex = ascii_to_hexa(params.ApprovedContacts[contact].Name).toUpperCase();\\r\\n nameLength = ('00' + decimalToHex(params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n keyLength = ('00' + decimalToHex(5 + phoneNumber.length + params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n value += keyLength + \\\"34\\\" + confTel + numberLength + numberHex + nameLength + nameHex + '00'; //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 phoneNumber = params.ApprovedContacts[contact].Contact;\\r\\n if (phoneNumber.startsWith(\\\"+\\\")) {\\r\\n phoneNumber = \\\"00\\\" + phoneNumber.substring(1);\\r\\n }\\r\\n numberHex = ascii_to_hexa(phoneNumber).toUpperCase();\\r\\n numberLength = ('00' + decimalToHex(phoneNumber.length)).slice(-2).toUpperCase();\\r\\n nameHex = ascii_to_hexa(params.ApprovedContacts[contact].Name).toUpperCase();\\r\\n nameLength = ('00' + decimalToHex(params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n keyLength = ('00' + decimalToHex(5 + phoneNumber.length + params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n value += keyLength + \\\"34\\\" + confTel + numberLength + numberHex + nameLength + nameHex + '00'; //no photo\\r\\n //value += keyLength + \\\"30\\\" + confTel + numberHex; //no photo \\r\\n }\\r\\n count++;\\r\\n}\\r\\ncounter = count; // to check how many contacts are in the lists\\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 += \\\"0534\\\" + confTel + '000000'; //no number, no name, no photo\\r\\n}\\r\\n// watch settings section\\r\\n// lenght and key\\r\\nvar messageBody = '1136';\\r\\n// step count/heart value display\\r\\n// Watch setting related FACE ID\\r\\nmessageBody += '00'; // Default FACE ID 0 \\r\\n// Future\\r\\n//if (params.WatchFace.SetWatchFace) {\\r\\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \\r\\n//} else {\\r\\n// messageBody += '00'; // Analog Face Default FACE ID 0 \\r\\n//}\\r\\n// Watch Display setting related to Step and heart rate settings\\r\\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '081B0000'; //both displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += (counter > 1) ? 'E' : '6';\\r\\n //messageBody += '6'; //menu 1 and 2 \\r\\n //messageBody += 'E'; //menu 1 and 2 and contact (menu 3) \\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '080B0000'; // step display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '4'; //menu 2 \\r\\n //messageBody += 'C'; // menu 2 and contact (menu 3) \\r\\n messageBody += (counter > 1) ? 'C' : '4';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '08130000'; // heart display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '2'; //menu 1 no contact (menu 3) \\r\\n //messageBody += 'A'; //menu 1 and contact (menu 3) \\r\\n messageBody += (counter > 1) ? 'A' : '2';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '08030000'; // no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '0000000'; // no menu , //08 only contact\\r\\n //messageBody += '8'; // //08 only contact\\r\\n messageBody += (counter > 1) ? '8' : '0';\\r\\n messageBody += '000000'; // other settings\\r\\n} else {\\r\\n messageBody += '08030000'; //no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '0000000'; // no menu..\\r\\n}\\r\\n// from autohome page to the end\\r\\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\\r\\nvalue += messageBody; //add watchsetting hex to contact hex in value var \\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}\",\"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":1765219390},{"Type":2,"NewValue":"{\"Id\":12337,\"Group\":{\"Id\":7390,\"Name\":\"Approved Contacts\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":2,\"listSize\":8,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":true,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Contact\",\"Json\":\"{\\\"name\\\":\\\"Contact\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Contact\\\",\\\"type\\\":\\\"phone\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Phone number of the contact\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"\",\"Command\":{\"Id\":5786,\"Protocol\":{\"Id\":297,\"Code\":\"Access TEC Care Watch\",\"Version\":\"1.6\",\"FirmwareVersion\":\"V06.8601.2501\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"setAuthorisedNumbers\",\"TemplateSMS\":\"\",\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"//updated v 3 for EV06\\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//[Length]:10 [Key]:34 [Value]:E0 09 31 32 33 34 35 36 37 38 39 02 79 6F 00\\r\\n//{\\\"numberNamePhoto\\\":{\\\"call\\\":1,\\\"noCard\\\":0,\\\"number\\\":\\\"123456789\\\",\\\"enable\\\":1,\\\"sms\\\":1,\\\"name\\\":\\\"yo\\\",\\\"headURL\\\":\\\"\\\",\\\"index\\\":0}}\\r\\n// para pruebas en local Contact':\\r\\n//AB 10 12 00 94 ED 00 00 02 10 34 E0 09 31 32 33 34 35 36 37 38 39 02 79 6F 00\\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 phoneNumber = '';\\r\\nvar numberLength = '00';\\r\\nvar numberHex = '';\\r\\nvar nameLength = '00';\\r\\nvar nameHex = '';\\r\\nvar value = '02';\\r\\nvar keyLength = '00';\\r\\nvar confTel = '';\\r\\nvar count = 1; // approved contact will be from A2 to A9 - index 1 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 += \\\"0534\\\" + 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 phoneNumber = params.ApprovedContacts[contact].Contact;\\r\\n if (phoneNumber.startsWith(\\\"+\\\")) {\\r\\n phoneNumber = \\\"00\\\" + phoneNumber.substring(1);\\r\\n }\\r\\n numberHex = ascii_to_hexa(phoneNumber).toUpperCase();\\r\\n numberLength = ('00' + decimalToHex(phoneNumber.length)).slice(-2).toUpperCase();\\r\\n nameHex = ascii_to_hexa(params.ApprovedContacts[contact].Name).toUpperCase();\\r\\n nameLength = ('00' + decimalToHex(params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n keyLength = ('00' + decimalToHex(5 + phoneNumber.length + params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n value += keyLength + \\\"34\\\" + confTel + numberLength + numberHex + nameLength + nameHex + '00'; //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 phoneNumber = params.ApprovedContacts[contact].Contact;\\r\\n if (phoneNumber.startsWith(\\\"+\\\")) {\\r\\n phoneNumber = \\\"00\\\" + phoneNumber.substring(1);\\r\\n }\\r\\n numberHex = ascii_to_hexa(phoneNumber).toUpperCase();\\r\\n numberLength = ('00' + decimalToHex(phoneNumber.length)).slice(-2).toUpperCase();\\r\\n nameHex = ascii_to_hexa(params.ApprovedContacts[contact].Name).toUpperCase();\\r\\n nameLength = ('00' + decimalToHex(params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n keyLength = ('00' + decimalToHex(5 + phoneNumber.length + params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n value += keyLength + \\\"34\\\" + confTel + numberLength + numberHex + nameLength + nameHex + '00'; //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 += \\\"0534\\\" + 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}\",\"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":1765219392}],"LanguageId":null,"Tags":[]},{"Id":12340,"Group":{"Id":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7376,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7369,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7368,"Name":"Controls","Json":{"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":7374,"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":7375,"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":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":"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":[{"Type":1,"NewValue":"{\"Id\":12340,\"Group\":{\"Id\":7391,\"Name\":\"Non Movement Settings\",\"Json\":{\"description\":null,\"columns\":1,\"order\":3,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"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\\\":true,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"The time the VIP has to be still before the non-movement alarm is raised\\\",\\\"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\":[]}","Timestamp":1750696539},{"Type":2,"NewValue":"{\"Id\":12340,\"Group\":{\"Id\":7391,\"Name\":\"Non Movement Settings\",\"Json\":{\"description\":null,\"columns\":1,\"order\":3,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"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\\\":true,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"The time the VIP has to be still before the non-movement alarm is raised\\\",\\\"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\":[]}","Timestamp":1751039803}],"LanguageId":null,"Tags":[]},{"Id":12341,"Group":{"Id":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7376,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7369,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7368,"Name":"Controls","Json":{"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":7374,"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":7375,"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":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":"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":[{"Type":1,"NewValue":"{\"Id\":12341,\"Group\":{\"Id\":7391,\"Name\":\"Non Movement Settings\",\"Json\":{\"description\":null,\"columns\":1,\"order\":3,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Enable Disable Non Movement Settings\",\"Json\":\"{\\\"name\\\":\\\"Enable Disable Non Movement Settings\\\",\\\"default\\\":\\\"false\\\",\\\"description\\\":\\\"Toggle Non-movement alert\\\",\\\"type\\\":\\\"enable\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":true,\\\"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\":\"true\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1750696525},{"Type":2,"NewValue":"{\"Id\":12341,\"Group\":{\"Id\":7391,\"Name\":\"Non Movement Settings\",\"Json\":{\"description\":null,\"columns\":1,\"order\":3,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Enable Disable Non Movement Settings\",\"Json\":\"{\\\"name\\\":\\\"Enable Disable Non Movement Settings\\\",\\\"default\\\":\\\"false\\\",\\\"description\\\":\\\"Toggle Non-movement alert\\\",\\\"type\\\":\\\"enable\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":true,\\\"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\":\"true\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751039756}],"LanguageId":null,"Tags":[]},{"Id":12351,"Group":{"Id":7412,"Name":"Read TeleHealth Settings","Json":{"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":"Enable Disable Steps","Json":"{\"name\":\"Enable Disable Steps\",\"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":[{"Type":0,"NewValue":"{\"Id\":12351,\"Group\":{\"Id\":7412,\"Name\":\"Read TeleHealth Settings\",\"Json\":{\"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\":\"Enable Disable Steps\",\"Json\":\"{\\\"name\\\":\\\"Enable Disable Steps\\\",\\\"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\":[]}","Timestamp":1748624079},{"Type":2,"NewValue":"{\"Id\":12351,\"Group\":{\"Id\":7412,\"Name\":\"Read TeleHealth Settings\",\"Json\":{\"description\":\"Read TeleHealth Settings\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Enable Disable Steps\",\"Json\":\"{\\\"name\\\":\\\"Enable Disable Steps\\\",\\\"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\":[]}","Timestamp":1749655895}],"LanguageId":null,"Tags":[]},{"Id":12352,"Group":{"Id":7412,"Name":"Read TeleHealth Settings","Json":{"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":"Reporting Frequency","Json":"{\"name\":\"Reporting Frequency\",\"default\":\"\",\"description\":null,\"type\":\"radioGroup\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Current reporting frequency for Steps\",\"options\":[{\"label\":\"12 hours\",\"value\":\"12\"},{\"label\":\"6 hours\",\"value\":\"6\"},{\"label\":\"1 hour\",\"value\":\"1\"},{\"label\":\"30 mins\",\"value\":\"30\"}],\"toTranslate\":[\"name\",\"description\",\"helpText\",\"label\"]}","Default":"","Command":null,"ProtocolActionObjects":[{"Type":0,"NewValue":"{\"Id\":12352,\"Group\":{\"Id\":7412,\"Name\":\"Read TeleHealth Settings\",\"Json\":{\"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\":\"Reporting Frequency\",\"Json\":\"{\\\"name\\\":\\\"Reporting Frequency\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":null,\\\"type\\\":\\\"radioGroup\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Current reporting frequency for Steps\\\",\\\"options\\\":[{\\\"label\\\":\\\"12 hours\\\",\\\"value\\\":\\\"12\\\"},{\\\"label\\\":\\\"6 hours\\\",\\\"value\\\":\\\"6\\\"},{\\\"label\\\":\\\"1 hour\\\",\\\"value\\\":\\\"1\\\"},{\\\"label\\\":\\\"30 mins\\\",\\\"value\\\":\\\"30\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1748624251},{"Type":2,"NewValue":"{\"Id\":12352,\"Group\":{\"Id\":7412,\"Name\":\"Read TeleHealth Settings\",\"Json\":{\"description\":\"Read TeleHealth Settings\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Reporting Frequency\",\"Json\":\"{\\\"name\\\":\\\"Reporting Frequency\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":null,\\\"type\\\":\\\"radioGroup\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Current reporting frequency for Steps\\\",\\\"options\\\":[{\\\"label\\\":\\\"12 hours\\\",\\\"value\\\":\\\"12\\\"},{\\\"label\\\":\\\"6 hours\\\",\\\"value\\\":\\\"6\\\"},{\\\"label\\\":\\\"1 hour\\\",\\\"value\\\":\\\"1\\\"},{\\\"label\\\":\\\"30 mins\\\",\\\"value\\\":\\\"30\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1749655876}],"LanguageId":null,"Tags":[]},{"Id":12353,"Group":{"Id":7411,"Name":"TeleHealth Settings","Json":{"description":"A group for telehealth metrics such as steps and SPO2","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Enable Disable Steps","Json":"{\"name\":\"Enable Disable Steps\",\"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":[{"Type":0,"NewValue":"{\"Id\":12353,\"Group\":{\"Id\":7411,\"Name\":\"TeleHealth Settings\",\"Json\":{\"description\":\"A group for telehealth metrics such as steps and SPO2\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Enable Disable Steps\",\"Json\":\"{\\\"name\\\":\\\"Enable Disable Steps\\\",\\\"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\":[]}","Timestamp":1748624878},{"Type":2,"NewValue":"{\"Id\":12353,\"Group\":{\"Id\":7411,\"Name\":\"TeleHealth Settings\",\"Json\":{\"description\":\"A group for telehealth metrics such as steps and SPO2\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Enable Disable Steps\",\"Json\":\"{\\\"name\\\":\\\"Enable Disable Steps\\\",\\\"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\":[]}","Timestamp":1749656285}],"LanguageId":null,"Tags":[]},{"Id":12354,"Group":{"Id":7413,"Name":"Read Steps Settings","Json":{"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":"Enable Disable Read Steps Settings","Json":"{\"name\":\"Enable Disable Read Steps 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":[{"Type":0,"NewValue":"{\"Id\":12354,\"Group\":{\"Id\":7413,\"Name\":\"Read Steps Settings\",\"Json\":{\"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\":\"Enable Disable Read Steps Settings\",\"Json\":\"{\\\"name\\\":\\\"Enable Disable Read Steps 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\":[]}","Timestamp":1748625076}],"LanguageId":null,"Tags":[]},{"Id":12355,"Group":{"Id":7413,"Name":"Read Steps Settings","Json":{"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":"Reporting Frequency","Json":"{\"name\":\"Reporting Frequency\",\"default\":\"\",\"description\":null,\"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\":\"12 hours\",\"value\":\"12\"},{\"label\":\"6 hours\",\"value\":\"6\"},{\"label\":\"1 hour\",\"value\":\"1\"},{\"label\":\"30 mins\",\"value\":\"30\"}],\"toTranslate\":[\"name\",\"description\",\"helpText\",\"label\"]}","Default":"","Command":null,"ProtocolActionObjects":[{"Type":0,"NewValue":"{\"Id\":12355,\"Group\":{\"Id\":7413,\"Name\":\"Read Steps Settings\",\"Json\":{\"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\":\"Reporting Frequency\",\"Json\":\"{\\\"name\\\":\\\"Reporting Frequency\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":null,\\\"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\\\":\\\"12 hours\\\",\\\"value\\\":\\\"12\\\"},{\\\"label\\\":\\\"6 hours\\\",\\\"value\\\":\\\"6\\\"},{\\\"label\\\":\\\"1 hour\\\",\\\"value\\\":\\\"1\\\"},{\\\"label\\\":\\\"30 mins\\\",\\\"value\\\":\\\"30\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1748625468},{"Type":1,"NewValue":"{\"Id\":12355,\"Group\":{\"Id\":7413,\"Name\":\"Read Steps Settings\",\"Json\":{\"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\":\"Reporting Frequency\",\"Json\":\"{\\\"name\\\":\\\"Reporting Frequency\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":null,\\\"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\\\":\\\"12 hours\\\",\\\"value\\\":\\\"720\\\"},{\\\"label\\\":\\\"6 hours\\\",\\\"value\\\":\\\"360\\\"},{\\\"label\\\":\\\"1 hour\\\",\\\"value\\\":\\\"60\\\"},{\\\"label\\\":\\\"30 min\\\",\\\"value\\\":\\\"30\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1748971997},{"Type":1,"NewValue":"{\"Id\":12355,\"Group\":{\"Id\":7413,\"Name\":\"Read Steps Settings\",\"Json\":{\"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\":\"Reporting Frequency\",\"Json\":\"{\\\"name\\\":\\\"Reporting Frequency\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":null,\\\"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\\\":\\\"720\\\",\\\"label\\\":\\\"12 hours\\\"},{\\\"value\\\":\\\"360\\\",\\\"label\\\":\\\"6 hours\\\"},{\\\"value\\\":\\\"60\\\",\\\"label\\\":\\\"1 hour\\\"},{\\\"value\\\":\\\"30\\\",\\\"label\\\":\\\"30 min\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1749052743}],"LanguageId":null,"Tags":[]},{"Id":12356,"Group":{"Id":7414,"Name":"Read Heartrate Settings","Json":{"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":"Enable Disable Read Heartrate Settings","Json":"{\"name\":\"Enable Disable Read Heartrate 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":[{"Type":0,"NewValue":"{\"Id\":12356,\"Group\":{\"Id\":7414,\"Name\":\"Read Heartrate Settings\",\"Json\":{\"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\":\"Enable Disable Read Heartrate Settings\",\"Json\":\"{\\\"name\\\":\\\"Enable Disable Read Heartrate 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\":[]}","Timestamp":1748625605}],"LanguageId":null,"Tags":[]},{"Id":12357,"Group":{"Id":7414,"Name":"Read Heartrate Settings","Json":{"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":"Reporting Frequency","Json":"{\"name\":\"Reporting Frequency\",\"default\":\"\",\"description\":null,\"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\":\"12 hours\",\"value\":\"12\"},{\"label\":\"6 hours\",\"value\":\"6\"},{\"label\":\"1 hour\",\"value\":\"1\"},{\"label\":\"30 mins\",\"value\":\"30\"}],\"toTranslate\":[\"name\",\"description\",\"helpText\",\"label\"]}","Default":"","Command":null,"ProtocolActionObjects":[{"Type":0,"NewValue":"{\"Id\":12357,\"Group\":{\"Id\":7414,\"Name\":\"Read Heartrate Settings\",\"Json\":{\"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\":\"Reporting Frequency\",\"Json\":\"{\\\"name\\\":\\\"Reporting Frequency\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":null,\\\"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\\\":\\\"12 hours\\\",\\\"value\\\":\\\"12\\\"},{\\\"label\\\":\\\"6 hours\\\",\\\"value\\\":\\\"6\\\"},{\\\"label\\\":\\\"1 hour\\\",\\\"value\\\":\\\"1\\\"},{\\\"label\\\":\\\"30 mins\\\",\\\"value\\\":\\\"30\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1748625683},{"Type":1,"NewValue":"{\"Id\":12357,\"Group\":{\"Id\":7414,\"Name\":\"Read Heartrate Settings\",\"Json\":{\"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\":\"Reporting Frequency\",\"Json\":\"{\\\"name\\\":\\\"Reporting Frequency\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":null,\\\"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\\\":\\\"12 hours\\\",\\\"value\\\":\\\"720\\\"},{\\\"label\\\":\\\"6 hours\\\",\\\"value\\\":\\\"360\\\"},{\\\"label\\\":\\\"1 hour\\\",\\\"value\\\":\\\"60\\\"},{\\\"label\\\":\\\"30 min\\\",\\\"value\\\":\\\"30\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1748971849}],"LanguageId":null,"Tags":[]},{"Id":12358,"Group":{"Id":7411,"Name":"TeleHealth Settings","Json":{"description":"A group for telehealth metrics such as steps and SPO2","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Reporting Frequency","Json":"{\"name\":\"Reporting Frequency\",\"default\":\"\",\"description\":null,\"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\":[{\"label\":\"12 hours\",\"value\":\"12\"},{\"label\":\"6 hours\",\"value\":\"6\"},{\"label\":\"1 hour\",\"value\":\"1\"},{\"label\":\"30 mins\",\"value\":\"30\"}],\"toTranslate\":[\"name\",\"description\",\"helpText\",\"label\"]}","Default":"","Command":null,"ProtocolActionObjects":[{"Type":0,"NewValue":"{\"Id\":12358,\"Group\":{\"Id\":7411,\"Name\":\"TeleHealth Settings\",\"Json\":{\"description\":\"A group for telehealth metrics such as steps and SPO2\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Reporting Frequency\",\"Json\":\"{\\\"name\\\":\\\"Reporting Frequency\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":null,\\\"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\\\":[{\\\"label\\\":\\\"12 hours\\\",\\\"value\\\":\\\"12\\\"},{\\\"label\\\":\\\"6 hours\\\",\\\"value\\\":\\\"6\\\"},{\\\"label\\\":\\\"1 hour\\\",\\\"value\\\":\\\"1\\\"},{\\\"label\\\":\\\"30 mins\\\",\\\"value\\\":\\\"30\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1748625885},{"Type":2,"NewValue":"{\"Id\":12358,\"Group\":{\"Id\":7411,\"Name\":\"TeleHealth Settings\",\"Json\":{\"description\":\"A group for telehealth metrics such as steps and SPO2\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Reporting Frequency\",\"Json\":\"{\\\"name\\\":\\\"Reporting Frequency\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":null,\\\"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\\\":[{\\\"label\\\":\\\"12 hours\\\",\\\"value\\\":\\\"12\\\"},{\\\"label\\\":\\\"6 hours\\\",\\\"value\\\":\\\"6\\\"},{\\\"label\\\":\\\"1 hour\\\",\\\"value\\\":\\\"1\\\"},{\\\"label\\\":\\\"30 mins\\\",\\\"value\\\":\\\"30\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1749656300}],"LanguageId":null,"Tags":[]},{"Id":12359,"Group":{"Id":7415,"Name":"Steps Settings","Json":{"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":"Enable Disable Steps Settings","Json":"{\"name\":\"Enable Disable Steps 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":[{"Type":0,"NewValue":"{\"Id\":12359,\"Group\":{\"Id\":7415,\"Name\":\"Steps Settings\",\"Json\":{\"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\":\"Enable Disable Steps Settings\",\"Json\":\"{\\\"name\\\":\\\"Enable Disable Steps 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\":[]}","Timestamp":1748626017},{"Type":1,"NewValue":"{\"Id\":12359,\"Group\":{\"Id\":7415,\"Name\":\"Steps Settings\",\"Json\":{\"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\":\"Enable Disable Steps Settings\",\"Json\":\"{\\\"name\\\":\\\"Enable Disable Steps Settings\\\",\\\"default\\\":\\\"false\\\",\\\"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\":[]}","Timestamp":1748972551},{"Type":0,"NewValue":"{\"Id\":12359,\"Group\":{\"Id\":7415,\"Name\":\"Steps Settings\",\"Json\":{\"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\":\"Enable Disable Steps Settings\",\"Json\":\"{\\\"name\\\":\\\"Enable Disable Steps Settings\\\",\\\"default\\\":\\\"false\\\",\\\"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\":{\"Id\":5739,\"Protocol\":{\"Id\":297,\"Code\":\"Access TEC Care Watch\",\"Version\":\"0.2\",\"FirmwareVersion\":\"\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"setStepCollectSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"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.StepsSettings.ReportingFrequency) {\\n var heartBeat = parseInt(params.StepsSettings.ReportingFrequency);\\n heartBeat = decimalToHex(heartBeat);\\n heartBeat = ('000000' + heartBeat).slice(-6).toUpperCase();\\n if (params.StepsSettings.EnableDisableStepsSettings == '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 = '58020000';\\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}\",\"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":1748972555},{"Type":1,"NewValue":"{\"Id\":12359,\"Group\":{\"Id\":7415,\"Name\":\"Steps Settings\",\"Json\":{\"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\":\"Enable Disable Steps Settings\",\"Json\":\"{\\\"name\\\":\\\"Enable Disable Steps Settings\\\",\\\"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\":[]}","Timestamp":1749574292},{"Type":0,"NewValue":"{\"Id\":12359,\"Group\":{\"Id\":7415,\"Name\":\"Steps Settings\",\"Json\":{\"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\":\"Enable Disable Steps Settings\",\"Json\":\"{\\\"name\\\":\\\"Enable Disable Steps Settings\\\",\\\"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\":{\"Id\":5807,\"Protocol\":{\"Id\":297,\"Code\":\"Access TEC Care Watch\",\"Version\":\"0.3\",\"FirmwareVersion\":\"V06.8601.2501\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"setEnableStep\",\"TemplateSMS\":null,\"Template\":\"<>\",\"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 true\\nvalue += '1';\\n// Voice true\\nvalue += '1';\\n// Vibration true\\nvalue += '1';\\n// Cell Tower True\\nvalue += '1';\\n// Wifi true\\nvalue += '1';\\n// SOS speaker true\\nvalue += '1';\\n// Side call Speaker true\\nvalue += '1';\\n// BLE stay connected true\\nvalue += '1';\\n// BLE locating true\\nvalue += '1';\\n// SOS Call Voice true\\nvalue += '1';\\n// BLE always on true\\nvalue += '1';\\n// GPS location true\\nvalue += '1';\\n// TCP fast true\\nvalue += '1';\\n// Rotate screen to iluminate true\\nvalue += '1'; //watch only girar muñeca para iluminar pantalla\\n// Beacon true\\nvalue += '1';\\n// activity fuction true\\nvalue += '1'; // activity fuction, \\n//step counting, \\nif (params.StepsSettings.EnableDisableStepsSettings == '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';\\n// stop call sequence true\\nvalue += '1';\\n// other no use\\nvalue += '00000000';\\n// auto update false\\nvalue += '0';\\n// AGPS true\\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":1749574296},{"Type":2,"NewValue":"{\"Id\":12359,\"Group\":{\"Id\":7415,\"Name\":\"Steps Settings\",\"Json\":{\"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\":\"Enable Disable Steps Settings\",\"Json\":\"{\\\"name\\\":\\\"Enable Disable Steps Settings\\\",\\\"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\":{\"Id\":5739,\"Protocol\":{\"Id\":297,\"Code\":\"Access TEC Care Watch\",\"Version\":\"0.3\",\"FirmwareVersion\":\"V06.8601.2501\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"setStepCollectSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"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.StepsSettings.ReportingFrequency) {\\n var heartBeat = parseInt(params.StepsSettings.ReportingFrequency) * 60; //in seconds\\n heartBeat = decimalToHex(heartBeat);\\n heartBeat = ('000000' + heartBeat).slice(-6).toUpperCase();\\n if (params.StepsSettings.EnableDisableStepsSettings == '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 = '58020000';\\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}\",\"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":1749574299},{"Type":1,"NewValue":"{\"Id\":12359,\"Group\":{\"Id\":7415,\"Name\":\"Steps Settings\",\"Json\":{\"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\":\"Enable Disable Steps Settings\",\"Json\":\"{\\\"name\\\":\\\"Enable Disable Steps Settings\\\",\\\"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\":[]}","Timestamp":1749574476},{"Type":0,"NewValue":"{\"Id\":12359,\"Group\":{\"Id\":7415,\"Name\":\"Steps Settings\",\"Json\":{\"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\":\"Enable Disable Steps Settings\",\"Json\":\"{\\\"name\\\":\\\"Enable Disable Steps Settings\\\",\\\"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\":{\"Id\":5806,\"Protocol\":{\"Id\":297,\"Code\":\"Access TEC Care Watch\",\"Version\":\"0.3\",\"FirmwareVersion\":\"V06.8601.2501\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"setWatchSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"// Watch Settings\\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 Watch Settings' Only enable y disable:\\r\\n// params.StepCounting.EnableDisableStepCounting == 'true'\\r\\n// params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true'\\r\\n//var params = {StepCounting:{'EnableDisableStepCounting':'true'},HeartRateMonitor:{'EnableDisableHeartRateMonitor':'true'}, DeviceVersion:{'DeviceVersion':2}}\\r\\n// Test enabled both\\r\\n// AB 10 13 00 40 6F 00 00 02 11 36 00 08 1A 00 00 3E 00 00 00 14 00 00 00 00 00 00\\r\\n// test step on HRT off\\r\\n// 02 11 36 00 08 0A 00 00 3C 00 00 00 14 00 00 00 00 00 00\\r\\n// test step off HRT on\\r\\n// 02 11 36 00 08 12 00 00 3A 00 00 00 14 00 00 00 00 00 00\\r\\n// test both off \\r\\n// 02 11 36 00 08 02 00 00 38 00 00 00 14 00 00 00 00 00 00 \\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\n// configuration command (0X02) , lenght and key\\r\\nvar messageBody = '021136';\\r\\n// step count/heart value display\\r\\n// Watch setting related FACE ID\\r\\nmessageBody += '00'; // Default FACE ID 0 \\r\\n// Future\\r\\n//if (params.WatchFace.SetWatchFace) {\\r\\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \\r\\n//} else {\\r\\n// messageBody += '00'; // Analog Face Default FACE ID 0 \\r\\n//}\\r\\n// Watch Display setting related to Step and heart rate settings\\r\\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true')) {\\r\\n messageBody += '081A0000'; //both displays\\r\\n messageBody += '06000000'; //menu 1 and 2\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'false')) {\\r\\n messageBody += '080A0000'; // step display\\r\\n messageBody += '04000000'; //menu 2\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true')) {\\r\\n messageBody += '08120000'; // heart display\\r\\n messageBody += '02000000'; //menu 1\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'false')) {\\r\\n messageBody += '08020000'; // no displays\\r\\n messageBody += '00000000'; // no menu\\r\\n} else {\\r\\n messageBody += '08020000'; //no displays\\r\\n messageBody += '00000000'; // no menu\\r\\n}\\r\\n//menu items for the future\\r\\n/*if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '06000000'; //menu 1 and 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '04000000'; //menu 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '02000000'; //menu 1\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '00000000'; // no menu\\r\\n} else {\\r\\n messageBody += '00000000'; // no menu\\r\\n}*/\\r\\n// from autohome page to the end\\r\\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\\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\":0,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":true,\"SendAttempts\":4,\"Order\":null},\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1749574479},{"Type":1,"NewValue":"{\"Id\":12359,\"Group\":{\"Id\":7415,\"Name\":\"Steps Settings\",\"Json\":{\"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\":\"Enable Disable Steps Settings\",\"Json\":\"{\\\"name\\\":\\\"Enable Disable Steps Settings\\\",\\\"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\":[]}","Timestamp":1765220760},{"Type":0,"NewValue":"{\"Id\":12359,\"Group\":{\"Id\":7415,\"Name\":\"Steps Settings\",\"Json\":{\"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\":\"Enable Disable Steps Settings\",\"Json\":\"{\\\"name\\\":\\\"Enable Disable Steps Settings\\\",\\\"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\":{\"Id\":5819,\"Protocol\":{\"Id\":297,\"Code\":\"Access TEC Care Watch\",\"Version\":\"1.6\",\"FirmwareVersion\":\"V06.8601.2501\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"setAuthorisedNumbersAndWatchSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"// Combinated version setAuthorisedNumber with Watch Settings for EV06\\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// AB 10 22 00 32 FA 00 00 02 11 36 00 00 00 00 00 00 00 00 00 14 00 00 00 00 0A 00 0E 34 80 09 31 32 33 34 35 36 37 38 39 00 00\\r\\n// [Length]:11 [Key]:36 [Value]:00 00 00 00 00 00 00 00 00 14 00 00 00 00 0A 00\\r\\n//{\\\"watch\\\":{\\\"status18\\\":0,\\\"status17\\\":0,\\\"status19\\\":0,\\\"status10\\\":0,\\\"flagValue\\\":0,\\\"status12\\\":0,\\\"faceId\\\":0,\\\"status11\\\":0,\\\"status14\\\":0,\\\"status13\\\":0,\\\"status16\\\":0,\\\"status15\\\":0,\\\"status0\\\":0,\\\"status1\\\":0,\\\"menu8\\\":0,\\\"menu7\\\":0,\\\"menu6\\\":0,\\\"menu5\\\":0,\\\"menu4\\\":0,\\\"menu3\\\":0,\\\"menu2\\\":0,\\\"menu1\\\":0,\\\"autoTime\\\":20,\\\"brightNess\\\":0,\\\"logoIndex\\\":0,\\\"status20\\\":0,\\\"status8\\\":0,\\\"status9\\\":0,\\\"status2\\\":0,\\\"status3\\\":0,\\\"brightTime\\\":10}}\\r\\n//[Length]:0E [Key]:34 [Value]:80 09 31 32 33 34 35 36 37 38 39 00 00\\r\\n//{\\\"numberNamePhoto\\\":{\\\"call\\\":0,\\\"noCard\\\":0,\\\"number\\\":\\\"123456789\\\",\\\"enable\\\":1,\\\"sms\\\":0,\\\"name\\\":\\\"\\\",\\\"headURL\\\":\\\"\\\",\\\"index\\\":0}}\\r\\n// para pruebas en local Contact':\\r\\n//AB 10 12 00 94 ED 00 00 02 10 34 E0 09 31 32 33 34 35 36 37 38 39 02 79 6F 00\\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 phoneNumber = '';\\r\\nvar numberLength = '00';\\r\\nvar numberHex = '';\\r\\nvar nameLength = '00';\\r\\nvar nameHex = '';\\r\\nvar value = '02';\\r\\nvar keyLength = '00';\\r\\nvar confTel = '';\\r\\nvar count = 1; // approved contact will be from A2 to A9 - index 1 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\\ncounter = 0; // to check how many contacts are in the lists\\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 += \\\"0534\\\" + 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 phoneNumber = params.ApprovedContacts[contact].Contact;\\r\\n if (phoneNumber.startsWith(\\\"+\\\")) {\\r\\n phoneNumber = \\\"00\\\" + phoneNumber.substring(1);\\r\\n }\\r\\n numberHex = ascii_to_hexa(phoneNumber).toUpperCase();\\r\\n numberLength = ('00' + decimalToHex(phoneNumber.length)).slice(-2).toUpperCase();\\r\\n nameHex = ascii_to_hexa(params.ApprovedContacts[contact].Name).toUpperCase();\\r\\n nameLength = ('00' + decimalToHex(params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n keyLength = ('00' + decimalToHex(5 + phoneNumber.length + params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n value += keyLength + \\\"34\\\" + confTel + numberLength + numberHex + nameLength + nameHex + '00'; //no photo\\r\\n //value += keyLength + \\\"30\\\" + confTel + numberHex; //no photo \\r\\n counter++;\\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 phoneNumber = params.ApprovedContacts[contact].Contact;\\r\\n if (phoneNumber.startsWith(\\\"+\\\")) {\\r\\n phoneNumber = \\\"00\\\" + phoneNumber.substring(1);\\r\\n }\\r\\n numberHex = ascii_to_hexa(phoneNumber).toUpperCase();\\r\\n numberLength = ('00' + decimalToHex(phoneNumber.length)).slice(-2).toUpperCase();\\r\\n nameHex = ascii_to_hexa(params.ApprovedContacts[contact].Name).toUpperCase();\\r\\n nameLength = ('00' + decimalToHex(params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n keyLength = ('00' + decimalToHex(5 + phoneNumber.length + params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n value += keyLength + \\\"34\\\" + confTel + numberLength + numberHex + nameLength + nameHex + '00'; //no photo\\r\\n //value += keyLength + \\\"30\\\" + confTel + numberHex; //no photo \\r\\n counter++;\\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 += \\\"0534\\\" + confTel + '000000'; //no number, no name, no photo\\r\\n}\\r\\n// watch settings section\\r\\n// lenght and key\\r\\nvar messageBody = '1136';\\r\\n// step count/heart value display\\r\\n// Watch setting related FACE ID\\r\\nmessageBody += '00'; // Default FACE ID 0 \\r\\n// Future\\r\\n//if (params.WatchFace.SetWatchFace) {\\r\\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \\r\\n//} else {\\r\\n// messageBody += '00'; // Analog Face Default FACE ID 0 \\r\\n//}\\r\\n// Watch Display setting related to Step and heart rate settings\\r\\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '081B0000'; //both displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += (counter > 0) ? 'E' : '6';\\r\\n //messageBody += '6'; //menu 1 and 2 \\r\\n //messageBody += 'E'; //menu 1 and 2 and contact (menu 3) \\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '080B0000'; // step display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '4'; //menu 2 \\r\\n //messageBody += 'C'; // menu 2 and contact (menu 3) \\r\\n messageBody += (counter > 0) ? 'C' : '4';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '08130000'; // heart display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '2'; //menu 1 no contact (menu 3) \\r\\n //messageBody += 'A'; //menu 1 and contact (menu 3) \\r\\n messageBody += (counter > 0) ? 'A' : '2';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '08030000'; // no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '0000000'; // no menu , //08 only contact\\r\\n //messageBody += '8'; // //08 only contact\\r\\n messageBody += (counter > 0) ? '8' : '0';\\r\\n messageBody += '000000'; // other settings\\r\\n} else {\\r\\n messageBody += '08030000'; //no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '0000000'; // no menu..\\r\\n}\\r\\n// from autohome page to the end\\r\\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\\r\\nvalue += messageBody; //add watchsetting hex to contact hex in value var \\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}\",\"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":1765220764},{"Type":2,"NewValue":"{\"Id\":12359,\"Group\":{\"Id\":7415,\"Name\":\"Steps Settings\",\"Json\":{\"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\":\"Enable Disable Steps Settings\",\"Json\":\"{\\\"name\\\":\\\"Enable Disable Steps Settings\\\",\\\"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\":{\"Id\":5806,\"Protocol\":{\"Id\":297,\"Code\":\"Access TEC Care Watch\",\"Version\":\"1.6\",\"FirmwareVersion\":\"V06.8601.2501\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"setWatchSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"// Watch Settings\\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 Watch Settings' Only enable y disable:\\r\\n// params.StepCounting.EnableDisableStepCounting == 'true'\\r\\n// params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true'\\r\\n//var params = {StepCounting:{'EnableDisableStepCounting':'true'},HeartRateMonitor:{'EnableDisableHeartRateMonitor':'true'}, DeviceVersion:{'DeviceVersion':2}}\\r\\n// Test enabled both\\r\\n// AB 10 13 00 99 6A 0A 00 02 11 36 00 08 1B 00 00 0E 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step on HRT off\\r\\n// AB 10 13 00 DD 0C 0B 00 02 11 36 00 08 0B 00 00 0C 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step off HRT on\\r\\n// AB 10 13 00 B5 D0 09 00 02 11 36 00 08 13 00 00 0A 00 00 00 14 00 00 00 03 0A 01\\r\\n// test both off \\r\\n// AB 10 13 00 F1 B6 0C 00 02 11 36 00 08 03 00 00 08 00 00 00 14 00 00 00 03 0A 01 \\r\\n// comando para Contact on ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 4C 2E 03 00 02 11 36 00 08 1B 00 00 4E 00 00 00 14 00 00 00 03 0A 01\\r\\n// comando para contact off ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 C2 8C 04 00 02 11 36 00 08 1B 00 00 46 00 00 00 14 00 00 00 03 0A 01\\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\n// To store the quantity of contacts in the whitelist to enable disable the contact menu\\r\\n//var contactos = params.ApprovedContacts && params.ApprovedContacts.Contact;\\r\\n//var numDuplas = Array.isArray(params.ApprovedContacts) ? params.ApprovedContacts.length : 0;\\r\\n//var numDuplas = params.ApprovedContacts;\\r\\nlet numDuplas = 2;\\r\\n//for (const key in params.ApprovedContacts) {\\r\\n// if (params.ApprovedContacts[key] && params.ApprovedContacts[key].Contact && params.ApprovedContacts[key].Contact !== \\\"\\\") {\\r\\n// numDuplas++;\\r\\n// }\\r\\n//}\\r\\n//for (const key in params.ApprovedContacts) {\\r\\n// if (params.ApprovedContacts[key] && params.ApprovedContacts[key].Contact && params.ApprovedContacts[key].Contact !== \\\"\\\") {\\r\\n// numDuplas++;\\r\\n// }\\r\\n//}\\r\\n// configuration command (0X02) , lenght and key\\r\\nvar messageBody = '021136';\\r\\n// step count/heart value display\\r\\n// Watch setting related FACE ID\\r\\nmessageBody += '00'; // Default FACE ID 0 \\r\\n// Future\\r\\n//if (params.WatchFace.SetWatchFace) {\\r\\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \\r\\n//} else {\\r\\n// messageBody += '00'; // Analog Face Default FACE ID 0 \\r\\n//}\\r\\n// Watch Display setting related to Step and heart rate settings\\r\\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '081B0000'; //both displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += (numDuplas > 0) ? 'E' : '6';\\r\\n //messageBody += '6'; //menu 1 and 2 \\r\\n //messageBody += 'E'; //menu 1 and 2 and contact (menu 3) \\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '080B0000'; // step display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '4'; //menu 2 \\r\\n //messageBody += 'C'; // menu 2 and contact (menu 3) \\r\\n messageBody += (numDuplas > 0) ? 'C' : '4';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '08130000'; // heart display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '2'; //menu 1 no contact (menu 3) \\r\\n //messageBody += 'A'; //menu 1 and contact (menu 3) \\r\\n messageBody += (numDuplas > 0) ? 'A' : '2';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '08030000'; // no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '0000000'; // no menu , //08 only contact\\r\\n //messageBody += '8'; // //08 only contact\\r\\n messageBody += (numDuplas > 0) ? '8' : '0';\\r\\n messageBody += '000000'; // other settings\\r\\n} else {\\r\\n messageBody += '08030000'; //no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '0000000'; // no menu..\\r\\n}\\r\\n//menu items for the future\\r\\n/*if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '06000000'; //menu 1 and 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '04000000'; //menu 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '02000000'; //menu 1\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '00000000'; // no menu\\r\\n} else {\\r\\n messageBody += '00000000'; // no menu\\r\\n}*/\\r\\n// from autohome page to the end\\r\\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\\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\\n//AddValueSMS('dataSMS', dataSMS);\\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// functions\\r\\nfunction AddValue(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n var arr1 = [];\\r\\n for (var n = 0, l = str.length; n < l; n++) {\\r\\n var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n arr1.push(hex);\\r\\n }\\r\\n return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n var crc = 0x0000;\\r\\n var j, i;\\r\\n for (i = 0; i < s.length; i++) {\\r\\n c = s[i];\\r\\n if (c > 255) {\\r\\n throw new RangeError();\\r\\n }\\r\\n j = (c ^ (crc >> 8)) & 0xFF;\\r\\n crc = crcTable[j] ^ (crc << 8);\\r\\n }\\r\\n return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n var splitStr = []\\r\\n var j = 0\\r\\n for (let i = 0; i < str.length; i += 2) {\\r\\n splitStr[j] = str.substring(i, i + 2)\\r\\n j++\\r\\n }\\r\\n var bytes = []\\r\\n var bytePos = 0\\r\\n for (let i = 0; i < splitStr.length; i++) {\\r\\n var byteStr = splitStr[i]\\r\\n var b = parseInt(byteStr, 16)\\r\\n if (b < 256) {\\r\\n bytes[bytePos] = b\\r\\n bytePos++\\r\\n }\\r\\n }\\r\\n return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n hexString = str.toString(16);\\r\\n return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n let bin = 0;\\r\\n let rem, i = 1,\\r\\n step = 1;\\r\\n while (x != 0) {\\r\\n rem = x % 2;\\r\\n x = parseInt(x / 2);\\r\\n bin = bin + rem * i;\\r\\n i = i * 10;\\r\\n }\\r\\n return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n var hexa = parseInt(x, 2).toString(16);\\r\\n return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n const result = [];\\r\\n let len = string.length - 2;\\r\\n while (len >= 0) {\\r\\n result.push(string.substr(len, 2));\\r\\n len -= 2;\\r\\n }\\r\\n return result.join('');\\r\\n}\",\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":true,\"SendAttempts\":4,\"Order\":null},\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1765220766}],"LanguageId":null,"Tags":[]},{"Id":12360,"Group":{"Id":7415,"Name":"Steps Settings","Json":{"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":"Reporting Frequency","Json":"{\"name\":\"Reporting Frequency\",\"default\":\"\",\"description\":null,\"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\":[{\"label\":\"12 hours\",\"value\":\"12\"},{\"label\":\"6 hours\",\"value\":\"6\"},{\"label\":\"1 hour\",\"value\":\"1\"},{\"label\":\"30 mins\",\"value\":\"30\"}],\"toTranslate\":[\"name\",\"description\",\"helpText\",\"label\"]}","Default":"","Command":null,"ProtocolActionObjects":[{"Type":0,"NewValue":"{\"Id\":12360,\"Group\":{\"Id\":7415,\"Name\":\"Steps Settings\",\"Json\":{\"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\":\"Reporting Frequency\",\"Json\":\"{\\\"name\\\":\\\"Reporting Frequency\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":null,\\\"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\\\":[{\\\"label\\\":\\\"12 hours\\\",\\\"value\\\":\\\"12\\\"},{\\\"label\\\":\\\"6 hours\\\",\\\"value\\\":\\\"6\\\"},{\\\"label\\\":\\\"1 hour\\\",\\\"value\\\":\\\"1\\\"},{\\\"label\\\":\\\"30 mins\\\",\\\"value\\\":\\\"30\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1748626066},{"Type":1,"NewValue":"{\"Id\":12360,\"Group\":{\"Id\":7415,\"Name\":\"Steps Settings\",\"Json\":{\"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\":\"Reporting Frequency\",\"Json\":\"{\\\"name\\\":\\\"Reporting Frequency\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":null,\\\"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\\\":[{\\\"label\\\":\\\"12 hours\\\",\\\"value\\\":\\\"720\\\"},{\\\"label\\\":\\\"6 hours\\\",\\\"value\\\":\\\"360\\\"},{\\\"label\\\":\\\"1 hour\\\",\\\"value\\\":\\\"60\\\"},{\\\"label\\\":\\\"30 min\\\",\\\"value\\\":\\\"30\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1748972076},{"Type":1,"NewValue":"{\"Id\":12360,\"Group\":{\"Id\":7415,\"Name\":\"Steps Settings\",\"Json\":{\"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\":\"Reporting Frequency\",\"Json\":\"{\\\"name\\\":\\\"Reporting Frequency\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":null,\\\"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\\\":\\\"720\\\",\\\"label\\\":\\\"12 hours\\\"},{\\\"value\\\":\\\"360\\\",\\\"label\\\":\\\"6 hours\\\"},{\\\"value\\\":\\\"60\\\",\\\"label\\\":\\\"1 hour\\\"},{\\\"value\\\":\\\"30\\\",\\\"label\\\":\\\"30 min\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1748972586},{"Type":0,"NewValue":"{\"Id\":12360,\"Group\":{\"Id\":7415,\"Name\":\"Steps Settings\",\"Json\":{\"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\":\"Reporting Frequency\",\"Json\":\"{\\\"name\\\":\\\"Reporting Frequency\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":null,\\\"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\\\":\\\"720\\\",\\\"label\\\":\\\"12 hours\\\"},{\\\"value\\\":\\\"360\\\",\\\"label\\\":\\\"6 hours\\\"},{\\\"value\\\":\\\"60\\\",\\\"label\\\":\\\"1 hour\\\"},{\\\"value\\\":\\\"30\\\",\\\"label\\\":\\\"30 min\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"]}\",\"Default\":\"\",\"Command\":{\"Id\":5739,\"Protocol\":{\"Id\":297,\"Code\":\"Access TEC Care Watch\",\"Version\":\"0.2\",\"FirmwareVersion\":\"\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"setStepCollectSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"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.StepsSettings.ReportingFrequency) {\\n var heartBeat = parseInt(params.StepsSettings.ReportingFrequency);\\n heartBeat = decimalToHex(heartBeat);\\n heartBeat = ('000000' + heartBeat).slice(-6).toUpperCase();\\n if (params.StepsSettings.EnableDisableStepsSettings == '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 = '58020000';\\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}\",\"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":1748972589},{"Type":1,"NewValue":"{\"Id\":12360,\"Group\":{\"Id\":7415,\"Name\":\"Steps Settings\",\"Json\":{\"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\":\"Reporting Frequency\",\"Json\":\"{\\\"name\\\":\\\"Reporting Frequency\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":null,\\\"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\\\":\\\"720\\\",\\\"label\\\":\\\"12 hours\\\"},{\\\"value\\\":\\\"360\\\",\\\"label\\\":\\\"6 hours\\\"},{\\\"value\\\":\\\"60\\\",\\\"label\\\":\\\"1 hour\\\"},{\\\"value\\\":\\\"30\\\",\\\"label\\\":\\\"30 min\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1749052795},{"Type":2,"NewValue":"{\"Id\":12360,\"Group\":{\"Id\":7415,\"Name\":\"Steps Settings\",\"Json\":{\"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\":\"Reporting Frequency\",\"Json\":\"{\\\"name\\\":\\\"Reporting Frequency\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":null,\\\"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\\\":\\\"720\\\",\\\"label\\\":\\\"12 hours\\\"},{\\\"value\\\":\\\"360\\\",\\\"label\\\":\\\"6 hours\\\"},{\\\"value\\\":\\\"60\\\",\\\"label\\\":\\\"1 hour\\\"},{\\\"value\\\":\\\"30\\\",\\\"label\\\":\\\"30 min\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"]}\",\"Default\":\"\",\"Command\":{\"Id\":5739,\"Protocol\":{\"Id\":297,\"Code\":\"Access TEC Care Watch\",\"Version\":\"0.3\",\"FirmwareVersion\":\"\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"setStepCollectSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"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.StepsSettings.ReportingFrequency) {\\n var heartBeat = parseInt(params.StepsSettings.ReportingFrequency);\\n heartBeat = decimalToHex(heartBeat);\\n heartBeat = ('000000' + heartBeat).slice(-6).toUpperCase();\\n if (params.StepsSettings.EnableDisableStepsSettings == '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 = '58020000';\\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}\",\"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":1749052799}],"LanguageId":null,"Tags":[]},{"Id":12361,"Group":{"Id":7416,"Name":"Heartrate Settings","Json":{"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":"Enable Disable Heartrate Settings","Json":"{\"name\":\"Enable Disable Heartrate 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":[{"Type":0,"NewValue":"{\"Id\":12361,\"Group\":{\"Id\":7416,\"Name\":\"Heartrate Settings\",\"Json\":{\"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\":\"Enable Disable Heartrate Settings\",\"Json\":\"{\\\"name\\\":\\\"Enable Disable Heartrate 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\":[]}","Timestamp":1748626090},{"Type":1,"NewValue":"{\"Id\":12361,\"Group\":{\"Id\":7416,\"Name\":\"Heartrate Settings\",\"Json\":{\"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\":\"Enable Disable Heartrate Settings\",\"Json\":\"{\\\"name\\\":\\\"Enable Disable Heartrate Settings\\\",\\\"default\\\":\\\"false\\\",\\\"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\":[]}","Timestamp":1748971292},{"Type":0,"NewValue":"{\"Id\":12361,\"Group\":{\"Id\":7416,\"Name\":\"Heartrate Settings\",\"Json\":{\"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\":\"Enable Disable Heartrate Settings\",\"Json\":\"{\\\"name\\\":\\\"Enable Disable Heartrate Settings\\\",\\\"default\\\":\\\"false\\\",\\\"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\":{\"Id\":5726,\"Protocol\":{\"Id\":297,\"Code\":\"Access TEC Care Watch\",\"Version\":\"0.2\",\"FirmwareVersion\":\"\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"setHeartRateDetectingInterval\",\"TemplateSMS\":null,\"Template\":\"<>\",\"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.HeartrateSettings.ReportingFrequency) {\\n var heartBeat = parseInt(params.HeartrateSettings.ReportingFrequency);\\n heartBeat = decimalToHex(heartBeat);\\n heartBeat = ('000000' + heartBeat).slice(-6).toUpperCase();\\n if (params.HeartrateSettings.EnableDisableHeartrateSettings == '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 = '58020000'\\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}\",\"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":1748971295},{"Type":1,"NewValue":"{\"Id\":12361,\"Group\":{\"Id\":7416,\"Name\":\"Heartrate Settings\",\"Json\":{\"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\":\"Enable Disable Heartrate Settings\",\"Json\":\"{\\\"name\\\":\\\"Enable Disable Heartrate Settings\\\",\\\"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\":[]}","Timestamp":1749574458},{"Type":0,"NewValue":"{\"Id\":12361,\"Group\":{\"Id\":7416,\"Name\":\"Heartrate Settings\",\"Json\":{\"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\":\"Enable Disable Heartrate Settings\",\"Json\":\"{\\\"name\\\":\\\"Enable Disable Heartrate Settings\\\",\\\"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\":{\"Id\":5806,\"Protocol\":{\"Id\":297,\"Code\":\"Access TEC Care Watch\",\"Version\":\"0.3\",\"FirmwareVersion\":\"V06.8601.2501\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"setWatchSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"// Watch Settings\\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 Watch Settings' Only enable y disable:\\r\\n// params.StepCounting.EnableDisableStepCounting == 'true'\\r\\n// params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true'\\r\\n//var params = {StepCounting:{'EnableDisableStepCounting':'true'},HeartRateMonitor:{'EnableDisableHeartRateMonitor':'true'}, DeviceVersion:{'DeviceVersion':2}}\\r\\n// Test enabled both\\r\\n// AB 10 13 00 40 6F 00 00 02 11 36 00 08 1A 00 00 3E 00 00 00 14 00 00 00 00 00 00\\r\\n// test step on HRT off\\r\\n// 02 11 36 00 08 0A 00 00 3C 00 00 00 14 00 00 00 00 00 00\\r\\n// test step off HRT on\\r\\n// 02 11 36 00 08 12 00 00 3A 00 00 00 14 00 00 00 00 00 00\\r\\n// test both off \\r\\n// 02 11 36 00 08 02 00 00 38 00 00 00 14 00 00 00 00 00 00 \\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\n// configuration command (0X02) , lenght and key\\r\\nvar messageBody = '021136';\\r\\n// step count/heart value display\\r\\n// Watch setting related FACE ID\\r\\nmessageBody += '00'; // Default FACE ID 0 \\r\\n// Future\\r\\n//if (params.WatchFace.SetWatchFace) {\\r\\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \\r\\n//} else {\\r\\n// messageBody += '00'; // Analog Face Default FACE ID 0 \\r\\n//}\\r\\n// Watch Display setting related to Step and heart rate settings\\r\\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true')) {\\r\\n messageBody += '081A0000'; //both displays\\r\\n messageBody += '06000000'; //menu 1 and 2\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'false')) {\\r\\n messageBody += '080A0000'; // step display\\r\\n messageBody += '04000000'; //menu 2\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true')) {\\r\\n messageBody += '08120000'; // heart display\\r\\n messageBody += '02000000'; //menu 1\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'false')) {\\r\\n messageBody += '08020000'; // no displays\\r\\n messageBody += '00000000'; // no menu\\r\\n} else {\\r\\n messageBody += '08020000'; //no displays\\r\\n messageBody += '00000000'; // no menu\\r\\n}\\r\\n//menu items for the future\\r\\n/*if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '06000000'; //menu 1 and 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '04000000'; //menu 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '02000000'; //menu 1\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '00000000'; // no menu\\r\\n} else {\\r\\n messageBody += '00000000'; // no menu\\r\\n}*/\\r\\n// from autohome page to the end\\r\\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\\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\":0,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":true,\"SendAttempts\":4,\"Order\":null},\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1749574461},{"Type":1,"NewValue":"{\"Id\":12361,\"Group\":{\"Id\":7416,\"Name\":\"Heartrate Settings\",\"Json\":{\"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\":\"Enable Disable Heartrate Settings\",\"Json\":\"{\\\"name\\\":\\\"Enable Disable Heartrate Settings\\\",\\\"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\":[]}","Timestamp":1765220584},{"Type":0,"NewValue":"{\"Id\":12361,\"Group\":{\"Id\":7416,\"Name\":\"Heartrate Settings\",\"Json\":{\"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\":\"Enable Disable Heartrate Settings\",\"Json\":\"{\\\"name\\\":\\\"Enable Disable Heartrate Settings\\\",\\\"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\":{\"Id\":5819,\"Protocol\":{\"Id\":297,\"Code\":\"Access TEC Care Watch\",\"Version\":\"1.6\",\"FirmwareVersion\":\"V06.8601.2501\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"setAuthorisedNumbersAndWatchSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"// Combinated version setAuthorisedNumber with Watch Settings for EV06\\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// AB 10 22 00 32 FA 00 00 02 11 36 00 00 00 00 00 00 00 00 00 14 00 00 00 00 0A 00 0E 34 80 09 31 32 33 34 35 36 37 38 39 00 00\\r\\n// [Length]:11 [Key]:36 [Value]:00 00 00 00 00 00 00 00 00 14 00 00 00 00 0A 00\\r\\n//{\\\"watch\\\":{\\\"status18\\\":0,\\\"status17\\\":0,\\\"status19\\\":0,\\\"status10\\\":0,\\\"flagValue\\\":0,\\\"status12\\\":0,\\\"faceId\\\":0,\\\"status11\\\":0,\\\"status14\\\":0,\\\"status13\\\":0,\\\"status16\\\":0,\\\"status15\\\":0,\\\"status0\\\":0,\\\"status1\\\":0,\\\"menu8\\\":0,\\\"menu7\\\":0,\\\"menu6\\\":0,\\\"menu5\\\":0,\\\"menu4\\\":0,\\\"menu3\\\":0,\\\"menu2\\\":0,\\\"menu1\\\":0,\\\"autoTime\\\":20,\\\"brightNess\\\":0,\\\"logoIndex\\\":0,\\\"status20\\\":0,\\\"status8\\\":0,\\\"status9\\\":0,\\\"status2\\\":0,\\\"status3\\\":0,\\\"brightTime\\\":10}}\\r\\n//[Length]:0E [Key]:34 [Value]:80 09 31 32 33 34 35 36 37 38 39 00 00\\r\\n//{\\\"numberNamePhoto\\\":{\\\"call\\\":0,\\\"noCard\\\":0,\\\"number\\\":\\\"123456789\\\",\\\"enable\\\":1,\\\"sms\\\":0,\\\"name\\\":\\\"\\\",\\\"headURL\\\":\\\"\\\",\\\"index\\\":0}}\\r\\n// para pruebas en local Contact':\\r\\n//AB 10 12 00 94 ED 00 00 02 10 34 E0 09 31 32 33 34 35 36 37 38 39 02 79 6F 00\\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 phoneNumber = '';\\r\\nvar numberLength = '00';\\r\\nvar numberHex = '';\\r\\nvar nameLength = '00';\\r\\nvar nameHex = '';\\r\\nvar value = '02';\\r\\nvar keyLength = '00';\\r\\nvar confTel = '';\\r\\nvar count = 1; // approved contact will be from A2 to A9 - index 1 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\\ncounter = 0; // to check how many contacts are in the lists\\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 += \\\"0534\\\" + 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 phoneNumber = params.ApprovedContacts[contact].Contact;\\r\\n if (phoneNumber.startsWith(\\\"+\\\")) {\\r\\n phoneNumber = \\\"00\\\" + phoneNumber.substring(1);\\r\\n }\\r\\n numberHex = ascii_to_hexa(phoneNumber).toUpperCase();\\r\\n numberLength = ('00' + decimalToHex(phoneNumber.length)).slice(-2).toUpperCase();\\r\\n nameHex = ascii_to_hexa(params.ApprovedContacts[contact].Name).toUpperCase();\\r\\n nameLength = ('00' + decimalToHex(params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n keyLength = ('00' + decimalToHex(5 + phoneNumber.length + params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n value += keyLength + \\\"34\\\" + confTel + numberLength + numberHex + nameLength + nameHex + '00'; //no photo\\r\\n //value += keyLength + \\\"30\\\" + confTel + numberHex; //no photo \\r\\n counter++;\\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 phoneNumber = params.ApprovedContacts[contact].Contact;\\r\\n if (phoneNumber.startsWith(\\\"+\\\")) {\\r\\n phoneNumber = \\\"00\\\" + phoneNumber.substring(1);\\r\\n }\\r\\n numberHex = ascii_to_hexa(phoneNumber).toUpperCase();\\r\\n numberLength = ('00' + decimalToHex(phoneNumber.length)).slice(-2).toUpperCase();\\r\\n nameHex = ascii_to_hexa(params.ApprovedContacts[contact].Name).toUpperCase();\\r\\n nameLength = ('00' + decimalToHex(params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n keyLength = ('00' + decimalToHex(5 + phoneNumber.length + params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n value += keyLength + \\\"34\\\" + confTel + numberLength + numberHex + nameLength + nameHex + '00'; //no photo\\r\\n //value += keyLength + \\\"30\\\" + confTel + numberHex; //no photo \\r\\n counter++;\\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 += \\\"0534\\\" + confTel + '000000'; //no number, no name, no photo\\r\\n}\\r\\n// watch settings section\\r\\n// lenght and key\\r\\nvar messageBody = '1136';\\r\\n// step count/heart value display\\r\\n// Watch setting related FACE ID\\r\\nmessageBody += '00'; // Default FACE ID 0 \\r\\n// Future\\r\\n//if (params.WatchFace.SetWatchFace) {\\r\\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \\r\\n//} else {\\r\\n// messageBody += '00'; // Analog Face Default FACE ID 0 \\r\\n//}\\r\\n// Watch Display setting related to Step and heart rate settings\\r\\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '081B0000'; //both displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += (counter > 0) ? 'E' : '6';\\r\\n //messageBody += '6'; //menu 1 and 2 \\r\\n //messageBody += 'E'; //menu 1 and 2 and contact (menu 3) \\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '080B0000'; // step display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '4'; //menu 2 \\r\\n //messageBody += 'C'; // menu 2 and contact (menu 3) \\r\\n messageBody += (counter > 0) ? 'C' : '4';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '08130000'; // heart display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '2'; //menu 1 no contact (menu 3) \\r\\n //messageBody += 'A'; //menu 1 and contact (menu 3) \\r\\n messageBody += (counter > 0) ? 'A' : '2';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '08030000'; // no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '0000000'; // no menu , //08 only contact\\r\\n //messageBody += '8'; // //08 only contact\\r\\n messageBody += (counter > 0) ? '8' : '0';\\r\\n messageBody += '000000'; // other settings\\r\\n} else {\\r\\n messageBody += '08030000'; //no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '0000000'; // no menu..\\r\\n}\\r\\n// from autohome page to the end\\r\\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\\r\\nvalue += messageBody; //add watchsetting hex to contact hex in value var \\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}\",\"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":1765220587},{"Type":2,"NewValue":"{\"Id\":12361,\"Group\":{\"Id\":7416,\"Name\":\"Heartrate Settings\",\"Json\":{\"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\":\"Enable Disable Heartrate Settings\",\"Json\":\"{\\\"name\\\":\\\"Enable Disable Heartrate Settings\\\",\\\"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\":{\"Id\":5806,\"Protocol\":{\"Id\":297,\"Code\":\"Access TEC Care Watch\",\"Version\":\"1.6\",\"FirmwareVersion\":\"V06.8601.2501\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"setWatchSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"// Watch Settings\\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 Watch Settings' Only enable y disable:\\r\\n// params.StepCounting.EnableDisableStepCounting == 'true'\\r\\n// params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true'\\r\\n//var params = {StepCounting:{'EnableDisableStepCounting':'true'},HeartRateMonitor:{'EnableDisableHeartRateMonitor':'true'}, DeviceVersion:{'DeviceVersion':2}}\\r\\n// Test enabled both\\r\\n// AB 10 13 00 99 6A 0A 00 02 11 36 00 08 1B 00 00 0E 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step on HRT off\\r\\n// AB 10 13 00 DD 0C 0B 00 02 11 36 00 08 0B 00 00 0C 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step off HRT on\\r\\n// AB 10 13 00 B5 D0 09 00 02 11 36 00 08 13 00 00 0A 00 00 00 14 00 00 00 03 0A 01\\r\\n// test both off \\r\\n// AB 10 13 00 F1 B6 0C 00 02 11 36 00 08 03 00 00 08 00 00 00 14 00 00 00 03 0A 01 \\r\\n// comando para Contact on ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 4C 2E 03 00 02 11 36 00 08 1B 00 00 4E 00 00 00 14 00 00 00 03 0A 01\\r\\n// comando para contact off ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 C2 8C 04 00 02 11 36 00 08 1B 00 00 46 00 00 00 14 00 00 00 03 0A 01\\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\n// To store the quantity of contacts in the whitelist to enable disable the contact menu\\r\\n//var contactos = params.ApprovedContacts && params.ApprovedContacts.Contact;\\r\\n//var numDuplas = Array.isArray(params.ApprovedContacts) ? params.ApprovedContacts.length : 0;\\r\\n//var numDuplas = params.ApprovedContacts;\\r\\nlet numDuplas = 2;\\r\\n//for (const key in params.ApprovedContacts) {\\r\\n// if (params.ApprovedContacts[key] && params.ApprovedContacts[key].Contact && params.ApprovedContacts[key].Contact !== \\\"\\\") {\\r\\n// numDuplas++;\\r\\n// }\\r\\n//}\\r\\n//for (const key in params.ApprovedContacts) {\\r\\n// if (params.ApprovedContacts[key] && params.ApprovedContacts[key].Contact && params.ApprovedContacts[key].Contact !== \\\"\\\") {\\r\\n// numDuplas++;\\r\\n// }\\r\\n//}\\r\\n// configuration command (0X02) , lenght and key\\r\\nvar messageBody = '021136';\\r\\n// step count/heart value display\\r\\n// Watch setting related FACE ID\\r\\nmessageBody += '00'; // Default FACE ID 0 \\r\\n// Future\\r\\n//if (params.WatchFace.SetWatchFace) {\\r\\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \\r\\n//} else {\\r\\n// messageBody += '00'; // Analog Face Default FACE ID 0 \\r\\n//}\\r\\n// Watch Display setting related to Step and heart rate settings\\r\\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '081B0000'; //both displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += (numDuplas > 0) ? 'E' : '6';\\r\\n //messageBody += '6'; //menu 1 and 2 \\r\\n //messageBody += 'E'; //menu 1 and 2 and contact (menu 3) \\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '080B0000'; // step display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '4'; //menu 2 \\r\\n //messageBody += 'C'; // menu 2 and contact (menu 3) \\r\\n messageBody += (numDuplas > 0) ? 'C' : '4';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '08130000'; // heart display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '2'; //menu 1 no contact (menu 3) \\r\\n //messageBody += 'A'; //menu 1 and contact (menu 3) \\r\\n messageBody += (numDuplas > 0) ? 'A' : '2';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '08030000'; // no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '0000000'; // no menu , //08 only contact\\r\\n //messageBody += '8'; // //08 only contact\\r\\n messageBody += (numDuplas > 0) ? '8' : '0';\\r\\n messageBody += '000000'; // other settings\\r\\n} else {\\r\\n messageBody += '08030000'; //no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '0000000'; // no menu..\\r\\n}\\r\\n//menu items for the future\\r\\n/*if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '06000000'; //menu 1 and 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '04000000'; //menu 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '02000000'; //menu 1\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '00000000'; // no menu\\r\\n} else {\\r\\n messageBody += '00000000'; // no menu\\r\\n}*/\\r\\n// from autohome page to the end\\r\\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\\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\\n//AddValueSMS('dataSMS', dataSMS);\\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// functions\\r\\nfunction AddValue(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n var arr1 = [];\\r\\n for (var n = 0, l = str.length; n < l; n++) {\\r\\n var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n arr1.push(hex);\\r\\n }\\r\\n return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n var crc = 0x0000;\\r\\n var j, i;\\r\\n for (i = 0; i < s.length; i++) {\\r\\n c = s[i];\\r\\n if (c > 255) {\\r\\n throw new RangeError();\\r\\n }\\r\\n j = (c ^ (crc >> 8)) & 0xFF;\\r\\n crc = crcTable[j] ^ (crc << 8);\\r\\n }\\r\\n return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n var splitStr = []\\r\\n var j = 0\\r\\n for (let i = 0; i < str.length; i += 2) {\\r\\n splitStr[j] = str.substring(i, i + 2)\\r\\n j++\\r\\n }\\r\\n var bytes = []\\r\\n var bytePos = 0\\r\\n for (let i = 0; i < splitStr.length; i++) {\\r\\n var byteStr = splitStr[i]\\r\\n var b = parseInt(byteStr, 16)\\r\\n if (b < 256) {\\r\\n bytes[bytePos] = b\\r\\n bytePos++\\r\\n }\\r\\n }\\r\\n return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n hexString = str.toString(16);\\r\\n return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n let bin = 0;\\r\\n let rem, i = 1,\\r\\n step = 1;\\r\\n while (x != 0) {\\r\\n rem = x % 2;\\r\\n x = parseInt(x / 2);\\r\\n bin = bin + rem * i;\\r\\n i = i * 10;\\r\\n }\\r\\n return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n var hexa = parseInt(x, 2).toString(16);\\r\\n return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n const result = [];\\r\\n let len = string.length - 2;\\r\\n while (len >= 0) {\\r\\n result.push(string.substr(len, 2));\\r\\n len -= 2;\\r\\n }\\r\\n return result.join('');\\r\\n}\",\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":true,\"SendAttempts\":4,\"Order\":null},\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1765220589}],"LanguageId":null,"Tags":[]},{"Id":12362,"Group":{"Id":7416,"Name":"Heartrate Settings","Json":{"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":"Reporting Frequency","Json":"{\"name\":\"Reporting Frequency\",\"default\":\"\",\"description\":null,\"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\":[{\"label\":\"12 hours\",\"value\":\"12\"},{\"label\":\"6 hours\",\"value\":\"6\"},{\"label\":\"1 hour\",\"value\":\"1\"},{\"label\":\"30 mins\",\"value\":\"30\"}],\"toTranslate\":[\"name\",\"description\",\"helpText\",\"label\"]}","Default":"","Command":null,"ProtocolActionObjects":[{"Type":0,"NewValue":"{\"Id\":12362,\"Group\":{\"Id\":7416,\"Name\":\"Heartrate Settings\",\"Json\":{\"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\":\"Reporting Frequency\",\"Json\":\"{\\\"name\\\":\\\"Reporting Frequency\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":null,\\\"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\\\":[{\\\"label\\\":\\\"12 hours\\\",\\\"value\\\":\\\"12\\\"},{\\\"label\\\":\\\"6 hours\\\",\\\"value\\\":\\\"6\\\"},{\\\"label\\\":\\\"1 hour\\\",\\\"value\\\":\\\"1\\\"},{\\\"label\\\":\\\"30 mins\\\",\\\"value\\\":\\\"30\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1748626142},{"Type":1,"NewValue":"{\"Id\":12362,\"Group\":{\"Id\":7416,\"Name\":\"Heartrate Settings\",\"Json\":{\"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\":\"Reporting Frequency\",\"Json\":\"{\\\"name\\\":\\\"Reporting Frequency\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":null,\\\"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\\\":[{\\\"label\\\":\\\"12 hours\\\",\\\"value\\\":\\\"720\\\"},{\\\"label\\\":\\\"6 hours\\\",\\\"value\\\":\\\"360\\\"},{\\\"label\\\":\\\"1 hours\\\",\\\"value\\\":\\\"60\\\"},{\\\"label\\\":\\\"30 min\\\",\\\"value\\\":\\\"30\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1748971385},{"Type":0,"NewValue":"{\"Id\":12362,\"Group\":{\"Id\":7416,\"Name\":\"Heartrate Settings\",\"Json\":{\"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\":\"Reporting Frequency\",\"Json\":\"{\\\"name\\\":\\\"Reporting Frequency\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":null,\\\"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\\\":[{\\\"label\\\":\\\"12 hours\\\",\\\"value\\\":\\\"720\\\"},{\\\"label\\\":\\\"6 hours\\\",\\\"value\\\":\\\"360\\\"},{\\\"label\\\":\\\"1 hours\\\",\\\"value\\\":\\\"60\\\"},{\\\"label\\\":\\\"30 min\\\",\\\"value\\\":\\\"30\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"]}\",\"Default\":\"\",\"Command\":{\"Id\":5726,\"Protocol\":{\"Id\":297,\"Code\":\"Access TEC Care Watch\",\"Version\":\"0.2\",\"FirmwareVersion\":\"\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"setHeartRateDetectingInterval\",\"TemplateSMS\":null,\"Template\":\"<>\",\"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.HeartrateSettings.ReportingFrequency) {\\n var heartBeat = parseInt(params.HeartrateSettings.ReportingFrequency);\\n heartBeat = decimalToHex(heartBeat);\\n heartBeat = ('000000' + heartBeat).slice(-6).toUpperCase();\\n if (params.HeartrateSettings.EnableDisableHeartrateSettings == '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 = '58020000'\\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}\",\"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":1748971389},{"Type":1,"NewValue":"{\"Id\":12362,\"Group\":{\"Id\":7416,\"Name\":\"Heartrate Settings\",\"Json\":{\"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\":\"Reporting Frequency\",\"Json\":\"{\\\"name\\\":\\\"Reporting Frequency\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":null,\\\"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\\\":\\\"720\\\",\\\"label\\\":\\\"12 hours\\\"},{\\\"value\\\":\\\"360\\\",\\\"label\\\":\\\"6 hours\\\"},{\\\"label\\\":\\\"1 hour\\\",\\\"value\\\":\\\"60\\\"},{\\\"label\\\":\\\"30\\\",\\\"value\\\":\\\"min\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1748974585},{"Type":1,"NewValue":"{\"Id\":12362,\"Group\":{\"Id\":7416,\"Name\":\"Heartrate Settings\",\"Json\":{\"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\":\"Reporting Frequency\",\"Json\":\"{\\\"name\\\":\\\"Reporting Frequency\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":null,\\\"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\\\":\\\"720\\\",\\\"label\\\":\\\"12 hours\\\"},{\\\"value\\\":\\\"360\\\",\\\"label\\\":\\\"6 hours\\\"},{\\\"value\\\":\\\"60\\\",\\\"label\\\":\\\"1 hour\\\"},{\\\"label\\\":\\\"30 min\\\",\\\"value\\\":\\\"30\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1749057954},{"Type":1,"NewValue":"{\"Id\":12362,\"Group\":{\"Id\":7416,\"Name\":\"Heartrate Settings\",\"Json\":{\"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\":\"Reporting Frequency\",\"Json\":\"{\\\"name\\\":\\\"Reporting Frequency\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":null,\\\"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\\\":\\\"720\\\",\\\"label\\\":\\\"12 hours\\\"},{\\\"value\\\":\\\"360\\\",\\\"label\\\":\\\"6 hours\\\"},{\\\"value\\\":\\\"60\\\",\\\"label\\\":\\\"1 hour\\\"},{\\\"value\\\":\\\"30\\\",\\\"label\\\":\\\"30 min\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1764839130},{"Type":0,"NewValue":"{\"Id\":12362,\"Group\":{\"Id\":7416,\"Name\":\"Heartrate Settings\",\"Json\":{\"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\":\"Reporting Frequency\",\"Json\":\"{\\\"name\\\":\\\"Reporting Frequency\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":null,\\\"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\\\":\\\"720\\\",\\\"label\\\":\\\"12 hours\\\"},{\\\"value\\\":\\\"360\\\",\\\"label\\\":\\\"6 hours\\\"},{\\\"value\\\":\\\"60\\\",\\\"label\\\":\\\"1 hour\\\"},{\\\"value\\\":\\\"30\\\",\\\"label\\\":\\\"30 min\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"]}\",\"Default\":\"\",\"Command\":{\"Id\":5806,\"Protocol\":{\"Id\":297,\"Code\":\"Access TEC Care Watch\",\"Version\":\"1.6\",\"FirmwareVersion\":\"V06.8601.2501\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"setWatchSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"// Watch Settings\\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 Watch Settings' Only enable y disable:\\r\\n// params.StepCounting.EnableDisableStepCounting == 'true'\\r\\n// params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true'\\r\\n//var params = {StepCounting:{'EnableDisableStepCounting':'true'},HeartRateMonitor:{'EnableDisableHeartRateMonitor':'true'}, DeviceVersion:{'DeviceVersion':2}}\\r\\n// Test enabled both\\r\\n// AB 10 13 00 99 6A 0A 00 02 11 36 00 08 1B 00 00 0E 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step on HRT off\\r\\n// AB 10 13 00 DD 0C 0B 00 02 11 36 00 08 0B 00 00 0C 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step off HRT on\\r\\n// AB 10 13 00 B5 D0 09 00 02 11 36 00 08 13 00 00 0A 00 00 00 14 00 00 00 03 0A 01\\r\\n// test both off \\r\\n// AB 10 13 00 F1 B6 0C 00 02 11 36 00 08 03 00 00 08 00 00 00 14 00 00 00 03 0A 01 \\r\\n// comando para Contact on ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 4C 2E 03 00 02 11 36 00 08 1B 00 00 4E 00 00 00 14 00 00 00 03 0A 01\\r\\n// comando para contact off ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 C2 8C 04 00 02 11 36 00 08 1B 00 00 46 00 00 00 14 00 00 00 03 0A 01\\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\n// To store the quantity of contacts in the whitelist to enable disable the contact menu\\r\\n//var contactos = params.ApprovedContacts && params.ApprovedContacts.Contact;\\r\\nvar numDuplas = Array.isArray(params.ApprovedContacts) ? params.ApprovedContacts.length : 0;\\r\\n// configuration command (0X02) , lenght and key\\r\\nvar messageBody = '021136';\\r\\n// step count/heart value display\\r\\n// Watch setting related FACE ID\\r\\nmessageBody += '00'; // Default FACE ID 0 \\r\\n// Future\\r\\n//if (params.WatchFace.SetWatchFace) {\\r\\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \\r\\n//} else {\\r\\n// messageBody += '00'; // Analog Face Default FACE ID 0 \\r\\n//}\\r\\n// Watch Display setting related to Step and heart rate settings\\r\\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '081B0000'; //both displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += (numDuplas > 0) ? 'E' : '6';\\r\\n //messageBody += '6'; //menu 1 and 2 \\r\\n //messageBody += 'E'; //menu 1 and 2 and contact (menu 3) \\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '080B0000'; // step display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '4'; //menu 2 \\r\\n //messageBody += 'C'; // menu 2 and contact (menu 3) \\r\\n messageBody += (numDuplas > 0) ? 'C' : '4';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '08130000'; // heart display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '2'; //menu 1 no contact (menu 3) \\r\\n //messageBody += 'A'; //menu 1 and contact (menu 3) \\r\\n messageBody += (numDuplas > 0) ? 'A' : '2';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '08030000'; // no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '0000000'; // no menu , //08 only contact\\r\\n //messageBody += '8'; // //08 only contact\\r\\n messageBody += (numDuplas > 0) ? '8' : '0';\\r\\n messageBody += '000000'; // other settings\\r\\n} else {\\r\\n messageBody += '08030000'; //no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '0000000'; // no menu..\\r\\n}\\r\\n//menu items for the future\\r\\n/*if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '06000000'; //menu 1 and 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '04000000'; //menu 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '02000000'; //menu 1\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '00000000'; // no menu\\r\\n} else {\\r\\n messageBody += '00000000'; // no menu\\r\\n}*/\\r\\n// from autohome page to the end\\r\\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\\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\\n//AddValueSMS('dataSMS', dataSMS);\\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// functions\\r\\nfunction AddValue(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n var arr1 = [];\\r\\n for (var n = 0, l = str.length; n < l; n++) {\\r\\n var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n arr1.push(hex);\\r\\n }\\r\\n return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n var crc = 0x0000;\\r\\n var j, i;\\r\\n for (i = 0; i < s.length; i++) {\\r\\n c = s[i];\\r\\n if (c > 255) {\\r\\n throw new RangeError();\\r\\n }\\r\\n j = (c ^ (crc >> 8)) & 0xFF;\\r\\n crc = crcTable[j] ^ (crc << 8);\\r\\n }\\r\\n return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n var splitStr = []\\r\\n var j = 0\\r\\n for (let i = 0; i < str.length; i += 2) {\\r\\n splitStr[j] = str.substring(i, i + 2)\\r\\n j++\\r\\n }\\r\\n var bytes = []\\r\\n var bytePos = 0\\r\\n for (let i = 0; i < splitStr.length; i++) {\\r\\n var byteStr = splitStr[i]\\r\\n var b = parseInt(byteStr, 16)\\r\\n if (b < 256) {\\r\\n bytes[bytePos] = b\\r\\n bytePos++\\r\\n }\\r\\n }\\r\\n return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n hexString = str.toString(16);\\r\\n return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n let bin = 0;\\r\\n let rem, i = 1,\\r\\n step = 1;\\r\\n while (x != 0) {\\r\\n rem = x % 2;\\r\\n x = parseInt(x / 2);\\r\\n bin = bin + rem * i;\\r\\n i = i * 10;\\r\\n }\\r\\n return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n var hexa = parseInt(x, 2).toString(16);\\r\\n return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n const result = [];\\r\\n let len = string.length - 2;\\r\\n while (len >= 0) {\\r\\n result.push(string.substr(len, 2));\\r\\n len -= 2;\\r\\n }\\r\\n return result.join('');\\r\\n}\",\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":true,\"SendAttempts\":4,\"Order\":null},\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1764839134},{"Type":1,"NewValue":"{\"Id\":12362,\"Group\":{\"Id\":7416,\"Name\":\"Heartrate Settings\",\"Json\":{\"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\":\"Reporting Frequency\",\"Json\":\"{\\\"name\\\":\\\"Reporting Frequency\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":null,\\\"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\\\":\\\"720\\\",\\\"label\\\":\\\"12 hours\\\"},{\\\"value\\\":\\\"360\\\",\\\"label\\\":\\\"6 hours\\\"},{\\\"value\\\":\\\"60\\\",\\\"label\\\":\\\"1 hour\\\"},{\\\"value\\\":\\\"30\\\",\\\"label\\\":\\\"30 min\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1765220655},{"Type":0,"NewValue":"{\"Id\":12362,\"Group\":{\"Id\":7416,\"Name\":\"Heartrate Settings\",\"Json\":{\"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\":\"Reporting Frequency\",\"Json\":\"{\\\"name\\\":\\\"Reporting Frequency\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":null,\\\"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\\\":\\\"720\\\",\\\"label\\\":\\\"12 hours\\\"},{\\\"value\\\":\\\"360\\\",\\\"label\\\":\\\"6 hours\\\"},{\\\"value\\\":\\\"60\\\",\\\"label\\\":\\\"1 hour\\\"},{\\\"value\\\":\\\"30\\\",\\\"label\\\":\\\"30 min\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"]}\",\"Default\":\"\",\"Command\":{\"Id\":5819,\"Protocol\":{\"Id\":297,\"Code\":\"Access TEC Care Watch\",\"Version\":\"1.6\",\"FirmwareVersion\":\"V06.8601.2501\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"setAuthorisedNumbersAndWatchSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"// Combinated version setAuthorisedNumber with Watch Settings for EV06\\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// AB 10 22 00 32 FA 00 00 02 11 36 00 00 00 00 00 00 00 00 00 14 00 00 00 00 0A 00 0E 34 80 09 31 32 33 34 35 36 37 38 39 00 00\\r\\n// [Length]:11 [Key]:36 [Value]:00 00 00 00 00 00 00 00 00 14 00 00 00 00 0A 00\\r\\n//{\\\"watch\\\":{\\\"status18\\\":0,\\\"status17\\\":0,\\\"status19\\\":0,\\\"status10\\\":0,\\\"flagValue\\\":0,\\\"status12\\\":0,\\\"faceId\\\":0,\\\"status11\\\":0,\\\"status14\\\":0,\\\"status13\\\":0,\\\"status16\\\":0,\\\"status15\\\":0,\\\"status0\\\":0,\\\"status1\\\":0,\\\"menu8\\\":0,\\\"menu7\\\":0,\\\"menu6\\\":0,\\\"menu5\\\":0,\\\"menu4\\\":0,\\\"menu3\\\":0,\\\"menu2\\\":0,\\\"menu1\\\":0,\\\"autoTime\\\":20,\\\"brightNess\\\":0,\\\"logoIndex\\\":0,\\\"status20\\\":0,\\\"status8\\\":0,\\\"status9\\\":0,\\\"status2\\\":0,\\\"status3\\\":0,\\\"brightTime\\\":10}}\\r\\n//[Length]:0E [Key]:34 [Value]:80 09 31 32 33 34 35 36 37 38 39 00 00\\r\\n//{\\\"numberNamePhoto\\\":{\\\"call\\\":0,\\\"noCard\\\":0,\\\"number\\\":\\\"123456789\\\",\\\"enable\\\":1,\\\"sms\\\":0,\\\"name\\\":\\\"\\\",\\\"headURL\\\":\\\"\\\",\\\"index\\\":0}}\\r\\n// para pruebas en local Contact':\\r\\n//AB 10 12 00 94 ED 00 00 02 10 34 E0 09 31 32 33 34 35 36 37 38 39 02 79 6F 00\\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 phoneNumber = '';\\r\\nvar numberLength = '00';\\r\\nvar numberHex = '';\\r\\nvar nameLength = '00';\\r\\nvar nameHex = '';\\r\\nvar value = '02';\\r\\nvar keyLength = '00';\\r\\nvar confTel = '';\\r\\nvar count = 1; // approved contact will be from A2 to A9 - index 1 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\\ncounter = 0; // to check how many contacts are in the lists\\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 += \\\"0534\\\" + 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 phoneNumber = params.ApprovedContacts[contact].Contact;\\r\\n if (phoneNumber.startsWith(\\\"+\\\")) {\\r\\n phoneNumber = \\\"00\\\" + phoneNumber.substring(1);\\r\\n }\\r\\n numberHex = ascii_to_hexa(phoneNumber).toUpperCase();\\r\\n numberLength = ('00' + decimalToHex(phoneNumber.length)).slice(-2).toUpperCase();\\r\\n nameHex = ascii_to_hexa(params.ApprovedContacts[contact].Name).toUpperCase();\\r\\n nameLength = ('00' + decimalToHex(params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n keyLength = ('00' + decimalToHex(5 + phoneNumber.length + params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n value += keyLength + \\\"34\\\" + confTel + numberLength + numberHex + nameLength + nameHex + '00'; //no photo\\r\\n //value += keyLength + \\\"30\\\" + confTel + numberHex; //no photo \\r\\n counter++;\\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 phoneNumber = params.ApprovedContacts[contact].Contact;\\r\\n if (phoneNumber.startsWith(\\\"+\\\")) {\\r\\n phoneNumber = \\\"00\\\" + phoneNumber.substring(1);\\r\\n }\\r\\n numberHex = ascii_to_hexa(phoneNumber).toUpperCase();\\r\\n numberLength = ('00' + decimalToHex(phoneNumber.length)).slice(-2).toUpperCase();\\r\\n nameHex = ascii_to_hexa(params.ApprovedContacts[contact].Name).toUpperCase();\\r\\n nameLength = ('00' + decimalToHex(params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n keyLength = ('00' + decimalToHex(5 + phoneNumber.length + params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n value += keyLength + \\\"34\\\" + confTel + numberLength + numberHex + nameLength + nameHex + '00'; //no photo\\r\\n //value += keyLength + \\\"30\\\" + confTel + numberHex; //no photo \\r\\n counter++;\\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 += \\\"0534\\\" + confTel + '000000'; //no number, no name, no photo\\r\\n}\\r\\n// watch settings section\\r\\n// lenght and key\\r\\nvar messageBody = '1136';\\r\\n// step count/heart value display\\r\\n// Watch setting related FACE ID\\r\\nmessageBody += '00'; // Default FACE ID 0 \\r\\n// Future\\r\\n//if (params.WatchFace.SetWatchFace) {\\r\\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \\r\\n//} else {\\r\\n// messageBody += '00'; // Analog Face Default FACE ID 0 \\r\\n//}\\r\\n// Watch Display setting related to Step and heart rate settings\\r\\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '081B0000'; //both displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += (counter > 0) ? 'E' : '6';\\r\\n //messageBody += '6'; //menu 1 and 2 \\r\\n //messageBody += 'E'; //menu 1 and 2 and contact (menu 3) \\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '080B0000'; // step display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '4'; //menu 2 \\r\\n //messageBody += 'C'; // menu 2 and contact (menu 3) \\r\\n messageBody += (counter > 0) ? 'C' : '4';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '08130000'; // heart display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '2'; //menu 1 no contact (menu 3) \\r\\n //messageBody += 'A'; //menu 1 and contact (menu 3) \\r\\n messageBody += (counter > 0) ? 'A' : '2';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '08030000'; // no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '0000000'; // no menu , //08 only contact\\r\\n //messageBody += '8'; // //08 only contact\\r\\n messageBody += (counter > 0) ? '8' : '0';\\r\\n messageBody += '000000'; // other settings\\r\\n} else {\\r\\n messageBody += '08030000'; //no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '0000000'; // no menu..\\r\\n}\\r\\n// from autohome page to the end\\r\\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\\r\\nvalue += messageBody; //add watchsetting hex to contact hex in value var \\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}\",\"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":1765220658},{"Type":2,"NewValue":"{\"Id\":12362,\"Group\":{\"Id\":7416,\"Name\":\"Heartrate Settings\",\"Json\":{\"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\":\"Reporting Frequency\",\"Json\":\"{\\\"name\\\":\\\"Reporting Frequency\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":null,\\\"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\\\":\\\"720\\\",\\\"label\\\":\\\"12 hours\\\"},{\\\"value\\\":\\\"360\\\",\\\"label\\\":\\\"6 hours\\\"},{\\\"value\\\":\\\"60\\\",\\\"label\\\":\\\"1 hour\\\"},{\\\"value\\\":\\\"30\\\",\\\"label\\\":\\\"30 min\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"]}\",\"Default\":\"\",\"Command\":{\"Id\":5806,\"Protocol\":{\"Id\":297,\"Code\":\"Access TEC Care Watch\",\"Version\":\"1.6\",\"FirmwareVersion\":\"V06.8601.2501\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"setWatchSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"// Watch Settings\\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 Watch Settings' Only enable y disable:\\r\\n// params.StepCounting.EnableDisableStepCounting == 'true'\\r\\n// params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true'\\r\\n//var params = {StepCounting:{'EnableDisableStepCounting':'true'},HeartRateMonitor:{'EnableDisableHeartRateMonitor':'true'}, DeviceVersion:{'DeviceVersion':2}}\\r\\n// Test enabled both\\r\\n// AB 10 13 00 99 6A 0A 00 02 11 36 00 08 1B 00 00 0E 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step on HRT off\\r\\n// AB 10 13 00 DD 0C 0B 00 02 11 36 00 08 0B 00 00 0C 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step off HRT on\\r\\n// AB 10 13 00 B5 D0 09 00 02 11 36 00 08 13 00 00 0A 00 00 00 14 00 00 00 03 0A 01\\r\\n// test both off \\r\\n// AB 10 13 00 F1 B6 0C 00 02 11 36 00 08 03 00 00 08 00 00 00 14 00 00 00 03 0A 01 \\r\\n// comando para Contact on ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 4C 2E 03 00 02 11 36 00 08 1B 00 00 4E 00 00 00 14 00 00 00 03 0A 01\\r\\n// comando para contact off ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 C2 8C 04 00 02 11 36 00 08 1B 00 00 46 00 00 00 14 00 00 00 03 0A 01\\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\n// To store the quantity of contacts in the whitelist to enable disable the contact menu\\r\\n//var contactos = params.ApprovedContacts && params.ApprovedContacts.Contact;\\r\\n//var numDuplas = Array.isArray(params.ApprovedContacts) ? params.ApprovedContacts.length : 0;\\r\\n//var numDuplas = params.ApprovedContacts;\\r\\nlet numDuplas = 2;\\r\\n//for (const key in params.ApprovedContacts) {\\r\\n// if (params.ApprovedContacts[key] && params.ApprovedContacts[key].Contact && params.ApprovedContacts[key].Contact !== \\\"\\\") {\\r\\n// numDuplas++;\\r\\n// }\\r\\n//}\\r\\n//for (const key in params.ApprovedContacts) {\\r\\n// if (params.ApprovedContacts[key] && params.ApprovedContacts[key].Contact && params.ApprovedContacts[key].Contact !== \\\"\\\") {\\r\\n// numDuplas++;\\r\\n// }\\r\\n//}\\r\\n// configuration command (0X02) , lenght and key\\r\\nvar messageBody = '021136';\\r\\n// step count/heart value display\\r\\n// Watch setting related FACE ID\\r\\nmessageBody += '00'; // Default FACE ID 0 \\r\\n// Future\\r\\n//if (params.WatchFace.SetWatchFace) {\\r\\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \\r\\n//} else {\\r\\n// messageBody += '00'; // Analog Face Default FACE ID 0 \\r\\n//}\\r\\n// Watch Display setting related to Step and heart rate settings\\r\\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '081B0000'; //both displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += (numDuplas > 0) ? 'E' : '6';\\r\\n //messageBody += '6'; //menu 1 and 2 \\r\\n //messageBody += 'E'; //menu 1 and 2 and contact (menu 3) \\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '080B0000'; // step display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '4'; //menu 2 \\r\\n //messageBody += 'C'; // menu 2 and contact (menu 3) \\r\\n messageBody += (numDuplas > 0) ? 'C' : '4';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '08130000'; // heart display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '2'; //menu 1 no contact (menu 3) \\r\\n //messageBody += 'A'; //menu 1 and contact (menu 3) \\r\\n messageBody += (numDuplas > 0) ? 'A' : '2';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '08030000'; // no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '0000000'; // no menu , //08 only contact\\r\\n //messageBody += '8'; // //08 only contact\\r\\n messageBody += (numDuplas > 0) ? '8' : '0';\\r\\n messageBody += '000000'; // other settings\\r\\n} else {\\r\\n messageBody += '08030000'; //no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '0000000'; // no menu..\\r\\n}\\r\\n//menu items for the future\\r\\n/*if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '06000000'; //menu 1 and 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '04000000'; //menu 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '02000000'; //menu 1\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '00000000'; // no menu\\r\\n} else {\\r\\n messageBody += '00000000'; // no menu\\r\\n}*/\\r\\n// from autohome page to the end\\r\\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\\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\\n//AddValueSMS('dataSMS', dataSMS);\\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// functions\\r\\nfunction AddValue(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n var arr1 = [];\\r\\n for (var n = 0, l = str.length; n < l; n++) {\\r\\n var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n arr1.push(hex);\\r\\n }\\r\\n return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n var crc = 0x0000;\\r\\n var j, i;\\r\\n for (i = 0; i < s.length; i++) {\\r\\n c = s[i];\\r\\n if (c > 255) {\\r\\n throw new RangeError();\\r\\n }\\r\\n j = (c ^ (crc >> 8)) & 0xFF;\\r\\n crc = crcTable[j] ^ (crc << 8);\\r\\n }\\r\\n return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n var splitStr = []\\r\\n var j = 0\\r\\n for (let i = 0; i < str.length; i += 2) {\\r\\n splitStr[j] = str.substring(i, i + 2)\\r\\n j++\\r\\n }\\r\\n var bytes = []\\r\\n var bytePos = 0\\r\\n for (let i = 0; i < splitStr.length; i++) {\\r\\n var byteStr = splitStr[i]\\r\\n var b = parseInt(byteStr, 16)\\r\\n if (b < 256) {\\r\\n bytes[bytePos] = b\\r\\n bytePos++\\r\\n }\\r\\n }\\r\\n return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n hexString = str.toString(16);\\r\\n return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n let bin = 0;\\r\\n let rem, i = 1,\\r\\n step = 1;\\r\\n while (x != 0) {\\r\\n rem = x % 2;\\r\\n x = parseInt(x / 2);\\r\\n bin = bin + rem * i;\\r\\n i = i * 10;\\r\\n }\\r\\n return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n var hexa = parseInt(x, 2).toString(16);\\r\\n return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n const result = [];\\r\\n let len = string.length - 2;\\r\\n while (len >= 0) {\\r\\n result.push(string.substr(len, 2));\\r\\n len -= 2;\\r\\n }\\r\\n return result.join('');\\r\\n}\",\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":true,\"SendAttempts\":4,\"Order\":null},\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1765220661}],"LanguageId":null,"Tags":[]},{"Id":12361,"Group":{"Id":7416,"Name":"Heartrate Settings","Json":{"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":"Enable Disable Heartrate Settings","Json":"{\"name\":\"Enable Disable Heartrate Settings\",\"default\":\"false\",\"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":{"Id":5726,"Protocol":{"Id":297,"Code":"Access TEC Care Watch","Version":"0.2","FirmwareVersion":"","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":true},"Name":"setHeartRateDetectingInterval","TemplateSMS":null,"Template":"<>","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.HeartrateSettings.ReportingFrequency) {\n var heartBeat = parseInt(params.HeartrateSettings.ReportingFrequency);\n heartBeat = decimalToHex(heartBeat);\n heartBeat = ('000000' + heartBeat).slice(-6).toUpperCase();\n if (params.HeartrateSettings.EnableDisableHeartrateSettings == '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 = '58020000'\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}","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":12362,"Group":{"Id":7416,"Name":"Heartrate Settings","Json":{"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":"Reporting Frequency","Json":"{\"name\":\"Reporting Frequency\",\"default\":\"\",\"description\":null,\"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\":[{\"label\":\"12 hours\",\"value\":\"720\"},{\"label\":\"6 hours\",\"value\":\"360\"},{\"label\":\"1 hours\",\"value\":\"60\"},{\"label\":\"30 min\",\"value\":\"30\"}],\"toTranslate\":[\"name\",\"description\",\"helpText\",\"label\"]}","Default":"","Command":{"Id":5726,"Protocol":{"Id":297,"Code":"Access TEC Care Watch","Version":"0.2","FirmwareVersion":"","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":true},"Name":"setHeartRateDetectingInterval","TemplateSMS":null,"Template":"<>","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.HeartrateSettings.ReportingFrequency) {\n var heartBeat = parseInt(params.HeartrateSettings.ReportingFrequency);\n heartBeat = decimalToHex(heartBeat);\n heartBeat = ('000000' + heartBeat).slice(-6).toUpperCase();\n if (params.HeartrateSettings.EnableDisableHeartrateSettings == '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 = '58020000'\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}","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":12359,"Group":{"Id":7415,"Name":"Steps Settings","Json":{"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":"Enable Disable Steps Settings","Json":"{\"name\":\"Enable Disable Steps Settings\",\"default\":\"false\",\"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":{"Id":5739,"Protocol":{"Id":297,"Code":"Access TEC Care Watch","Version":"0.2","FirmwareVersion":"","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":true},"Name":"setStepCollectSettings","TemplateSMS":null,"Template":"<>","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.StepsSettings.ReportingFrequency) {\n var heartBeat = parseInt(params.StepsSettings.ReportingFrequency);\n heartBeat = decimalToHex(heartBeat);\n heartBeat = ('000000' + heartBeat).slice(-6).toUpperCase();\n if (params.StepsSettings.EnableDisableStepsSettings == '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 = '58020000';\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}","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":12360,"Group":{"Id":7415,"Name":"Steps Settings","Json":{"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":"Reporting Frequency","Json":"{\"name\":\"Reporting Frequency\",\"default\":\"\",\"description\":null,\"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\":\"720\",\"label\":\"12 hours\"},{\"value\":\"360\",\"label\":\"6 hours\"},{\"value\":\"60\",\"label\":\"1 hour\"},{\"value\":\"30\",\"label\":\"30 min\"}],\"toTranslate\":[\"name\",\"description\",\"helpText\",\"label\"]}","Default":"","Command":{"Id":5739,"Protocol":{"Id":297,"Code":"Access TEC Care Watch","Version":"0.2","FirmwareVersion":"","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":true},"Name":"setStepCollectSettings","TemplateSMS":null,"Template":"<>","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.StepsSettings.ReportingFrequency) {\n var heartBeat = parseInt(params.StepsSettings.ReportingFrequency);\n heartBeat = decimalToHex(heartBeat);\n heartBeat = ('000000' + heartBeat).slice(-6).toUpperCase();\n if (params.StepsSettings.EnableDisableStepsSettings == '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 = '58020000';\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}","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":12359,"Group":{"Id":7415,"Name":"Steps Settings","Json":{"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":"Enable Disable Steps Settings","Json":"{\"name\":\"Enable Disable Steps Settings\",\"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":{"Id":5807,"Protocol":{"Id":297,"Code":"Access TEC Care Watch","Version":"0.3","FirmwareVersion":"V06.8601.2501","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":true},"Name":"setEnableStep","TemplateSMS":null,"Template":"<>","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 true\nvalue += '1';\n// Voice true\nvalue += '1';\n// Vibration true\nvalue += '1';\n// Cell Tower True\nvalue += '1';\n// Wifi true\nvalue += '1';\n// SOS speaker true\nvalue += '1';\n// Side call Speaker true\nvalue += '1';\n// BLE stay connected true\nvalue += '1';\n// BLE locating true\nvalue += '1';\n// SOS Call Voice true\nvalue += '1';\n// BLE always on true\nvalue += '1';\n// GPS location true\nvalue += '1';\n// TCP fast true\nvalue += '1';\n// Rotate screen to iluminate true\nvalue += '1'; //watch only girar muñeca para iluminar pantalla\n// Beacon true\nvalue += '1';\n// activity fuction true\nvalue += '1'; // activity fuction, \n//step counting, \nif (params.StepsSettings.EnableDisableStepsSettings == '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';\n// stop call sequence true\nvalue += '1';\n// other no use\nvalue += '00000000';\n// auto update false\nvalue += '0';\n// AGPS true\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":12361,"Group":{"Id":7416,"Name":"Heartrate Settings","Json":{"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":"Enable Disable Heartrate Settings","Json":"{\"name\":\"Enable Disable Heartrate Settings\",\"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":{"Id":5806,"Protocol":{"Id":297,"Code":"Access TEC Care Watch","Version":"0.3","FirmwareVersion":"V06.8601.2501","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":true},"Name":"setWatchSettings","TemplateSMS":null,"Template":"<>","AckTemplate":null,"Operation":"// Watch Settings\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 Watch Settings' Only enable y disable:\r\n// params.StepCounting.EnableDisableStepCounting == 'true'\r\n// params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true'\r\n//var params = {StepCounting:{'EnableDisableStepCounting':'true'},HeartRateMonitor:{'EnableDisableHeartRateMonitor':'true'}, DeviceVersion:{'DeviceVersion':2}}\r\n// Test enabled both\r\n// AB 10 13 00 40 6F 00 00 02 11 36 00 08 1A 00 00 3E 00 00 00 14 00 00 00 00 00 00\r\n// test step on HRT off\r\n// 02 11 36 00 08 0A 00 00 3C 00 00 00 14 00 00 00 00 00 00\r\n// test step off HRT on\r\n// 02 11 36 00 08 12 00 00 3A 00 00 00 14 00 00 00 00 00 00\r\n// test both off \r\n// 02 11 36 00 08 02 00 00 38 00 00 00 14 00 00 00 00 00 00 \r\nvar msg = [];\r\nvar configs = [];\r\n// configuration command (0X02) , lenght and key\r\nvar messageBody = '021136';\r\n// step count/heart value display\r\n// Watch setting related FACE ID\r\nmessageBody += '00'; // Default FACE ID 0 \r\n// Future\r\n//if (params.WatchFace.SetWatchFace) {\r\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \r\n//} else {\r\n// messageBody += '00'; // Analog Face Default FACE ID 0 \r\n//}\r\n// Watch Display setting related to Step and heart rate settings\r\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true')) {\r\n messageBody += '081A0000'; //both displays\r\n messageBody += '06000000'; //menu 1 and 2\r\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'false')) {\r\n messageBody += '080A0000'; // step display\r\n messageBody += '04000000'; //menu 2\r\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true')) {\r\n messageBody += '08120000'; // heart display\r\n messageBody += '02000000'; //menu 1\r\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'false')) {\r\n messageBody += '08020000'; // no displays\r\n messageBody += '00000000'; // no menu\r\n} else {\r\n messageBody += '08020000'; //no displays\r\n messageBody += '00000000'; // no menu\r\n}\r\n//menu items for the future\r\n/*if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'true')) {\r\n messageBody += '06000000'; //menu 1 and 2\r\n} else if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'false')) {\r\n messageBody += '04000000'; //menu 2\r\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'true')) {\r\n messageBody += '02000000'; //menu 1\r\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'false')) {\r\n messageBody += '00000000'; // no menu\r\n} else {\r\n messageBody += '00000000'; // no menu\r\n}*/\r\n// from autohome page to the end\r\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\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":0,"CommandToUpdateId":null,"ParentId":null,"Parent":null,"HasAck":true,"HexString":true,"SendAttempts":4,"Order":null},"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":12359,"Group":{"Id":7415,"Name":"Steps Settings","Json":{"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":"Enable Disable Steps Settings","Json":"{\"name\":\"Enable Disable Steps Settings\",\"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":{"Id":5806,"Protocol":{"Id":297,"Code":"Access TEC Care Watch","Version":"0.3","FirmwareVersion":"V06.8601.2501","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":true},"Name":"setWatchSettings","TemplateSMS":null,"Template":"<>","AckTemplate":null,"Operation":"// Watch Settings\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 Watch Settings' Only enable y disable:\r\n// params.StepCounting.EnableDisableStepCounting == 'true'\r\n// params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true'\r\n//var params = {StepCounting:{'EnableDisableStepCounting':'true'},HeartRateMonitor:{'EnableDisableHeartRateMonitor':'true'}, DeviceVersion:{'DeviceVersion':2}}\r\n// Test enabled both\r\n// AB 10 13 00 40 6F 00 00 02 11 36 00 08 1A 00 00 3E 00 00 00 14 00 00 00 00 00 00\r\n// test step on HRT off\r\n// 02 11 36 00 08 0A 00 00 3C 00 00 00 14 00 00 00 00 00 00\r\n// test step off HRT on\r\n// 02 11 36 00 08 12 00 00 3A 00 00 00 14 00 00 00 00 00 00\r\n// test both off \r\n// 02 11 36 00 08 02 00 00 38 00 00 00 14 00 00 00 00 00 00 \r\nvar msg = [];\r\nvar configs = [];\r\n// configuration command (0X02) , lenght and key\r\nvar messageBody = '021136';\r\n// step count/heart value display\r\n// Watch setting related FACE ID\r\nmessageBody += '00'; // Default FACE ID 0 \r\n// Future\r\n//if (params.WatchFace.SetWatchFace) {\r\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \r\n//} else {\r\n// messageBody += '00'; // Analog Face Default FACE ID 0 \r\n//}\r\n// Watch Display setting related to Step and heart rate settings\r\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true')) {\r\n messageBody += '081A0000'; //both displays\r\n messageBody += '06000000'; //menu 1 and 2\r\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'false')) {\r\n messageBody += '080A0000'; // step display\r\n messageBody += '04000000'; //menu 2\r\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true')) {\r\n messageBody += '08120000'; // heart display\r\n messageBody += '02000000'; //menu 1\r\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'false')) {\r\n messageBody += '08020000'; // no displays\r\n messageBody += '00000000'; // no menu\r\n} else {\r\n messageBody += '08020000'; //no displays\r\n messageBody += '00000000'; // no menu\r\n}\r\n//menu items for the future\r\n/*if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'true')) {\r\n messageBody += '06000000'; //menu 1 and 2\r\n} else if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'false')) {\r\n messageBody += '04000000'; //menu 2\r\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'true')) {\r\n messageBody += '02000000'; //menu 1\r\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'false')) {\r\n messageBody += '00000000'; // no menu\r\n} else {\r\n messageBody += '00000000'; // no menu\r\n}*/\r\n// from autohome page to the end\r\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\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":0,"CommandToUpdateId":null,"ParentId":null,"Parent":null,"HasAck":true,"HexString":true,"SendAttempts":4,"Order":null},"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":12387,"Group":{"Id":7454,"Name":"SPO2 Settings","Json":{"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":"Enable Disable SPO2 Settings","Json":"{\"name\":\"Enable Disable SPO2 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":[{"Type":0,"NewValue":"{\"Id\":12387,\"Group\":{\"Id\":7454,\"Name\":\"SPO2 Settings\",\"Json\":{\"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\":\"Enable Disable SPO2 Settings\",\"Json\":\"{\\\"name\\\":\\\"Enable Disable SPO2 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\":[]}","Timestamp":1762892924},{"Type":0,"NewValue":"{\"Id\":12387,\"Group\":{\"Id\":7454,\"Name\":\"SPO2 Settings\",\"Json\":{\"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\":\"Enable Disable SPO2 Settings\",\"Json\":\"{\\\"name\\\":\\\"Enable Disable SPO2 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\":{\"Id\":5818,\"Protocol\":{\"Id\":297,\"Code\":\"Access TEC Care Watch\",\"Version\":\"1.4\",\"FirmwareVersion\":\"V06.8601.2501\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"setSPOInterval\",\"TemplateSMS\":null,\"Template\":\"<>\",\"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.HeartrateSettings.ReportingFrequency) {\\n var heartBeat = parseInt(params.HeartrateSettings.ReportingFrequency) * 60; //in seconds\\n heartBeat = decimalToHex(heartBeat);\\n heartBeat = ('000000' + heartBeat).slice(-6).toUpperCase();\\n if (params.HeartrateSettings.EnableDisableHeartrateSettings == '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 = '58020000'\\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}\",\"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":1762892927},{"Type":0,"NewValue":"{\"Id\":12387,\"Group\":{\"Id\":7454,\"Name\":\"SPO2 Settings\",\"Json\":{\"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\":\"Enable Disable SPO2 Settings\",\"Json\":\"{\\\"name\\\":\\\"Enable Disable SPO2 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\":{\"Id\":5806,\"Protocol\":{\"Id\":297,\"Code\":\"Access TEC Care Watch\",\"Version\":\"1.4\",\"FirmwareVersion\":\"V06.8601.2501\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"setWatchSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"// Watch Settings\\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 Watch Settings' Only enable y disable:\\r\\n// params.StepCounting.EnableDisableStepCounting == 'true'\\r\\n// params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true'\\r\\n//var params = {StepCounting:{'EnableDisableStepCounting':'true'},HeartRateMonitor:{'EnableDisableHeartRateMonitor':'true'}, DeviceVersion:{'DeviceVersion':2}}\\r\\n// Test enabled both\\r\\n// AB 10 13 00 99 6A 0A 00 02 11 36 00 08 1B 00 00 0E 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step on HRT off\\r\\n// AB 10 13 00 DD 0C 0B 00 02 11 36 00 08 0B 00 00 0C 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step off HRT on\\r\\n// AB 10 13 00 B5 D0 09 00 02 11 36 00 08 13 00 00 0A 00 00 00 14 00 00 00 03 0A 01\\r\\n// test both off \\r\\n// AB 10 13 00 F1 B6 0C 00 02 11 36 00 08 03 00 00 08 00 00 00 14 00 00 00 03 0A 01 \\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\n// configuration command (0X02) , lenght and key\\r\\nvar messageBody = '021136';\\r\\n// step count/heart value display\\r\\n// Watch setting related FACE ID\\r\\nmessageBody += '00'; // Default FACE ID 0 \\r\\n// Future\\r\\n//if (params.WatchFace.SetWatchFace) {\\r\\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \\r\\n//} else {\\r\\n// messageBody += '00'; // Analog Face Default FACE ID 0 \\r\\n//}\\r\\n// Watch Display setting related to Step and heart rate settings\\r\\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '081B0000'; //both displays\\r\\n messageBody += '06000000'; //menu 1 and 2 no contact (menu 3) // 0E with contact menu\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '080B0000'; // step display\\r\\n messageBody += '04000000'; //menu 2 no contact (menu 3) //0C with contact menu\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '08130000'; // heart display\\r\\n messageBody += '02000000'; //menu 1 no contact (menu 3) // 0A with contact menu\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '08030000'; // no displays\\r\\n messageBody += '00000000'; // no menu , //08 only contact\\r\\n} else {\\r\\n messageBody += '08030000'; //no displays\\r\\n messageBody += '00000000'; // no menu.. only contact\\r\\n}\\r\\n//menu items for the future\\r\\n/*if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '06000000'; //menu 1 and 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '04000000'; //menu 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '02000000'; //menu 1\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '00000000'; // no menu\\r\\n} else {\\r\\n messageBody += '00000000'; // no menu\\r\\n}*/\\r\\n// from autohome page to the end\\r\\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\\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\\n//AddValueSMS('dataSMS', dataSMS);\\r\\nvar commandConfigs = {\\r\\n template: \\\"main\\\",\\r\\n configs: configs //,\\r\\n //configsSMS: configsSMS\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n// functions\\r\\nfunction AddValue(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n var arr1 = [];\\r\\n for (var n = 0, l = str.length; n < l; n++) {\\r\\n var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n arr1.push(hex);\\r\\n }\\r\\n return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n var crc = 0x0000;\\r\\n var j, i;\\r\\n for (i = 0; i < s.length; i++) {\\r\\n c = s[i];\\r\\n if (c > 255) {\\r\\n throw new RangeError();\\r\\n }\\r\\n j = (c ^ (crc >> 8)) & 0xFF;\\r\\n crc = crcTable[j] ^ (crc << 8);\\r\\n }\\r\\n return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n var splitStr = []\\r\\n var j = 0\\r\\n for (let i = 0; i < str.length; i += 2) {\\r\\n splitStr[j] = str.substring(i, i + 2)\\r\\n j++\\r\\n }\\r\\n var bytes = []\\r\\n var bytePos = 0\\r\\n for (let i = 0; i < splitStr.length; i++) {\\r\\n var byteStr = splitStr[i]\\r\\n var b = parseInt(byteStr, 16)\\r\\n if (b < 256) {\\r\\n bytes[bytePos] = b\\r\\n bytePos++\\r\\n }\\r\\n }\\r\\n return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n hexString = str.toString(16);\\r\\n return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n let bin = 0;\\r\\n let rem, i = 1,\\r\\n step = 1;\\r\\n while (x != 0) {\\r\\n rem = x % 2;\\r\\n x = parseInt(x / 2);\\r\\n bin = bin + rem * i;\\r\\n i = i * 10;\\r\\n }\\r\\n return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n var hexa = parseInt(x, 2).toString(16);\\r\\n return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n const result = [];\\r\\n let len = string.length - 2;\\r\\n while (len >= 0) {\\r\\n result.push(string.substr(len, 2));\\r\\n len -= 2;\\r\\n }\\r\\n return result.join('');\\r\\n}\",\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":true,\"SendAttempts\":4,\"Order\":null},\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1762892929},{"Type":1,"NewValue":"{\"Id\":12387,\"Group\":{\"Id\":7454,\"Name\":\"SPO2 Settings\",\"Json\":{\"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\":\"Enable Disable SPO2 Settings\",\"Json\":\"{\\\"name\\\":\\\"Enable Disable SPO2 Settings\\\",\\\"default\\\":\\\"false\\\",\\\"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\":[]}","Timestamp":1765220695},{"Type":0,"NewValue":"{\"Id\":12387,\"Group\":{\"Id\":7454,\"Name\":\"SPO2 Settings\",\"Json\":{\"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\":\"Enable Disable SPO2 Settings\",\"Json\":\"{\\\"name\\\":\\\"Enable Disable SPO2 Settings\\\",\\\"default\\\":\\\"false\\\",\\\"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\":{\"Id\":5819,\"Protocol\":{\"Id\":297,\"Code\":\"Access TEC Care Watch\",\"Version\":\"1.6\",\"FirmwareVersion\":\"V06.8601.2501\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"setAuthorisedNumbersAndWatchSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"// Combinated version setAuthorisedNumber with Watch Settings for EV06\\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// AB 10 22 00 32 FA 00 00 02 11 36 00 00 00 00 00 00 00 00 00 14 00 00 00 00 0A 00 0E 34 80 09 31 32 33 34 35 36 37 38 39 00 00\\r\\n// [Length]:11 [Key]:36 [Value]:00 00 00 00 00 00 00 00 00 14 00 00 00 00 0A 00\\r\\n//{\\\"watch\\\":{\\\"status18\\\":0,\\\"status17\\\":0,\\\"status19\\\":0,\\\"status10\\\":0,\\\"flagValue\\\":0,\\\"status12\\\":0,\\\"faceId\\\":0,\\\"status11\\\":0,\\\"status14\\\":0,\\\"status13\\\":0,\\\"status16\\\":0,\\\"status15\\\":0,\\\"status0\\\":0,\\\"status1\\\":0,\\\"menu8\\\":0,\\\"menu7\\\":0,\\\"menu6\\\":0,\\\"menu5\\\":0,\\\"menu4\\\":0,\\\"menu3\\\":0,\\\"menu2\\\":0,\\\"menu1\\\":0,\\\"autoTime\\\":20,\\\"brightNess\\\":0,\\\"logoIndex\\\":0,\\\"status20\\\":0,\\\"status8\\\":0,\\\"status9\\\":0,\\\"status2\\\":0,\\\"status3\\\":0,\\\"brightTime\\\":10}}\\r\\n//[Length]:0E [Key]:34 [Value]:80 09 31 32 33 34 35 36 37 38 39 00 00\\r\\n//{\\\"numberNamePhoto\\\":{\\\"call\\\":0,\\\"noCard\\\":0,\\\"number\\\":\\\"123456789\\\",\\\"enable\\\":1,\\\"sms\\\":0,\\\"name\\\":\\\"\\\",\\\"headURL\\\":\\\"\\\",\\\"index\\\":0}}\\r\\n// para pruebas en local Contact':\\r\\n//AB 10 12 00 94 ED 00 00 02 10 34 E0 09 31 32 33 34 35 36 37 38 39 02 79 6F 00\\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 phoneNumber = '';\\r\\nvar numberLength = '00';\\r\\nvar numberHex = '';\\r\\nvar nameLength = '00';\\r\\nvar nameHex = '';\\r\\nvar value = '02';\\r\\nvar keyLength = '00';\\r\\nvar confTel = '';\\r\\nvar count = 1; // approved contact will be from A2 to A9 - index 1 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\\ncounter = 0; // to check how many contacts are in the lists\\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 += \\\"0534\\\" + 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 phoneNumber = params.ApprovedContacts[contact].Contact;\\r\\n if (phoneNumber.startsWith(\\\"+\\\")) {\\r\\n phoneNumber = \\\"00\\\" + phoneNumber.substring(1);\\r\\n }\\r\\n numberHex = ascii_to_hexa(phoneNumber).toUpperCase();\\r\\n numberLength = ('00' + decimalToHex(phoneNumber.length)).slice(-2).toUpperCase();\\r\\n nameHex = ascii_to_hexa(params.ApprovedContacts[contact].Name).toUpperCase();\\r\\n nameLength = ('00' + decimalToHex(params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n keyLength = ('00' + decimalToHex(5 + phoneNumber.length + params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n value += keyLength + \\\"34\\\" + confTel + numberLength + numberHex + nameLength + nameHex + '00'; //no photo\\r\\n //value += keyLength + \\\"30\\\" + confTel + numberHex; //no photo \\r\\n counter++;\\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 phoneNumber = params.ApprovedContacts[contact].Contact;\\r\\n if (phoneNumber.startsWith(\\\"+\\\")) {\\r\\n phoneNumber = \\\"00\\\" + phoneNumber.substring(1);\\r\\n }\\r\\n numberHex = ascii_to_hexa(phoneNumber).toUpperCase();\\r\\n numberLength = ('00' + decimalToHex(phoneNumber.length)).slice(-2).toUpperCase();\\r\\n nameHex = ascii_to_hexa(params.ApprovedContacts[contact].Name).toUpperCase();\\r\\n nameLength = ('00' + decimalToHex(params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n keyLength = ('00' + decimalToHex(5 + phoneNumber.length + params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n value += keyLength + \\\"34\\\" + confTel + numberLength + numberHex + nameLength + nameHex + '00'; //no photo\\r\\n //value += keyLength + \\\"30\\\" + confTel + numberHex; //no photo \\r\\n counter++;\\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 += \\\"0534\\\" + confTel + '000000'; //no number, no name, no photo\\r\\n}\\r\\n// watch settings section\\r\\n// lenght and key\\r\\nvar messageBody = '1136';\\r\\n// step count/heart value display\\r\\n// Watch setting related FACE ID\\r\\nmessageBody += '00'; // Default FACE ID 0 \\r\\n// Future\\r\\n//if (params.WatchFace.SetWatchFace) {\\r\\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \\r\\n//} else {\\r\\n// messageBody += '00'; // Analog Face Default FACE ID 0 \\r\\n//}\\r\\n// Watch Display setting related to Step and heart rate settings\\r\\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '081B0000'; //both displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += (counter > 0) ? 'E' : '6';\\r\\n //messageBody += '6'; //menu 1 and 2 \\r\\n //messageBody += 'E'; //menu 1 and 2 and contact (menu 3) \\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '080B0000'; // step display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '4'; //menu 2 \\r\\n //messageBody += 'C'; // menu 2 and contact (menu 3) \\r\\n messageBody += (counter > 0) ? 'C' : '4';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '08130000'; // heart display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '2'; //menu 1 no contact (menu 3) \\r\\n //messageBody += 'A'; //menu 1 and contact (menu 3) \\r\\n messageBody += (counter > 0) ? 'A' : '2';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '08030000'; // no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '0000000'; // no menu , //08 only contact\\r\\n //messageBody += '8'; // //08 only contact\\r\\n messageBody += (counter > 0) ? '8' : '0';\\r\\n messageBody += '000000'; // other settings\\r\\n} else {\\r\\n messageBody += '08030000'; //no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '0000000'; // no menu..\\r\\n}\\r\\n// from autohome page to the end\\r\\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\\r\\nvalue += messageBody; //add watchsetting hex to contact hex in value var \\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}\",\"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":1765220698},{"Type":2,"NewValue":"{\"Id\":12387,\"Group\":{\"Id\":7454,\"Name\":\"SPO2 Settings\",\"Json\":{\"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\":\"Enable Disable SPO2 Settings\",\"Json\":\"{\\\"name\\\":\\\"Enable Disable SPO2 Settings\\\",\\\"default\\\":\\\"false\\\",\\\"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\":{\"Id\":5806,\"Protocol\":{\"Id\":297,\"Code\":\"Access TEC Care Watch\",\"Version\":\"1.6\",\"FirmwareVersion\":\"V06.8601.2501\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"setWatchSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"// Watch Settings\\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 Watch Settings' Only enable y disable:\\r\\n// params.StepCounting.EnableDisableStepCounting == 'true'\\r\\n// params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true'\\r\\n//var params = {StepCounting:{'EnableDisableStepCounting':'true'},HeartRateMonitor:{'EnableDisableHeartRateMonitor':'true'}, DeviceVersion:{'DeviceVersion':2}}\\r\\n// Test enabled both\\r\\n// AB 10 13 00 99 6A 0A 00 02 11 36 00 08 1B 00 00 0E 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step on HRT off\\r\\n// AB 10 13 00 DD 0C 0B 00 02 11 36 00 08 0B 00 00 0C 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step off HRT on\\r\\n// AB 10 13 00 B5 D0 09 00 02 11 36 00 08 13 00 00 0A 00 00 00 14 00 00 00 03 0A 01\\r\\n// test both off \\r\\n// AB 10 13 00 F1 B6 0C 00 02 11 36 00 08 03 00 00 08 00 00 00 14 00 00 00 03 0A 01 \\r\\n// comando para Contact on ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 4C 2E 03 00 02 11 36 00 08 1B 00 00 4E 00 00 00 14 00 00 00 03 0A 01\\r\\n// comando para contact off ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 C2 8C 04 00 02 11 36 00 08 1B 00 00 46 00 00 00 14 00 00 00 03 0A 01\\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\n// To store the quantity of contacts in the whitelist to enable disable the contact menu\\r\\n//var contactos = params.ApprovedContacts && params.ApprovedContacts.Contact;\\r\\n//var numDuplas = Array.isArray(params.ApprovedContacts) ? params.ApprovedContacts.length : 0;\\r\\n//var numDuplas = params.ApprovedContacts;\\r\\nlet numDuplas = 2;\\r\\n//for (const key in params.ApprovedContacts) {\\r\\n// if (params.ApprovedContacts[key] && params.ApprovedContacts[key].Contact && params.ApprovedContacts[key].Contact !== \\\"\\\") {\\r\\n// numDuplas++;\\r\\n// }\\r\\n//}\\r\\n//for (const key in params.ApprovedContacts) {\\r\\n// if (params.ApprovedContacts[key] && params.ApprovedContacts[key].Contact && params.ApprovedContacts[key].Contact !== \\\"\\\") {\\r\\n// numDuplas++;\\r\\n// }\\r\\n//}\\r\\n// configuration command (0X02) , lenght and key\\r\\nvar messageBody = '021136';\\r\\n// step count/heart value display\\r\\n// Watch setting related FACE ID\\r\\nmessageBody += '00'; // Default FACE ID 0 \\r\\n// Future\\r\\n//if (params.WatchFace.SetWatchFace) {\\r\\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \\r\\n//} else {\\r\\n// messageBody += '00'; // Analog Face Default FACE ID 0 \\r\\n//}\\r\\n// Watch Display setting related to Step and heart rate settings\\r\\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '081B0000'; //both displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += (numDuplas > 0) ? 'E' : '6';\\r\\n //messageBody += '6'; //menu 1 and 2 \\r\\n //messageBody += 'E'; //menu 1 and 2 and contact (menu 3) \\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '080B0000'; // step display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '4'; //menu 2 \\r\\n //messageBody += 'C'; // menu 2 and contact (menu 3) \\r\\n messageBody += (numDuplas > 0) ? 'C' : '4';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '08130000'; // heart display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '2'; //menu 1 no contact (menu 3) \\r\\n //messageBody += 'A'; //menu 1 and contact (menu 3) \\r\\n messageBody += (numDuplas > 0) ? 'A' : '2';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '08030000'; // no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '0000000'; // no menu , //08 only contact\\r\\n //messageBody += '8'; // //08 only contact\\r\\n messageBody += (numDuplas > 0) ? '8' : '0';\\r\\n messageBody += '000000'; // other settings\\r\\n} else {\\r\\n messageBody += '08030000'; //no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '0000000'; // no menu..\\r\\n}\\r\\n//menu items for the future\\r\\n/*if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '06000000'; //menu 1 and 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '04000000'; //menu 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '02000000'; //menu 1\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '00000000'; // no menu\\r\\n} else {\\r\\n messageBody += '00000000'; // no menu\\r\\n}*/\\r\\n// from autohome page to the end\\r\\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\\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\\n//AddValueSMS('dataSMS', dataSMS);\\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// functions\\r\\nfunction AddValue(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n var arr1 = [];\\r\\n for (var n = 0, l = str.length; n < l; n++) {\\r\\n var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n arr1.push(hex);\\r\\n }\\r\\n return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n var crc = 0x0000;\\r\\n var j, i;\\r\\n for (i = 0; i < s.length; i++) {\\r\\n c = s[i];\\r\\n if (c > 255) {\\r\\n throw new RangeError();\\r\\n }\\r\\n j = (c ^ (crc >> 8)) & 0xFF;\\r\\n crc = crcTable[j] ^ (crc << 8);\\r\\n }\\r\\n return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n var splitStr = []\\r\\n var j = 0\\r\\n for (let i = 0; i < str.length; i += 2) {\\r\\n splitStr[j] = str.substring(i, i + 2)\\r\\n j++\\r\\n }\\r\\n var bytes = []\\r\\n var bytePos = 0\\r\\n for (let i = 0; i < splitStr.length; i++) {\\r\\n var byteStr = splitStr[i]\\r\\n var b = parseInt(byteStr, 16)\\r\\n if (b < 256) {\\r\\n bytes[bytePos] = b\\r\\n bytePos++\\r\\n }\\r\\n }\\r\\n return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n hexString = str.toString(16);\\r\\n return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n let bin = 0;\\r\\n let rem, i = 1,\\r\\n step = 1;\\r\\n while (x != 0) {\\r\\n rem = x % 2;\\r\\n x = parseInt(x / 2);\\r\\n bin = bin + rem * i;\\r\\n i = i * 10;\\r\\n }\\r\\n return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n var hexa = parseInt(x, 2).toString(16);\\r\\n return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n const result = [];\\r\\n let len = string.length - 2;\\r\\n while (len >= 0) {\\r\\n result.push(string.substr(len, 2));\\r\\n len -= 2;\\r\\n }\\r\\n return result.join('');\\r\\n}\",\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":true,\"SendAttempts\":4,\"Order\":null},\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1765220701}],"LanguageId":null,"Tags":[]},{"Id":12387,"Group":{"Id":7454,"Name":"SPO2 Settings","Json":{"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":"Enable Disable SPO2 Settings","Json":"{\"name\":\"Enable Disable SPO2 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":{"Id":5818,"Protocol":{"Id":297,"Code":"Access TEC Care Watch","Version":"1.4","FirmwareVersion":"V06.8601.2501","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":true},"Name":"setSPOInterval","TemplateSMS":null,"Template":"<>","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.HeartrateSettings.ReportingFrequency) {\n var heartBeat = parseInt(params.HeartrateSettings.ReportingFrequency) * 60; //in seconds\n heartBeat = decimalToHex(heartBeat);\n heartBeat = ('000000' + heartBeat).slice(-6).toUpperCase();\n if (params.HeartrateSettings.EnableDisableHeartrateSettings == '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 = '58020000'\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}","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":12387,"Group":{"Id":7454,"Name":"SPO2 Settings","Json":{"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":"Enable Disable SPO2 Settings","Json":"{\"name\":\"Enable Disable SPO2 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":{"Id":5806,"Protocol":{"Id":297,"Code":"Access TEC Care Watch","Version":"1.4","FirmwareVersion":"V06.8601.2501","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":true},"Name":"setWatchSettings","TemplateSMS":null,"Template":"<>","AckTemplate":null,"Operation":"// Watch Settings\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 Watch Settings' Only enable y disable:\r\n// params.StepCounting.EnableDisableStepCounting == 'true'\r\n// params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true'\r\n//var params = {StepCounting:{'EnableDisableStepCounting':'true'},HeartRateMonitor:{'EnableDisableHeartRateMonitor':'true'}, DeviceVersion:{'DeviceVersion':2}}\r\n// Test enabled both\r\n// AB 10 13 00 99 6A 0A 00 02 11 36 00 08 1B 00 00 0E 00 00 00 14 00 00 00 03 0A 01\r\n// test step on HRT off\r\n// AB 10 13 00 DD 0C 0B 00 02 11 36 00 08 0B 00 00 0C 00 00 00 14 00 00 00 03 0A 01\r\n// test step off HRT on\r\n// AB 10 13 00 B5 D0 09 00 02 11 36 00 08 13 00 00 0A 00 00 00 14 00 00 00 03 0A 01\r\n// test both off \r\n// AB 10 13 00 F1 B6 0C 00 02 11 36 00 08 03 00 00 08 00 00 00 14 00 00 00 03 0A 01 \r\nvar msg = [];\r\nvar configs = [];\r\n// configuration command (0X02) , lenght and key\r\nvar messageBody = '021136';\r\n// step count/heart value display\r\n// Watch setting related FACE ID\r\nmessageBody += '00'; // Default FACE ID 0 \r\n// Future\r\n//if (params.WatchFace.SetWatchFace) {\r\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \r\n//} else {\r\n// messageBody += '00'; // Analog Face Default FACE ID 0 \r\n//}\r\n// Watch Display setting related to Step and heart rate settings\r\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\r\n messageBody += '081B0000'; //both displays\r\n messageBody += '06000000'; //menu 1 and 2 no contact (menu 3) // 0E with contact menu\r\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\r\n messageBody += '080B0000'; // step display\r\n messageBody += '04000000'; //menu 2 no contact (menu 3) //0C with contact menu\r\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\r\n messageBody += '08130000'; // heart display\r\n messageBody += '02000000'; //menu 1 no contact (menu 3) // 0A with contact menu\r\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\r\n messageBody += '08030000'; // no displays\r\n messageBody += '00000000'; // no menu , //08 only contact\r\n} else {\r\n messageBody += '08030000'; //no displays\r\n messageBody += '00000000'; // no menu.. only contact\r\n}\r\n//menu items for the future\r\n/*if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'true')) {\r\n messageBody += '06000000'; //menu 1 and 2\r\n} else if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'false')) {\r\n messageBody += '04000000'; //menu 2\r\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'true')) {\r\n messageBody += '02000000'; //menu 1\r\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'false')) {\r\n messageBody += '00000000'; // no menu\r\n} else {\r\n messageBody += '00000000'; // no menu\r\n}*/\r\n// from autohome page to the end\r\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\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\n//AddValueSMS('dataSMS', dataSMS);\r\nvar commandConfigs = {\r\n template: \"main\",\r\n configs: configs //,\r\n //configsSMS: configsSMS\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n// functions\r\nfunction AddValue(p1, p2) {\r\n var cvpair = {\r\n code: p1,\r\n value: p2\r\n };\r\n configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n var cvpair = {\r\n code: p1,\r\n value: p2\r\n };\r\n configsSMS.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n var arr1 = [];\r\n for (var n = 0, l = str.length; n < l; n++) {\r\n var hex = Number(str.charCodeAt(n)).toString(16);\r\n arr1.push(hex);\r\n }\r\n return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n var crc = 0x0000;\r\n var j, i;\r\n for (i = 0; i < s.length; i++) {\r\n c = s[i];\r\n if (c > 255) {\r\n throw new RangeError();\r\n }\r\n j = (c ^ (crc >> 8)) & 0xFF;\r\n crc = crcTable[j] ^ (crc << 8);\r\n }\r\n return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n var splitStr = []\r\n var j = 0\r\n for (let i = 0; i < str.length; i += 2) {\r\n splitStr[j] = str.substring(i, i + 2)\r\n j++\r\n }\r\n var bytes = []\r\n var bytePos = 0\r\n for (let i = 0; i < splitStr.length; i++) {\r\n var byteStr = splitStr[i]\r\n var b = parseInt(byteStr, 16)\r\n if (b < 256) {\r\n bytes[bytePos] = b\r\n bytePos++\r\n }\r\n }\r\n return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n hexString = str.toString(16);\r\n return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n let bin = 0;\r\n let rem, i = 1,\r\n step = 1;\r\n while (x != 0) {\r\n rem = x % 2;\r\n x = parseInt(x / 2);\r\n bin = bin + rem * i;\r\n i = i * 10;\r\n }\r\n return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n var hexa = parseInt(x, 2).toString(16);\r\n return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n const result = [];\r\n let len = string.length - 2;\r\n while (len >= 0) {\r\n result.push(string.substr(len, 2));\r\n len -= 2;\r\n }\r\n return result.join('');\r\n}","AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"CommandToUpdateId":null,"ParentId":null,"Parent":null,"HasAck":true,"HexString":true,"SendAttempts":4,"Order":null},"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":12388,"Group":{"Id":7454,"Name":"SPO2 Settings","Json":{"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":"Reporting Frequency","Json":"{\"name\":\"Reporting Frequency\",\"default\":\"\",\"description\":null,\"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\":[{\"label\":\"12 hours\",\"value\":\"720\"},{\"label\":\"6 hours\",\"value\":\"360\"},{\"label\":\"1 hour\",\"value\":\"60\"},{\"label\":\"30 min\",\"value\":\"30\"}],\"toTranslate\":[\"name\",\"description\",\"helpText\",\"label\"]}","Default":"","Command":null,"ProtocolActionObjects":[{"Type":0,"NewValue":"{\"Id\":12388,\"Group\":{\"Id\":7454,\"Name\":\"SPO2 Settings\",\"Json\":{\"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\":\"Reporting Frequency\",\"Json\":\"{\\\"name\\\":\\\"Reporting Frequency\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":null,\\\"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\\\":[{\\\"label\\\":\\\"12 hours\\\",\\\"value\\\":\\\"720\\\"},{\\\"label\\\":\\\"6 hours\\\",\\\"value\\\":\\\"360\\\"},{\\\"label\\\":\\\"1 hour\\\",\\\"value\\\":\\\"60\\\"},{\\\"label\\\":\\\"30 min\\\",\\\"value\\\":\\\"30\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1762893055},{"Type":0,"NewValue":"{\"Id\":12388,\"Group\":{\"Id\":7454,\"Name\":\"SPO2 Settings\",\"Json\":{\"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\":\"Reporting Frequency\",\"Json\":\"{\\\"name\\\":\\\"Reporting Frequency\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":null,\\\"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\\\":[{\\\"label\\\":\\\"12 hours\\\",\\\"value\\\":\\\"720\\\"},{\\\"label\\\":\\\"6 hours\\\",\\\"value\\\":\\\"360\\\"},{\\\"label\\\":\\\"1 hour\\\",\\\"value\\\":\\\"60\\\"},{\\\"label\\\":\\\"30 min\\\",\\\"value\\\":\\\"30\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"]}\",\"Default\":\"\",\"Command\":{\"Id\":5818,\"Protocol\":{\"Id\":297,\"Code\":\"Access TEC Care Watch\",\"Version\":\"1.4\",\"FirmwareVersion\":\"V06.8601.2501\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"setSPOInterval\",\"TemplateSMS\":null,\"Template\":\"<>\",\"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.HeartrateSettings.ReportingFrequency) {\\n var heartBeat = parseInt(params.HeartrateSettings.ReportingFrequency) * 60; //in seconds\\n heartBeat = decimalToHex(heartBeat);\\n heartBeat = ('000000' + heartBeat).slice(-6).toUpperCase();\\n if (params.HeartrateSettings.EnableDisableHeartrateSettings == '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 = '58020000'\\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}\",\"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":1762893058},{"Type":1,"NewValue":"{\"Id\":12388,\"Group\":{\"Id\":7454,\"Name\":\"SPO2 Settings\",\"Json\":{\"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\":\"Reporting Frequency\",\"Json\":\"{\\\"name\\\":\\\"Reporting Frequency\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":null,\\\"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\\\":\\\"720\\\",\\\"label\\\":\\\"12 hours\\\"},{\\\"value\\\":\\\"360\\\",\\\"label\\\":\\\"6 hours\\\"},{\\\"value\\\":\\\"60\\\",\\\"label\\\":\\\"1 hour\\\"},{\\\"value\\\":\\\"30\\\",\\\"label\\\":\\\"30 min\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1764839109},{"Type":0,"NewValue":"{\"Id\":12388,\"Group\":{\"Id\":7454,\"Name\":\"SPO2 Settings\",\"Json\":{\"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\":\"Reporting Frequency\",\"Json\":\"{\\\"name\\\":\\\"Reporting Frequency\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":null,\\\"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\\\":\\\"720\\\",\\\"label\\\":\\\"12 hours\\\"},{\\\"value\\\":\\\"360\\\",\\\"label\\\":\\\"6 hours\\\"},{\\\"value\\\":\\\"60\\\",\\\"label\\\":\\\"1 hour\\\"},{\\\"value\\\":\\\"30\\\",\\\"label\\\":\\\"30 min\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"]}\",\"Default\":\"\",\"Command\":{\"Id\":5806,\"Protocol\":{\"Id\":297,\"Code\":\"Access TEC Care Watch\",\"Version\":\"1.6\",\"FirmwareVersion\":\"V06.8601.2501\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"setWatchSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"// Watch Settings\\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 Watch Settings' Only enable y disable:\\r\\n// params.StepCounting.EnableDisableStepCounting == 'true'\\r\\n// params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true'\\r\\n//var params = {StepCounting:{'EnableDisableStepCounting':'true'},HeartRateMonitor:{'EnableDisableHeartRateMonitor':'true'}, DeviceVersion:{'DeviceVersion':2}}\\r\\n// Test enabled both\\r\\n// AB 10 13 00 99 6A 0A 00 02 11 36 00 08 1B 00 00 0E 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step on HRT off\\r\\n// AB 10 13 00 DD 0C 0B 00 02 11 36 00 08 0B 00 00 0C 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step off HRT on\\r\\n// AB 10 13 00 B5 D0 09 00 02 11 36 00 08 13 00 00 0A 00 00 00 14 00 00 00 03 0A 01\\r\\n// test both off \\r\\n// AB 10 13 00 F1 B6 0C 00 02 11 36 00 08 03 00 00 08 00 00 00 14 00 00 00 03 0A 01 \\r\\n// comando para Contact on ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 4C 2E 03 00 02 11 36 00 08 1B 00 00 4E 00 00 00 14 00 00 00 03 0A 01\\r\\n// comando para contact off ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 C2 8C 04 00 02 11 36 00 08 1B 00 00 46 00 00 00 14 00 00 00 03 0A 01\\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\n// To store the quantity of contacts in the whitelist to enable disable the contact menu\\r\\n//var contactos = params.ApprovedContacts && params.ApprovedContacts.Contact;\\r\\nvar numDuplas = Array.isArray(params.ApprovedContacts) ? params.ApprovedContacts.length : 0;\\r\\n// configuration command (0X02) , lenght and key\\r\\nvar messageBody = '021136';\\r\\n// step count/heart value display\\r\\n// Watch setting related FACE ID\\r\\nmessageBody += '00'; // Default FACE ID 0 \\r\\n// Future\\r\\n//if (params.WatchFace.SetWatchFace) {\\r\\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \\r\\n//} else {\\r\\n// messageBody += '00'; // Analog Face Default FACE ID 0 \\r\\n//}\\r\\n// Watch Display setting related to Step and heart rate settings\\r\\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '081B0000'; //both displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += (numDuplas > 0) ? 'E' : '6';\\r\\n //messageBody += '6'; //menu 1 and 2 \\r\\n //messageBody += 'E'; //menu 1 and 2 and contact (menu 3) \\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '080B0000'; // step display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '4'; //menu 2 \\r\\n //messageBody += 'C'; // menu 2 and contact (menu 3) \\r\\n messageBody += (numDuplas > 0) ? 'C' : '4';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '08130000'; // heart display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '2'; //menu 1 no contact (menu 3) \\r\\n //messageBody += 'A'; //menu 1 and contact (menu 3) \\r\\n messageBody += (numDuplas > 0) ? 'A' : '2';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '08030000'; // no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '0000000'; // no menu , //08 only contact\\r\\n //messageBody += '8'; // //08 only contact\\r\\n messageBody += (numDuplas > 0) ? '8' : '0';\\r\\n messageBody += '000000'; // other settings\\r\\n} else {\\r\\n messageBody += '08030000'; //no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '0000000'; // no menu..\\r\\n}\\r\\n//menu items for the future\\r\\n/*if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '06000000'; //menu 1 and 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '04000000'; //menu 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '02000000'; //menu 1\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '00000000'; // no menu\\r\\n} else {\\r\\n messageBody += '00000000'; // no menu\\r\\n}*/\\r\\n// from autohome page to the end\\r\\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\\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\\n//AddValueSMS('dataSMS', dataSMS);\\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// functions\\r\\nfunction AddValue(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n var arr1 = [];\\r\\n for (var n = 0, l = str.length; n < l; n++) {\\r\\n var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n arr1.push(hex);\\r\\n }\\r\\n return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n var crc = 0x0000;\\r\\n var j, i;\\r\\n for (i = 0; i < s.length; i++) {\\r\\n c = s[i];\\r\\n if (c > 255) {\\r\\n throw new RangeError();\\r\\n }\\r\\n j = (c ^ (crc >> 8)) & 0xFF;\\r\\n crc = crcTable[j] ^ (crc << 8);\\r\\n }\\r\\n return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n var splitStr = []\\r\\n var j = 0\\r\\n for (let i = 0; i < str.length; i += 2) {\\r\\n splitStr[j] = str.substring(i, i + 2)\\r\\n j++\\r\\n }\\r\\n var bytes = []\\r\\n var bytePos = 0\\r\\n for (let i = 0; i < splitStr.length; i++) {\\r\\n var byteStr = splitStr[i]\\r\\n var b = parseInt(byteStr, 16)\\r\\n if (b < 256) {\\r\\n bytes[bytePos] = b\\r\\n bytePos++\\r\\n }\\r\\n }\\r\\n return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n hexString = str.toString(16);\\r\\n return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n let bin = 0;\\r\\n let rem, i = 1,\\r\\n step = 1;\\r\\n while (x != 0) {\\r\\n rem = x % 2;\\r\\n x = parseInt(x / 2);\\r\\n bin = bin + rem * i;\\r\\n i = i * 10;\\r\\n }\\r\\n return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n var hexa = parseInt(x, 2).toString(16);\\r\\n return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n const result = [];\\r\\n let len = string.length - 2;\\r\\n while (len >= 0) {\\r\\n result.push(string.substr(len, 2));\\r\\n len -= 2;\\r\\n }\\r\\n return result.join('');\\r\\n}\",\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":true,\"SendAttempts\":4,\"Order\":null},\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1764839113},{"Type":1,"NewValue":"{\"Id\":12388,\"Group\":{\"Id\":7454,\"Name\":\"SPO2 Settings\",\"Json\":{\"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\":\"Reporting Frequency\",\"Json\":\"{\\\"name\\\":\\\"Reporting Frequency\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":null,\\\"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\\\":\\\"720\\\",\\\"label\\\":\\\"12 hours\\\"},{\\\"value\\\":\\\"360\\\",\\\"label\\\":\\\"6 hours\\\"},{\\\"value\\\":\\\"60\\\",\\\"label\\\":\\\"1 hour\\\"},{\\\"value\\\":\\\"30\\\",\\\"label\\\":\\\"30 min\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1765220728},{"Type":0,"NewValue":"{\"Id\":12388,\"Group\":{\"Id\":7454,\"Name\":\"SPO2 Settings\",\"Json\":{\"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\":\"Reporting Frequency\",\"Json\":\"{\\\"name\\\":\\\"Reporting Frequency\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":null,\\\"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\\\":\\\"720\\\",\\\"label\\\":\\\"12 hours\\\"},{\\\"value\\\":\\\"360\\\",\\\"label\\\":\\\"6 hours\\\"},{\\\"value\\\":\\\"60\\\",\\\"label\\\":\\\"1 hour\\\"},{\\\"value\\\":\\\"30\\\",\\\"label\\\":\\\"30 min\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"]}\",\"Default\":\"\",\"Command\":{\"Id\":5819,\"Protocol\":{\"Id\":297,\"Code\":\"Access TEC Care Watch\",\"Version\":\"1.6\",\"FirmwareVersion\":\"V06.8601.2501\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"setAuthorisedNumbersAndWatchSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"// Combinated version setAuthorisedNumber with Watch Settings for EV06\\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// AB 10 22 00 32 FA 00 00 02 11 36 00 00 00 00 00 00 00 00 00 14 00 00 00 00 0A 00 0E 34 80 09 31 32 33 34 35 36 37 38 39 00 00\\r\\n// [Length]:11 [Key]:36 [Value]:00 00 00 00 00 00 00 00 00 14 00 00 00 00 0A 00\\r\\n//{\\\"watch\\\":{\\\"status18\\\":0,\\\"status17\\\":0,\\\"status19\\\":0,\\\"status10\\\":0,\\\"flagValue\\\":0,\\\"status12\\\":0,\\\"faceId\\\":0,\\\"status11\\\":0,\\\"status14\\\":0,\\\"status13\\\":0,\\\"status16\\\":0,\\\"status15\\\":0,\\\"status0\\\":0,\\\"status1\\\":0,\\\"menu8\\\":0,\\\"menu7\\\":0,\\\"menu6\\\":0,\\\"menu5\\\":0,\\\"menu4\\\":0,\\\"menu3\\\":0,\\\"menu2\\\":0,\\\"menu1\\\":0,\\\"autoTime\\\":20,\\\"brightNess\\\":0,\\\"logoIndex\\\":0,\\\"status20\\\":0,\\\"status8\\\":0,\\\"status9\\\":0,\\\"status2\\\":0,\\\"status3\\\":0,\\\"brightTime\\\":10}}\\r\\n//[Length]:0E [Key]:34 [Value]:80 09 31 32 33 34 35 36 37 38 39 00 00\\r\\n//{\\\"numberNamePhoto\\\":{\\\"call\\\":0,\\\"noCard\\\":0,\\\"number\\\":\\\"123456789\\\",\\\"enable\\\":1,\\\"sms\\\":0,\\\"name\\\":\\\"\\\",\\\"headURL\\\":\\\"\\\",\\\"index\\\":0}}\\r\\n// para pruebas en local Contact':\\r\\n//AB 10 12 00 94 ED 00 00 02 10 34 E0 09 31 32 33 34 35 36 37 38 39 02 79 6F 00\\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 phoneNumber = '';\\r\\nvar numberLength = '00';\\r\\nvar numberHex = '';\\r\\nvar nameLength = '00';\\r\\nvar nameHex = '';\\r\\nvar value = '02';\\r\\nvar keyLength = '00';\\r\\nvar confTel = '';\\r\\nvar count = 1; // approved contact will be from A2 to A9 - index 1 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\\ncounter = 0; // to check how many contacts are in the lists\\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 += \\\"0534\\\" + 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 phoneNumber = params.ApprovedContacts[contact].Contact;\\r\\n if (phoneNumber.startsWith(\\\"+\\\")) {\\r\\n phoneNumber = \\\"00\\\" + phoneNumber.substring(1);\\r\\n }\\r\\n numberHex = ascii_to_hexa(phoneNumber).toUpperCase();\\r\\n numberLength = ('00' + decimalToHex(phoneNumber.length)).slice(-2).toUpperCase();\\r\\n nameHex = ascii_to_hexa(params.ApprovedContacts[contact].Name).toUpperCase();\\r\\n nameLength = ('00' + decimalToHex(params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n keyLength = ('00' + decimalToHex(5 + phoneNumber.length + params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n value += keyLength + \\\"34\\\" + confTel + numberLength + numberHex + nameLength + nameHex + '00'; //no photo\\r\\n //value += keyLength + \\\"30\\\" + confTel + numberHex; //no photo \\r\\n counter++;\\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 phoneNumber = params.ApprovedContacts[contact].Contact;\\r\\n if (phoneNumber.startsWith(\\\"+\\\")) {\\r\\n phoneNumber = \\\"00\\\" + phoneNumber.substring(1);\\r\\n }\\r\\n numberHex = ascii_to_hexa(phoneNumber).toUpperCase();\\r\\n numberLength = ('00' + decimalToHex(phoneNumber.length)).slice(-2).toUpperCase();\\r\\n nameHex = ascii_to_hexa(params.ApprovedContacts[contact].Name).toUpperCase();\\r\\n nameLength = ('00' + decimalToHex(params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n keyLength = ('00' + decimalToHex(5 + phoneNumber.length + params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n value += keyLength + \\\"34\\\" + confTel + numberLength + numberHex + nameLength + nameHex + '00'; //no photo\\r\\n //value += keyLength + \\\"30\\\" + confTel + numberHex; //no photo \\r\\n counter++;\\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 += \\\"0534\\\" + confTel + '000000'; //no number, no name, no photo\\r\\n}\\r\\n// watch settings section\\r\\n// lenght and key\\r\\nvar messageBody = '1136';\\r\\n// step count/heart value display\\r\\n// Watch setting related FACE ID\\r\\nmessageBody += '00'; // Default FACE ID 0 \\r\\n// Future\\r\\n//if (params.WatchFace.SetWatchFace) {\\r\\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \\r\\n//} else {\\r\\n// messageBody += '00'; // Analog Face Default FACE ID 0 \\r\\n//}\\r\\n// Watch Display setting related to Step and heart rate settings\\r\\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '081B0000'; //both displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += (counter > 0) ? 'E' : '6';\\r\\n //messageBody += '6'; //menu 1 and 2 \\r\\n //messageBody += 'E'; //menu 1 and 2 and contact (menu 3) \\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '080B0000'; // step display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '4'; //menu 2 \\r\\n //messageBody += 'C'; // menu 2 and contact (menu 3) \\r\\n messageBody += (counter > 0) ? 'C' : '4';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '08130000'; // heart display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '2'; //menu 1 no contact (menu 3) \\r\\n //messageBody += 'A'; //menu 1 and contact (menu 3) \\r\\n messageBody += (counter > 0) ? 'A' : '2';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '08030000'; // no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '0000000'; // no menu , //08 only contact\\r\\n //messageBody += '8'; // //08 only contact\\r\\n messageBody += (counter > 0) ? '8' : '0';\\r\\n messageBody += '000000'; // other settings\\r\\n} else {\\r\\n messageBody += '08030000'; //no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '0000000'; // no menu..\\r\\n}\\r\\n// from autohome page to the end\\r\\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\\r\\nvalue += messageBody; //add watchsetting hex to contact hex in value var \\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}\",\"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":1765220731},{"Type":2,"NewValue":"{\"Id\":12388,\"Group\":{\"Id\":7454,\"Name\":\"SPO2 Settings\",\"Json\":{\"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\":\"Reporting Frequency\",\"Json\":\"{\\\"name\\\":\\\"Reporting Frequency\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":null,\\\"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\\\":\\\"720\\\",\\\"label\\\":\\\"12 hours\\\"},{\\\"value\\\":\\\"360\\\",\\\"label\\\":\\\"6 hours\\\"},{\\\"value\\\":\\\"60\\\",\\\"label\\\":\\\"1 hour\\\"},{\\\"value\\\":\\\"30\\\",\\\"label\\\":\\\"30 min\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"]}\",\"Default\":\"\",\"Command\":{\"Id\":5806,\"Protocol\":{\"Id\":297,\"Code\":\"Access TEC Care Watch\",\"Version\":\"1.6\",\"FirmwareVersion\":\"V06.8601.2501\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"setWatchSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"// Watch Settings\\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 Watch Settings' Only enable y disable:\\r\\n// params.StepCounting.EnableDisableStepCounting == 'true'\\r\\n// params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true'\\r\\n//var params = {StepCounting:{'EnableDisableStepCounting':'true'},HeartRateMonitor:{'EnableDisableHeartRateMonitor':'true'}, DeviceVersion:{'DeviceVersion':2}}\\r\\n// Test enabled both\\r\\n// AB 10 13 00 99 6A 0A 00 02 11 36 00 08 1B 00 00 0E 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step on HRT off\\r\\n// AB 10 13 00 DD 0C 0B 00 02 11 36 00 08 0B 00 00 0C 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step off HRT on\\r\\n// AB 10 13 00 B5 D0 09 00 02 11 36 00 08 13 00 00 0A 00 00 00 14 00 00 00 03 0A 01\\r\\n// test both off \\r\\n// AB 10 13 00 F1 B6 0C 00 02 11 36 00 08 03 00 00 08 00 00 00 14 00 00 00 03 0A 01 \\r\\n// comando para Contact on ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 4C 2E 03 00 02 11 36 00 08 1B 00 00 4E 00 00 00 14 00 00 00 03 0A 01\\r\\n// comando para contact off ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 C2 8C 04 00 02 11 36 00 08 1B 00 00 46 00 00 00 14 00 00 00 03 0A 01\\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\n// To store the quantity of contacts in the whitelist to enable disable the contact menu\\r\\n//var contactos = params.ApprovedContacts && params.ApprovedContacts.Contact;\\r\\n//var numDuplas = Array.isArray(params.ApprovedContacts) ? params.ApprovedContacts.length : 0;\\r\\n//var numDuplas = params.ApprovedContacts;\\r\\nlet numDuplas = 2;\\r\\n//for (const key in params.ApprovedContacts) {\\r\\n// if (params.ApprovedContacts[key] && params.ApprovedContacts[key].Contact && params.ApprovedContacts[key].Contact !== \\\"\\\") {\\r\\n// numDuplas++;\\r\\n// }\\r\\n//}\\r\\n//for (const key in params.ApprovedContacts) {\\r\\n// if (params.ApprovedContacts[key] && params.ApprovedContacts[key].Contact && params.ApprovedContacts[key].Contact !== \\\"\\\") {\\r\\n// numDuplas++;\\r\\n// }\\r\\n//}\\r\\n// configuration command (0X02) , lenght and key\\r\\nvar messageBody = '021136';\\r\\n// step count/heart value display\\r\\n// Watch setting related FACE ID\\r\\nmessageBody += '00'; // Default FACE ID 0 \\r\\n// Future\\r\\n//if (params.WatchFace.SetWatchFace) {\\r\\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \\r\\n//} else {\\r\\n// messageBody += '00'; // Analog Face Default FACE ID 0 \\r\\n//}\\r\\n// Watch Display setting related to Step and heart rate settings\\r\\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '081B0000'; //both displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += (numDuplas > 0) ? 'E' : '6';\\r\\n //messageBody += '6'; //menu 1 and 2 \\r\\n //messageBody += 'E'; //menu 1 and 2 and contact (menu 3) \\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '080B0000'; // step display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '4'; //menu 2 \\r\\n //messageBody += 'C'; // menu 2 and contact (menu 3) \\r\\n messageBody += (numDuplas > 0) ? 'C' : '4';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '08130000'; // heart display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '2'; //menu 1 no contact (menu 3) \\r\\n //messageBody += 'A'; //menu 1 and contact (menu 3) \\r\\n messageBody += (numDuplas > 0) ? 'A' : '2';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '08030000'; // no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '0000000'; // no menu , //08 only contact\\r\\n //messageBody += '8'; // //08 only contact\\r\\n messageBody += (numDuplas > 0) ? '8' : '0';\\r\\n messageBody += '000000'; // other settings\\r\\n} else {\\r\\n messageBody += '08030000'; //no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '0000000'; // no menu..\\r\\n}\\r\\n//menu items for the future\\r\\n/*if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '06000000'; //menu 1 and 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '04000000'; //menu 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '02000000'; //menu 1\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '00000000'; // no menu\\r\\n} else {\\r\\n messageBody += '00000000'; // no menu\\r\\n}*/\\r\\n// from autohome page to the end\\r\\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\\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\\n//AddValueSMS('dataSMS', dataSMS);\\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// functions\\r\\nfunction AddValue(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n var arr1 = [];\\r\\n for (var n = 0, l = str.length; n < l; n++) {\\r\\n var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n arr1.push(hex);\\r\\n }\\r\\n return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n var crc = 0x0000;\\r\\n var j, i;\\r\\n for (i = 0; i < s.length; i++) {\\r\\n c = s[i];\\r\\n if (c > 255) {\\r\\n throw new RangeError();\\r\\n }\\r\\n j = (c ^ (crc >> 8)) & 0xFF;\\r\\n crc = crcTable[j] ^ (crc << 8);\\r\\n }\\r\\n return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n var splitStr = []\\r\\n var j = 0\\r\\n for (let i = 0; i < str.length; i += 2) {\\r\\n splitStr[j] = str.substring(i, i + 2)\\r\\n j++\\r\\n }\\r\\n var bytes = []\\r\\n var bytePos = 0\\r\\n for (let i = 0; i < splitStr.length; i++) {\\r\\n var byteStr = splitStr[i]\\r\\n var b = parseInt(byteStr, 16)\\r\\n if (b < 256) {\\r\\n bytes[bytePos] = b\\r\\n bytePos++\\r\\n }\\r\\n }\\r\\n return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n hexString = str.toString(16);\\r\\n return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n let bin = 0;\\r\\n let rem, i = 1,\\r\\n step = 1;\\r\\n while (x != 0) {\\r\\n rem = x % 2;\\r\\n x = parseInt(x / 2);\\r\\n bin = bin + rem * i;\\r\\n i = i * 10;\\r\\n }\\r\\n return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n var hexa = parseInt(x, 2).toString(16);\\r\\n return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n const result = [];\\r\\n let len = string.length - 2;\\r\\n while (len >= 0) {\\r\\n result.push(string.substr(len, 2));\\r\\n len -= 2;\\r\\n }\\r\\n return result.join('');\\r\\n}\",\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":true,\"SendAttempts\":4,\"Order\":null},\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1765220733}],"LanguageId":null,"Tags":[]},{"Id":12388,"Group":{"Id":7454,"Name":"SPO2 Settings","Json":{"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":"Reporting Frequency","Json":"{\"name\":\"Reporting Frequency\",\"default\":\"\",\"description\":null,\"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\":[{\"label\":\"12 hours\",\"value\":\"720\"},{\"label\":\"6 hours\",\"value\":\"360\"},{\"label\":\"1 hour\",\"value\":\"60\"},{\"label\":\"30 min\",\"value\":\"30\"}],\"toTranslate\":[\"name\",\"description\",\"helpText\",\"label\"]}","Default":"","Command":{"Id":5818,"Protocol":{"Id":297,"Code":"Access TEC Care Watch","Version":"1.4","FirmwareVersion":"V06.8601.2501","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":true},"Name":"setSPOInterval","TemplateSMS":null,"Template":"<>","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.HeartrateSettings.ReportingFrequency) {\n var heartBeat = parseInt(params.HeartrateSettings.ReportingFrequency) * 60; //in seconds\n heartBeat = decimalToHex(heartBeat);\n heartBeat = ('000000' + heartBeat).slice(-6).toUpperCase();\n if (params.HeartrateSettings.EnableDisableHeartrateSettings == '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 = '58020000'\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}","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":12389,"Group":{"Id":7457,"Name":"Read SPO2 Settings","Json":{"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":"Enable Disable Read SPO2 Settings","Json":"{\"name\":\"Enable Disable Read SPO2 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":[{"Type":0,"NewValue":"{\"Id\":12389,\"Group\":{\"Id\":7457,\"Name\":\"Read SPO2 Settings\",\"Json\":{\"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\":\"Enable Disable Read SPO2 Settings\",\"Json\":\"{\\\"name\\\":\\\"Enable Disable Read SPO2 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\":[]}","Timestamp":1763059280}],"LanguageId":null,"Tags":[]},{"Id":12390,"Group":{"Id":7457,"Name":"Read SPO2 Settings","Json":{"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":"Reporting Frequency","Json":"{\"name\":\"Reporting Frequency\",\"default\":\"\",\"description\":null,\"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\":\"12 hours\",\"value\":\"720\"},{\"label\":\"6 hours\",\"value\":\"360\"},{\"label\":\"1 hour\",\"value\":\"60\"},{\"label\":\"30 minutes\",\"value\":\"30\"}],\"toTranslate\":[\"name\",\"description\",\"helpText\",\"label\"]}","Default":"","Command":null,"ProtocolActionObjects":[{"Type":0,"NewValue":"{\"Id\":12390,\"Group\":{\"Id\":7457,\"Name\":\"Read SPO2 Settings\",\"Json\":{\"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\":\"Reporting Frequency\",\"Json\":\"{\\\"name\\\":\\\"Reporting Frequency\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":null,\\\"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\\\":\\\"12 hours\\\",\\\"value\\\":\\\"720\\\"},{\\\"label\\\":\\\"6 hours\\\",\\\"value\\\":\\\"360\\\"},{\\\"label\\\":\\\"1 hour\\\",\\\"value\\\":\\\"60\\\"},{\\\"label\\\":\\\"30 minutes\\\",\\\"value\\\":\\\"30\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1763059374},{"Type":1,"NewValue":"{\"Id\":12390,\"Group\":{\"Id\":7457,\"Name\":\"Read SPO2 Settings\",\"Json\":{\"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\":\"Reporting Frequency\",\"Json\":\"{\\\"name\\\":\\\"Reporting Frequency\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":null,\\\"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\\\":\\\"720\\\",\\\"label\\\":\\\"12 hours\\\"},{\\\"value\\\":\\\"360\\\",\\\"label\\\":\\\"6 hours\\\"},{\\\"value\\\":\\\"60\\\",\\\"label\\\":\\\"1 hour\\\"},{\\\"label\\\":\\\"30 min\\\",\\\"value\\\":\\\"30\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1763059448}],"LanguageId":null,"Tags":[]},{"Id":12337,"Group":{"Id":7390,"Name":"Approved Contacts","Json":{"description":"","columns":1,"order":2,"listSize":8,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Contact","Json":"{\"name\":\"Contact\",\"default\":\"\",\"description\":\"Contact\",\"type\":\"phone\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Phone number of the contact\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":{"Id":5806,"Protocol":{"Id":297,"Code":"Access TEC Care Watch","Version":"1.6","FirmwareVersion":"V06.8601.2501","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":true},"Name":"setWatchSettings","TemplateSMS":null,"Template":"<>","AckTemplate":null,"Operation":"// Watch Settings\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 Watch Settings' Only enable y disable:\r\n// params.StepCounting.EnableDisableStepCounting == 'true'\r\n// params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true'\r\n//var params = {StepCounting:{'EnableDisableStepCounting':'true'},HeartRateMonitor:{'EnableDisableHeartRateMonitor':'true'}, DeviceVersion:{'DeviceVersion':2}}\r\n// Test enabled both\r\n// AB 10 13 00 99 6A 0A 00 02 11 36 00 08 1B 00 00 0E 00 00 00 14 00 00 00 03 0A 01\r\n// test step on HRT off\r\n// AB 10 13 00 DD 0C 0B 00 02 11 36 00 08 0B 00 00 0C 00 00 00 14 00 00 00 03 0A 01\r\n// test step off HRT on\r\n// AB 10 13 00 B5 D0 09 00 02 11 36 00 08 13 00 00 0A 00 00 00 14 00 00 00 03 0A 01\r\n// test both off \r\n// AB 10 13 00 F1 B6 0C 00 02 11 36 00 08 03 00 00 08 00 00 00 14 00 00 00 03 0A 01 \r\n// comando para Contact on ( on HR, Steps, SPO2)\r\n//AB 10 13 00 4C 2E 03 00 02 11 36 00 08 1B 00 00 4E 00 00 00 14 00 00 00 03 0A 01\r\n// comando para contact off ( on HR, Steps, SPO2)\r\n//AB 10 13 00 C2 8C 04 00 02 11 36 00 08 1B 00 00 46 00 00 00 14 00 00 00 03 0A 01\r\nvar msg = [];\r\nvar configs = [];\r\n// To store the quantity of contacts in the whitelist to enable disable the contact menu\r\nvar contactos = params.ApprovedContacts && params.ApprovedContacts.Contact;\r\nvar numDuplas = Array.isArray(contactos) ? contactos.length : 0;\r\n// configuration command (0X02) , lenght and key\r\nvar messageBody = '021136';\r\n// step count/heart value display\r\n// Watch setting related FACE ID\r\nmessageBody += '00'; // Default FACE ID 0 \r\n// Future\r\n//if (params.WatchFace.SetWatchFace) {\r\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \r\n//} else {\r\n// messageBody += '00'; // Analog Face Default FACE ID 0 \r\n//}\r\n// Watch Display setting related to Step and heart rate settings\r\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\r\n messageBody += '081B0000'; //both displays\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n messageBody += (numDuplas > 2) ? 'E' : '6';\r\n //messageBody += '6'; //menu 1 and 2 \r\n //messageBody += 'E'; //menu 1 and 2 and contact (menu 3) \r\n messageBody += '000000'; // other settings\r\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\r\n messageBody += '080B0000'; // step display\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n //messageBody += '4'; //menu 2 \r\n //messageBody += 'C'; // menu 2 and contact (menu 3) \r\n messageBody += (numDuplas > 2) ? 'C' : '4';\r\n messageBody += '000000'; // other settings\r\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\r\n messageBody += '08130000'; // heart display\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n //messageBody += '2'; //menu 1 no contact (menu 3) \r\n //messageBody += 'A'; //menu 1 and contact (menu 3) \r\n messageBody += (numDuplas > 2) ? 'A' : '2';\r\n messageBody += '000000'; // other settings\r\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\r\n messageBody += '08030000'; // no displays\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n //messageBody += '0000000'; // no menu , //08 only contact\r\n //messageBody += '8'; // //08 only contact\r\n messageBody += (numDuplas > 2) ? '8' : '0';\r\n messageBody += '000000'; // other settings\r\n} else {\r\n messageBody += '08030000'; //no displays\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n messageBody += '0000000'; // no menu..\r\n}\r\n//menu items for the future\r\n/*if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'true')) {\r\n messageBody += '06000000'; //menu 1 and 2\r\n} else if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'false')) {\r\n messageBody += '04000000'; //menu 2\r\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'true')) {\r\n messageBody += '02000000'; //menu 1\r\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'false')) {\r\n messageBody += '00000000'; // no menu\r\n} else {\r\n messageBody += '00000000'; // no menu\r\n}*/\r\n// from autohome page to the end\r\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\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\n//AddValueSMS('dataSMS', dataSMS);\r\nvar commandConfigs = {\r\n template: \"main\",\r\n configs: configs //,\r\n //configsSMS: configsSMS\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n// functions\r\nfunction AddValue(p1, p2) {\r\n var cvpair = {\r\n code: p1,\r\n value: p2\r\n };\r\n configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n var cvpair = {\r\n code: p1,\r\n value: p2\r\n };\r\n configsSMS.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n var arr1 = [];\r\n for (var n = 0, l = str.length; n < l; n++) {\r\n var hex = Number(str.charCodeAt(n)).toString(16);\r\n arr1.push(hex);\r\n }\r\n return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n var crc = 0x0000;\r\n var j, i;\r\n for (i = 0; i < s.length; i++) {\r\n c = s[i];\r\n if (c > 255) {\r\n throw new RangeError();\r\n }\r\n j = (c ^ (crc >> 8)) & 0xFF;\r\n crc = crcTable[j] ^ (crc << 8);\r\n }\r\n return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n var splitStr = []\r\n var j = 0\r\n for (let i = 0; i < str.length; i += 2) {\r\n splitStr[j] = str.substring(i, i + 2)\r\n j++\r\n }\r\n var bytes = []\r\n var bytePos = 0\r\n for (let i = 0; i < splitStr.length; i++) {\r\n var byteStr = splitStr[i]\r\n var b = parseInt(byteStr, 16)\r\n if (b < 256) {\r\n bytes[bytePos] = b\r\n bytePos++\r\n }\r\n }\r\n return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n hexString = str.toString(16);\r\n return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n let bin = 0;\r\n let rem, i = 1,\r\n step = 1;\r\n while (x != 0) {\r\n rem = x % 2;\r\n x = parseInt(x / 2);\r\n bin = bin + rem * i;\r\n i = i * 10;\r\n }\r\n return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n var hexa = parseInt(x, 2).toString(16);\r\n return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n const result = [];\r\n let len = string.length - 2;\r\n while (len >= 0) {\r\n result.push(string.substr(len, 2));\r\n len -= 2;\r\n }\r\n return result.join('');\r\n}","AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"CommandToUpdateId":null,"ParentId":null,"Parent":null,"HasAck":true,"HexString":true,"SendAttempts":4,"Order":null},"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":12337,"Group":{"Id":7390,"Name":"Approved Contacts","Json":{"description":"","columns":1,"order":2,"listSize":8,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Contact","Json":"{\"name\":\"Contact\",\"default\":\"\",\"description\":\"Contact\",\"type\":\"phone\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Phone number of the contact\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":{"Id":5806,"Protocol":{"Id":297,"Code":"Access TEC Care Watch","Version":"1.6","FirmwareVersion":"V06.8601.2501","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":true},"Name":"setWatchSettings","TemplateSMS":null,"Template":"<>","AckTemplate":null,"Operation":"// Watch Settings\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 Watch Settings' Only enable y disable:\r\n// params.StepCounting.EnableDisableStepCounting == 'true'\r\n// params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true'\r\n//var params = {StepCounting:{'EnableDisableStepCounting':'true'},HeartRateMonitor:{'EnableDisableHeartRateMonitor':'true'}, DeviceVersion:{'DeviceVersion':2}}\r\n// Test enabled both\r\n// AB 10 13 00 99 6A 0A 00 02 11 36 00 08 1B 00 00 0E 00 00 00 14 00 00 00 03 0A 01\r\n// test step on HRT off\r\n// AB 10 13 00 DD 0C 0B 00 02 11 36 00 08 0B 00 00 0C 00 00 00 14 00 00 00 03 0A 01\r\n// test step off HRT on\r\n// AB 10 13 00 B5 D0 09 00 02 11 36 00 08 13 00 00 0A 00 00 00 14 00 00 00 03 0A 01\r\n// test both off \r\n// AB 10 13 00 F1 B6 0C 00 02 11 36 00 08 03 00 00 08 00 00 00 14 00 00 00 03 0A 01 \r\n// comando para Contact on ( on HR, Steps, SPO2)\r\n//AB 10 13 00 4C 2E 03 00 02 11 36 00 08 1B 00 00 4E 00 00 00 14 00 00 00 03 0A 01\r\n// comando para contact off ( on HR, Steps, SPO2)\r\n//AB 10 13 00 C2 8C 04 00 02 11 36 00 08 1B 00 00 46 00 00 00 14 00 00 00 03 0A 01\r\nvar msg = [];\r\nvar configs = [];\r\n// To store the quantity of contacts in the whitelist to enable disable the contact menu\r\n//var contactos = params.ApprovedContacts && params.ApprovedContacts.Contact;\r\nvar numDuplas = Array.isArray(params.ApprovedContacts) ? params.ApprovedContacts.length : 0;\r\n// configuration command (0X02) , lenght and key\r\nvar messageBody = '021136';\r\n// step count/heart value display\r\n// Watch setting related FACE ID\r\nmessageBody += '00'; // Default FACE ID 0 \r\n// Future\r\n//if (params.WatchFace.SetWatchFace) {\r\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \r\n//} else {\r\n// messageBody += '00'; // Analog Face Default FACE ID 0 \r\n//}\r\n// Watch Display setting related to Step and heart rate settings\r\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\r\n messageBody += '081B0000'; //both displays\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n messageBody += (numDuplas > 0) ? 'E' : '6';\r\n //messageBody += '6'; //menu 1 and 2 \r\n //messageBody += 'E'; //menu 1 and 2 and contact (menu 3) \r\n messageBody += '000000'; // other settings\r\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\r\n messageBody += '080B0000'; // step display\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n //messageBody += '4'; //menu 2 \r\n //messageBody += 'C'; // menu 2 and contact (menu 3) \r\n messageBody += (numDuplas > 0) ? 'C' : '4';\r\n messageBody += '000000'; // other settings\r\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\r\n messageBody += '08130000'; // heart display\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n //messageBody += '2'; //menu 1 no contact (menu 3) \r\n //messageBody += 'A'; //menu 1 and contact (menu 3) \r\n messageBody += (numDuplas > 0) ? 'A' : '2';\r\n messageBody += '000000'; // other settings\r\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\r\n messageBody += '08030000'; // no displays\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n //messageBody += '0000000'; // no menu , //08 only contact\r\n //messageBody += '8'; // //08 only contact\r\n messageBody += (numDuplas > 0) ? '8' : '0';\r\n messageBody += '000000'; // other settings\r\n} else {\r\n messageBody += '08030000'; //no displays\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n messageBody += '0000000'; // no menu..\r\n}\r\n//menu items for the future\r\n/*if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'true')) {\r\n messageBody += '06000000'; //menu 1 and 2\r\n} else if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'false')) {\r\n messageBody += '04000000'; //menu 2\r\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'true')) {\r\n messageBody += '02000000'; //menu 1\r\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'false')) {\r\n messageBody += '00000000'; // no menu\r\n} else {\r\n messageBody += '00000000'; // no menu\r\n}*/\r\n// from autohome page to the end\r\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\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\n//AddValueSMS('dataSMS', dataSMS);\r\nvar commandConfigs = {\r\n template: \"main\",\r\n configs: configs //,\r\n //configsSMS: configsSMS\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n// functions\r\nfunction AddValue(p1, p2) {\r\n var cvpair = {\r\n code: p1,\r\n value: p2\r\n };\r\n configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n var cvpair = {\r\n code: p1,\r\n value: p2\r\n };\r\n configsSMS.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n var arr1 = [];\r\n for (var n = 0, l = str.length; n < l; n++) {\r\n var hex = Number(str.charCodeAt(n)).toString(16);\r\n arr1.push(hex);\r\n }\r\n return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n var crc = 0x0000;\r\n var j, i;\r\n for (i = 0; i < s.length; i++) {\r\n c = s[i];\r\n if (c > 255) {\r\n throw new RangeError();\r\n }\r\n j = (c ^ (crc >> 8)) & 0xFF;\r\n crc = crcTable[j] ^ (crc << 8);\r\n }\r\n return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n var splitStr = []\r\n var j = 0\r\n for (let i = 0; i < str.length; i += 2) {\r\n splitStr[j] = str.substring(i, i + 2)\r\n j++\r\n }\r\n var bytes = []\r\n var bytePos = 0\r\n for (let i = 0; i < splitStr.length; i++) {\r\n var byteStr = splitStr[i]\r\n var b = parseInt(byteStr, 16)\r\n if (b < 256) {\r\n bytes[bytePos] = b\r\n bytePos++\r\n }\r\n }\r\n return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n hexString = str.toString(16);\r\n return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n let bin = 0;\r\n let rem, i = 1,\r\n step = 1;\r\n while (x != 0) {\r\n rem = x % 2;\r\n x = parseInt(x / 2);\r\n bin = bin + rem * i;\r\n i = i * 10;\r\n }\r\n return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n var hexa = parseInt(x, 2).toString(16);\r\n return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n const result = [];\r\n let len = string.length - 2;\r\n while (len >= 0) {\r\n result.push(string.substr(len, 2));\r\n len -= 2;\r\n }\r\n return result.join('');\r\n}","AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"CommandToUpdateId":null,"ParentId":null,"Parent":null,"HasAck":true,"HexString":true,"SendAttempts":4,"Order":null},"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":12388,"Group":{"Id":7454,"Name":"SPO2 Settings","Json":{"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":"Reporting Frequency","Json":"{\"name\":\"Reporting Frequency\",\"default\":\"\",\"description\":null,\"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\":\"720\",\"label\":\"12 hours\"},{\"value\":\"360\",\"label\":\"6 hours\"},{\"value\":\"60\",\"label\":\"1 hour\"},{\"value\":\"30\",\"label\":\"30 min\"}],\"toTranslate\":[\"name\",\"description\",\"helpText\",\"label\"]}","Default":"","Command":{"Id":5806,"Protocol":{"Id":297,"Code":"Access TEC Care Watch","Version":"1.6","FirmwareVersion":"V06.8601.2501","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":true},"Name":"setWatchSettings","TemplateSMS":null,"Template":"<>","AckTemplate":null,"Operation":"// Watch Settings\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 Watch Settings' Only enable y disable:\r\n// params.StepCounting.EnableDisableStepCounting == 'true'\r\n// params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true'\r\n//var params = {StepCounting:{'EnableDisableStepCounting':'true'},HeartRateMonitor:{'EnableDisableHeartRateMonitor':'true'}, DeviceVersion:{'DeviceVersion':2}}\r\n// Test enabled both\r\n// AB 10 13 00 99 6A 0A 00 02 11 36 00 08 1B 00 00 0E 00 00 00 14 00 00 00 03 0A 01\r\n// test step on HRT off\r\n// AB 10 13 00 DD 0C 0B 00 02 11 36 00 08 0B 00 00 0C 00 00 00 14 00 00 00 03 0A 01\r\n// test step off HRT on\r\n// AB 10 13 00 B5 D0 09 00 02 11 36 00 08 13 00 00 0A 00 00 00 14 00 00 00 03 0A 01\r\n// test both off \r\n// AB 10 13 00 F1 B6 0C 00 02 11 36 00 08 03 00 00 08 00 00 00 14 00 00 00 03 0A 01 \r\n// comando para Contact on ( on HR, Steps, SPO2)\r\n//AB 10 13 00 4C 2E 03 00 02 11 36 00 08 1B 00 00 4E 00 00 00 14 00 00 00 03 0A 01\r\n// comando para contact off ( on HR, Steps, SPO2)\r\n//AB 10 13 00 C2 8C 04 00 02 11 36 00 08 1B 00 00 46 00 00 00 14 00 00 00 03 0A 01\r\nvar msg = [];\r\nvar configs = [];\r\n// To store the quantity of contacts in the whitelist to enable disable the contact menu\r\n//var contactos = params.ApprovedContacts && params.ApprovedContacts.Contact;\r\nvar numDuplas = Array.isArray(params.ApprovedContacts) ? params.ApprovedContacts.length : 0;\r\n// configuration command (0X02) , lenght and key\r\nvar messageBody = '021136';\r\n// step count/heart value display\r\n// Watch setting related FACE ID\r\nmessageBody += '00'; // Default FACE ID 0 \r\n// Future\r\n//if (params.WatchFace.SetWatchFace) {\r\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \r\n//} else {\r\n// messageBody += '00'; // Analog Face Default FACE ID 0 \r\n//}\r\n// Watch Display setting related to Step and heart rate settings\r\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\r\n messageBody += '081B0000'; //both displays\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n messageBody += (numDuplas > 0) ? 'E' : '6';\r\n //messageBody += '6'; //menu 1 and 2 \r\n //messageBody += 'E'; //menu 1 and 2 and contact (menu 3) \r\n messageBody += '000000'; // other settings\r\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\r\n messageBody += '080B0000'; // step display\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n //messageBody += '4'; //menu 2 \r\n //messageBody += 'C'; // menu 2 and contact (menu 3) \r\n messageBody += (numDuplas > 0) ? 'C' : '4';\r\n messageBody += '000000'; // other settings\r\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\r\n messageBody += '08130000'; // heart display\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n //messageBody += '2'; //menu 1 no contact (menu 3) \r\n //messageBody += 'A'; //menu 1 and contact (menu 3) \r\n messageBody += (numDuplas > 0) ? 'A' : '2';\r\n messageBody += '000000'; // other settings\r\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\r\n messageBody += '08030000'; // no displays\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n //messageBody += '0000000'; // no menu , //08 only contact\r\n //messageBody += '8'; // //08 only contact\r\n messageBody += (numDuplas > 0) ? '8' : '0';\r\n messageBody += '000000'; // other settings\r\n} else {\r\n messageBody += '08030000'; //no displays\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n messageBody += '0000000'; // no menu..\r\n}\r\n//menu items for the future\r\n/*if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'true')) {\r\n messageBody += '06000000'; //menu 1 and 2\r\n} else if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'false')) {\r\n messageBody += '04000000'; //menu 2\r\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'true')) {\r\n messageBody += '02000000'; //menu 1\r\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'false')) {\r\n messageBody += '00000000'; // no menu\r\n} else {\r\n messageBody += '00000000'; // no menu\r\n}*/\r\n// from autohome page to the end\r\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\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\n//AddValueSMS('dataSMS', dataSMS);\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// functions\r\nfunction AddValue(p1, p2) {\r\n var cvpair = {\r\n code: p1,\r\n value: p2\r\n };\r\n configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n var cvpair = {\r\n code: p1,\r\n value: p2\r\n };\r\n configsSMS.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n var arr1 = [];\r\n for (var n = 0, l = str.length; n < l; n++) {\r\n var hex = Number(str.charCodeAt(n)).toString(16);\r\n arr1.push(hex);\r\n }\r\n return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n var crc = 0x0000;\r\n var j, i;\r\n for (i = 0; i < s.length; i++) {\r\n c = s[i];\r\n if (c > 255) {\r\n throw new RangeError();\r\n }\r\n j = (c ^ (crc >> 8)) & 0xFF;\r\n crc = crcTable[j] ^ (crc << 8);\r\n }\r\n return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n var splitStr = []\r\n var j = 0\r\n for (let i = 0; i < str.length; i += 2) {\r\n splitStr[j] = str.substring(i, i + 2)\r\n j++\r\n }\r\n var bytes = []\r\n var bytePos = 0\r\n for (let i = 0; i < splitStr.length; i++) {\r\n var byteStr = splitStr[i]\r\n var b = parseInt(byteStr, 16)\r\n if (b < 256) {\r\n bytes[bytePos] = b\r\n bytePos++\r\n }\r\n }\r\n return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n hexString = str.toString(16);\r\n return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n let bin = 0;\r\n let rem, i = 1,\r\n step = 1;\r\n while (x != 0) {\r\n rem = x % 2;\r\n x = parseInt(x / 2);\r\n bin = bin + rem * i;\r\n i = i * 10;\r\n }\r\n return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n var hexa = parseInt(x, 2).toString(16);\r\n return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n const result = [];\r\n let len = string.length - 2;\r\n while (len >= 0) {\r\n result.push(string.substr(len, 2));\r\n len -= 2;\r\n }\r\n return result.join('');\r\n}","AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"CommandToUpdateId":null,"ParentId":null,"Parent":null,"HasAck":true,"HexString":true,"SendAttempts":4,"Order":null},"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":12362,"Group":{"Id":7416,"Name":"Heartrate Settings","Json":{"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":"Reporting Frequency","Json":"{\"name\":\"Reporting Frequency\",\"default\":\"\",\"description\":null,\"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\":\"720\",\"label\":\"12 hours\"},{\"value\":\"360\",\"label\":\"6 hours\"},{\"value\":\"60\",\"label\":\"1 hour\"},{\"value\":\"30\",\"label\":\"30 min\"}],\"toTranslate\":[\"name\",\"description\",\"helpText\",\"label\"]}","Default":"","Command":{"Id":5806,"Protocol":{"Id":297,"Code":"Access TEC Care Watch","Version":"1.6","FirmwareVersion":"V06.8601.2501","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":true},"Name":"setWatchSettings","TemplateSMS":null,"Template":"<>","AckTemplate":null,"Operation":"// Watch Settings\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 Watch Settings' Only enable y disable:\r\n// params.StepCounting.EnableDisableStepCounting == 'true'\r\n// params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true'\r\n//var params = {StepCounting:{'EnableDisableStepCounting':'true'},HeartRateMonitor:{'EnableDisableHeartRateMonitor':'true'}, DeviceVersion:{'DeviceVersion':2}}\r\n// Test enabled both\r\n// AB 10 13 00 99 6A 0A 00 02 11 36 00 08 1B 00 00 0E 00 00 00 14 00 00 00 03 0A 01\r\n// test step on HRT off\r\n// AB 10 13 00 DD 0C 0B 00 02 11 36 00 08 0B 00 00 0C 00 00 00 14 00 00 00 03 0A 01\r\n// test step off HRT on\r\n// AB 10 13 00 B5 D0 09 00 02 11 36 00 08 13 00 00 0A 00 00 00 14 00 00 00 03 0A 01\r\n// test both off \r\n// AB 10 13 00 F1 B6 0C 00 02 11 36 00 08 03 00 00 08 00 00 00 14 00 00 00 03 0A 01 \r\n// comando para Contact on ( on HR, Steps, SPO2)\r\n//AB 10 13 00 4C 2E 03 00 02 11 36 00 08 1B 00 00 4E 00 00 00 14 00 00 00 03 0A 01\r\n// comando para contact off ( on HR, Steps, SPO2)\r\n//AB 10 13 00 C2 8C 04 00 02 11 36 00 08 1B 00 00 46 00 00 00 14 00 00 00 03 0A 01\r\nvar msg = [];\r\nvar configs = [];\r\n// To store the quantity of contacts in the whitelist to enable disable the contact menu\r\n//var contactos = params.ApprovedContacts && params.ApprovedContacts.Contact;\r\nvar numDuplas = Array.isArray(params.ApprovedContacts) ? params.ApprovedContacts.length : 0;\r\n// configuration command (0X02) , lenght and key\r\nvar messageBody = '021136';\r\n// step count/heart value display\r\n// Watch setting related FACE ID\r\nmessageBody += '00'; // Default FACE ID 0 \r\n// Future\r\n//if (params.WatchFace.SetWatchFace) {\r\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \r\n//} else {\r\n// messageBody += '00'; // Analog Face Default FACE ID 0 \r\n//}\r\n// Watch Display setting related to Step and heart rate settings\r\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\r\n messageBody += '081B0000'; //both displays\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n messageBody += (numDuplas > 0) ? 'E' : '6';\r\n //messageBody += '6'; //menu 1 and 2 \r\n //messageBody += 'E'; //menu 1 and 2 and contact (menu 3) \r\n messageBody += '000000'; // other settings\r\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\r\n messageBody += '080B0000'; // step display\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n //messageBody += '4'; //menu 2 \r\n //messageBody += 'C'; // menu 2 and contact (menu 3) \r\n messageBody += (numDuplas > 0) ? 'C' : '4';\r\n messageBody += '000000'; // other settings\r\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\r\n messageBody += '08130000'; // heart display\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n //messageBody += '2'; //menu 1 no contact (menu 3) \r\n //messageBody += 'A'; //menu 1 and contact (menu 3) \r\n messageBody += (numDuplas > 0) ? 'A' : '2';\r\n messageBody += '000000'; // other settings\r\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\r\n messageBody += '08030000'; // no displays\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n //messageBody += '0000000'; // no menu , //08 only contact\r\n //messageBody += '8'; // //08 only contact\r\n messageBody += (numDuplas > 0) ? '8' : '0';\r\n messageBody += '000000'; // other settings\r\n} else {\r\n messageBody += '08030000'; //no displays\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n messageBody += '0000000'; // no menu..\r\n}\r\n//menu items for the future\r\n/*if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'true')) {\r\n messageBody += '06000000'; //menu 1 and 2\r\n} else if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'false')) {\r\n messageBody += '04000000'; //menu 2\r\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'true')) {\r\n messageBody += '02000000'; //menu 1\r\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'false')) {\r\n messageBody += '00000000'; // no menu\r\n} else {\r\n messageBody += '00000000'; // no menu\r\n}*/\r\n// from autohome page to the end\r\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\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\n//AddValueSMS('dataSMS', dataSMS);\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// functions\r\nfunction AddValue(p1, p2) {\r\n var cvpair = {\r\n code: p1,\r\n value: p2\r\n };\r\n configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n var cvpair = {\r\n code: p1,\r\n value: p2\r\n };\r\n configsSMS.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n var arr1 = [];\r\n for (var n = 0, l = str.length; n < l; n++) {\r\n var hex = Number(str.charCodeAt(n)).toString(16);\r\n arr1.push(hex);\r\n }\r\n return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n var crc = 0x0000;\r\n var j, i;\r\n for (i = 0; i < s.length; i++) {\r\n c = s[i];\r\n if (c > 255) {\r\n throw new RangeError();\r\n }\r\n j = (c ^ (crc >> 8)) & 0xFF;\r\n crc = crcTable[j] ^ (crc << 8);\r\n }\r\n return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n var splitStr = []\r\n var j = 0\r\n for (let i = 0; i < str.length; i += 2) {\r\n splitStr[j] = str.substring(i, i + 2)\r\n j++\r\n }\r\n var bytes = []\r\n var bytePos = 0\r\n for (let i = 0; i < splitStr.length; i++) {\r\n var byteStr = splitStr[i]\r\n var b = parseInt(byteStr, 16)\r\n if (b < 256) {\r\n bytes[bytePos] = b\r\n bytePos++\r\n }\r\n }\r\n return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n hexString = str.toString(16);\r\n return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n let bin = 0;\r\n let rem, i = 1,\r\n step = 1;\r\n while (x != 0) {\r\n rem = x % 2;\r\n x = parseInt(x / 2);\r\n bin = bin + rem * i;\r\n i = i * 10;\r\n }\r\n return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n var hexa = parseInt(x, 2).toString(16);\r\n return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n const result = [];\r\n let len = string.length - 2;\r\n while (len >= 0) {\r\n result.push(string.substr(len, 2));\r\n len -= 2;\r\n }\r\n return result.join('');\r\n}","AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"CommandToUpdateId":null,"ParentId":null,"Parent":null,"HasAck":true,"HexString":true,"SendAttempts":4,"Order":null},"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":12337,"Group":{"Id":7390,"Name":"Approved Contacts","Json":{"description":"","columns":1,"order":2,"listSize":8,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Contact","Json":"{\"name\":\"Contact\",\"default\":\"\",\"description\":\"Contact\",\"type\":\"phone\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Phone number of the contact\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":{"Id":5819,"Protocol":{"Id":297,"Code":"Access TEC Care Watch","Version":"1.6","FirmwareVersion":"V06.8601.2501","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":true},"Name":"setAuthorisedNumbersAndWatchSettings","TemplateSMS":null,"Template":"<>","AckTemplate":null,"Operation":"// Combinated version setAuthorisedNumber with Watch Settings for EV06\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// AB 10 22 00 32 FA 00 00 02 11 36 00 00 00 00 00 00 00 00 00 14 00 00 00 00 0A 00 0E 34 80 09 31 32 33 34 35 36 37 38 39 00 00\r\n// [Length]:11 [Key]:36 [Value]:00 00 00 00 00 00 00 00 00 14 00 00 00 00 0A 00\r\n//{\"watch\":{\"status18\":0,\"status17\":0,\"status19\":0,\"status10\":0,\"flagValue\":0,\"status12\":0,\"faceId\":0,\"status11\":0,\"status14\":0,\"status13\":0,\"status16\":0,\"status15\":0,\"status0\":0,\"status1\":0,\"menu8\":0,\"menu7\":0,\"menu6\":0,\"menu5\":0,\"menu4\":0,\"menu3\":0,\"menu2\":0,\"menu1\":0,\"autoTime\":20,\"brightNess\":0,\"logoIndex\":0,\"status20\":0,\"status8\":0,\"status9\":0,\"status2\":0,\"status3\":0,\"brightTime\":10}}\r\n//[Length]:0E [Key]:34 [Value]:80 09 31 32 33 34 35 36 37 38 39 00 00\r\n//{\"numberNamePhoto\":{\"call\":0,\"noCard\":0,\"number\":\"123456789\",\"enable\":1,\"sms\":0,\"name\":\"\",\"headURL\":\"\",\"index\":0}}\r\n// para pruebas en local Contact':\r\n//AB 10 12 00 94 ED 00 00 02 10 34 E0 09 31 32 33 34 35 36 37 38 39 02 79 6F 00\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 phoneNumber = '';\r\nvar numberLength = '00';\r\nvar numberHex = '';\r\nvar nameLength = '00';\r\nvar nameHex = '';\r\nvar value = '02';\r\nvar keyLength = '00';\r\nvar confTel = '';\r\nvar count = 1; // approved contact will be from A2 to A9 - index 1 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 += \"0534\" + 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 phoneNumber = params.ApprovedContacts[contact].Contact;\r\n if (phoneNumber.startsWith(\"+\")) {\r\n phoneNumber = \"00\" + phoneNumber.substring(1);\r\n }\r\n numberHex = ascii_to_hexa(phoneNumber).toUpperCase();\r\n numberLength = ('00' + decimalToHex(phoneNumber.length)).slice(-2).toUpperCase();\r\n nameHex = ascii_to_hexa(params.ApprovedContacts[contact].Name).toUpperCase();\r\n nameLength = ('00' + decimalToHex(params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\r\n keyLength = ('00' + decimalToHex(5 + phoneNumber.length + params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\r\n value += keyLength + \"34\" + confTel + numberLength + numberHex + nameLength + nameHex + '00'; //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 phoneNumber = params.ApprovedContacts[contact].Contact;\r\n if (phoneNumber.startsWith(\"+\")) {\r\n phoneNumber = \"00\" + phoneNumber.substring(1);\r\n }\r\n numberHex = ascii_to_hexa(phoneNumber).toUpperCase();\r\n numberLength = ('00' + decimalToHex(phoneNumber.length)).slice(-2).toUpperCase();\r\n nameHex = ascii_to_hexa(params.ApprovedContacts[contact].Name).toUpperCase();\r\n nameLength = ('00' + decimalToHex(params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\r\n keyLength = ('00' + decimalToHex(5 + phoneNumber.length + params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\r\n value += keyLength + \"34\" + confTel + numberLength + numberHex + nameLength + nameHex + '00'; //no photo\r\n //value += keyLength + \"30\" + confTel + numberHex; //no photo \r\n }\r\n count++;\r\n}\r\ncounter = count; // to check how many contacts are in the lists\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 += \"0534\" + confTel + '000000'; //no number, no name, no photo\r\n}\r\n// watch settings section\r\n// lenght and key\r\nvar messageBody = '1136';\r\n// step count/heart value display\r\n// Watch setting related FACE ID\r\nmessageBody += '00'; // Default FACE ID 0 \r\n// Future\r\n//if (params.WatchFace.SetWatchFace) {\r\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \r\n//} else {\r\n// messageBody += '00'; // Analog Face Default FACE ID 0 \r\n//}\r\n// Watch Display setting related to Step and heart rate settings\r\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\r\n messageBody += '081B0000'; //both displays\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n messageBody += (counter > 1) ? 'E' : '6';\r\n //messageBody += '6'; //menu 1 and 2 \r\n //messageBody += 'E'; //menu 1 and 2 and contact (menu 3) \r\n messageBody += '000000'; // other settings\r\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\r\n messageBody += '080B0000'; // step display\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n //messageBody += '4'; //menu 2 \r\n //messageBody += 'C'; // menu 2 and contact (menu 3) \r\n messageBody += (counter > 1) ? 'C' : '4';\r\n messageBody += '000000'; // other settings\r\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\r\n messageBody += '08130000'; // heart display\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n //messageBody += '2'; //menu 1 no contact (menu 3) \r\n //messageBody += 'A'; //menu 1 and contact (menu 3) \r\n messageBody += (counter > 1) ? 'A' : '2';\r\n messageBody += '000000'; // other settings\r\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\r\n messageBody += '08030000'; // no displays\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n //messageBody += '0000000'; // no menu , //08 only contact\r\n //messageBody += '8'; // //08 only contact\r\n messageBody += (counter > 1) ? '8' : '0';\r\n messageBody += '000000'; // other settings\r\n} else {\r\n messageBody += '08030000'; //no displays\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n messageBody += '0000000'; // no menu..\r\n}\r\n// from autohome page to the end\r\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\r\nvalue += messageBody; //add watchsetting hex to contact hex in value var \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}","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":12361,"Group":{"Id":7416,"Name":"Heartrate Settings","Json":{"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":"Enable Disable Heartrate Settings","Json":"{\"name\":\"Enable Disable Heartrate Settings\",\"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":{"Id":5819,"Protocol":{"Id":297,"Code":"Access TEC Care Watch","Version":"1.6","FirmwareVersion":"V06.8601.2501","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":true},"Name":"setAuthorisedNumbersAndWatchSettings","TemplateSMS":null,"Template":"<>","AckTemplate":null,"Operation":"// Combinated version setAuthorisedNumber with Watch Settings for EV06\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// AB 10 22 00 32 FA 00 00 02 11 36 00 00 00 00 00 00 00 00 00 14 00 00 00 00 0A 00 0E 34 80 09 31 32 33 34 35 36 37 38 39 00 00\r\n// [Length]:11 [Key]:36 [Value]:00 00 00 00 00 00 00 00 00 14 00 00 00 00 0A 00\r\n//{\"watch\":{\"status18\":0,\"status17\":0,\"status19\":0,\"status10\":0,\"flagValue\":0,\"status12\":0,\"faceId\":0,\"status11\":0,\"status14\":0,\"status13\":0,\"status16\":0,\"status15\":0,\"status0\":0,\"status1\":0,\"menu8\":0,\"menu7\":0,\"menu6\":0,\"menu5\":0,\"menu4\":0,\"menu3\":0,\"menu2\":0,\"menu1\":0,\"autoTime\":20,\"brightNess\":0,\"logoIndex\":0,\"status20\":0,\"status8\":0,\"status9\":0,\"status2\":0,\"status3\":0,\"brightTime\":10}}\r\n//[Length]:0E [Key]:34 [Value]:80 09 31 32 33 34 35 36 37 38 39 00 00\r\n//{\"numberNamePhoto\":{\"call\":0,\"noCard\":0,\"number\":\"123456789\",\"enable\":1,\"sms\":0,\"name\":\"\",\"headURL\":\"\",\"index\":0}}\r\n// para pruebas en local Contact':\r\n//AB 10 12 00 94 ED 00 00 02 10 34 E0 09 31 32 33 34 35 36 37 38 39 02 79 6F 00\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 phoneNumber = '';\r\nvar numberLength = '00';\r\nvar numberHex = '';\r\nvar nameLength = '00';\r\nvar nameHex = '';\r\nvar value = '02';\r\nvar keyLength = '00';\r\nvar confTel = '';\r\nvar count = 1; // approved contact will be from A2 to A9 - index 1 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\ncounter = 0; // to check how many contacts are in the lists\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 += \"0534\" + 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 phoneNumber = params.ApprovedContacts[contact].Contact;\r\n if (phoneNumber.startsWith(\"+\")) {\r\n phoneNumber = \"00\" + phoneNumber.substring(1);\r\n }\r\n numberHex = ascii_to_hexa(phoneNumber).toUpperCase();\r\n numberLength = ('00' + decimalToHex(phoneNumber.length)).slice(-2).toUpperCase();\r\n nameHex = ascii_to_hexa(params.ApprovedContacts[contact].Name).toUpperCase();\r\n nameLength = ('00' + decimalToHex(params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\r\n keyLength = ('00' + decimalToHex(5 + phoneNumber.length + params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\r\n value += keyLength + \"34\" + confTel + numberLength + numberHex + nameLength + nameHex + '00'; //no photo\r\n //value += keyLength + \"30\" + confTel + numberHex; //no photo \r\n counter++;\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 phoneNumber = params.ApprovedContacts[contact].Contact;\r\n if (phoneNumber.startsWith(\"+\")) {\r\n phoneNumber = \"00\" + phoneNumber.substring(1);\r\n }\r\n numberHex = ascii_to_hexa(phoneNumber).toUpperCase();\r\n numberLength = ('00' + decimalToHex(phoneNumber.length)).slice(-2).toUpperCase();\r\n nameHex = ascii_to_hexa(params.ApprovedContacts[contact].Name).toUpperCase();\r\n nameLength = ('00' + decimalToHex(params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\r\n keyLength = ('00' + decimalToHex(5 + phoneNumber.length + params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\r\n value += keyLength + \"34\" + confTel + numberLength + numberHex + nameLength + nameHex + '00'; //no photo\r\n //value += keyLength + \"30\" + confTel + numberHex; //no photo \r\n counter++;\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 += \"0534\" + confTel + '000000'; //no number, no name, no photo\r\n}\r\n// watch settings section\r\n// lenght and key\r\nvar messageBody = '1136';\r\n// step count/heart value display\r\n// Watch setting related FACE ID\r\nmessageBody += '00'; // Default FACE ID 0 \r\n// Future\r\n//if (params.WatchFace.SetWatchFace) {\r\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \r\n//} else {\r\n// messageBody += '00'; // Analog Face Default FACE ID 0 \r\n//}\r\n// Watch Display setting related to Step and heart rate settings\r\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\r\n messageBody += '081B0000'; //both displays\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n messageBody += (counter > 0) ? 'E' : '6';\r\n //messageBody += '6'; //menu 1 and 2 \r\n //messageBody += 'E'; //menu 1 and 2 and contact (menu 3) \r\n messageBody += '000000'; // other settings\r\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\r\n messageBody += '080B0000'; // step display\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n //messageBody += '4'; //menu 2 \r\n //messageBody += 'C'; // menu 2 and contact (menu 3) \r\n messageBody += (counter > 0) ? 'C' : '4';\r\n messageBody += '000000'; // other settings\r\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\r\n messageBody += '08130000'; // heart display\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n //messageBody += '2'; //menu 1 no contact (menu 3) \r\n //messageBody += 'A'; //menu 1 and contact (menu 3) \r\n messageBody += (counter > 0) ? 'A' : '2';\r\n messageBody += '000000'; // other settings\r\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\r\n messageBody += '08030000'; // no displays\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n //messageBody += '0000000'; // no menu , //08 only contact\r\n //messageBody += '8'; // //08 only contact\r\n messageBody += (counter > 0) ? '8' : '0';\r\n messageBody += '000000'; // other settings\r\n} else {\r\n messageBody += '08030000'; //no displays\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n messageBody += '0000000'; // no menu..\r\n}\r\n// from autohome page to the end\r\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\r\nvalue += messageBody; //add watchsetting hex to contact hex in value var \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}","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":12362,"Group":{"Id":7416,"Name":"Heartrate Settings","Json":{"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":"Reporting Frequency","Json":"{\"name\":\"Reporting Frequency\",\"default\":\"\",\"description\":null,\"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\":\"720\",\"label\":\"12 hours\"},{\"value\":\"360\",\"label\":\"6 hours\"},{\"value\":\"60\",\"label\":\"1 hour\"},{\"value\":\"30\",\"label\":\"30 min\"}],\"toTranslate\":[\"name\",\"description\",\"helpText\",\"label\"]}","Default":"","Command":{"Id":5819,"Protocol":{"Id":297,"Code":"Access TEC Care Watch","Version":"1.6","FirmwareVersion":"V06.8601.2501","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":true},"Name":"setAuthorisedNumbersAndWatchSettings","TemplateSMS":null,"Template":"<>","AckTemplate":null,"Operation":"// Combinated version setAuthorisedNumber with Watch Settings for EV06\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// AB 10 22 00 32 FA 00 00 02 11 36 00 00 00 00 00 00 00 00 00 14 00 00 00 00 0A 00 0E 34 80 09 31 32 33 34 35 36 37 38 39 00 00\r\n// [Length]:11 [Key]:36 [Value]:00 00 00 00 00 00 00 00 00 14 00 00 00 00 0A 00\r\n//{\"watch\":{\"status18\":0,\"status17\":0,\"status19\":0,\"status10\":0,\"flagValue\":0,\"status12\":0,\"faceId\":0,\"status11\":0,\"status14\":0,\"status13\":0,\"status16\":0,\"status15\":0,\"status0\":0,\"status1\":0,\"menu8\":0,\"menu7\":0,\"menu6\":0,\"menu5\":0,\"menu4\":0,\"menu3\":0,\"menu2\":0,\"menu1\":0,\"autoTime\":20,\"brightNess\":0,\"logoIndex\":0,\"status20\":0,\"status8\":0,\"status9\":0,\"status2\":0,\"status3\":0,\"brightTime\":10}}\r\n//[Length]:0E [Key]:34 [Value]:80 09 31 32 33 34 35 36 37 38 39 00 00\r\n//{\"numberNamePhoto\":{\"call\":0,\"noCard\":0,\"number\":\"123456789\",\"enable\":1,\"sms\":0,\"name\":\"\",\"headURL\":\"\",\"index\":0}}\r\n// para pruebas en local Contact':\r\n//AB 10 12 00 94 ED 00 00 02 10 34 E0 09 31 32 33 34 35 36 37 38 39 02 79 6F 00\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 phoneNumber = '';\r\nvar numberLength = '00';\r\nvar numberHex = '';\r\nvar nameLength = '00';\r\nvar nameHex = '';\r\nvar value = '02';\r\nvar keyLength = '00';\r\nvar confTel = '';\r\nvar count = 1; // approved contact will be from A2 to A9 - index 1 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\ncounter = 0; // to check how many contacts are in the lists\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 += \"0534\" + 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 phoneNumber = params.ApprovedContacts[contact].Contact;\r\n if (phoneNumber.startsWith(\"+\")) {\r\n phoneNumber = \"00\" + phoneNumber.substring(1);\r\n }\r\n numberHex = ascii_to_hexa(phoneNumber).toUpperCase();\r\n numberLength = ('00' + decimalToHex(phoneNumber.length)).slice(-2).toUpperCase();\r\n nameHex = ascii_to_hexa(params.ApprovedContacts[contact].Name).toUpperCase();\r\n nameLength = ('00' + decimalToHex(params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\r\n keyLength = ('00' + decimalToHex(5 + phoneNumber.length + params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\r\n value += keyLength + \"34\" + confTel + numberLength + numberHex + nameLength + nameHex + '00'; //no photo\r\n //value += keyLength + \"30\" + confTel + numberHex; //no photo \r\n counter++;\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 phoneNumber = params.ApprovedContacts[contact].Contact;\r\n if (phoneNumber.startsWith(\"+\")) {\r\n phoneNumber = \"00\" + phoneNumber.substring(1);\r\n }\r\n numberHex = ascii_to_hexa(phoneNumber).toUpperCase();\r\n numberLength = ('00' + decimalToHex(phoneNumber.length)).slice(-2).toUpperCase();\r\n nameHex = ascii_to_hexa(params.ApprovedContacts[contact].Name).toUpperCase();\r\n nameLength = ('00' + decimalToHex(params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\r\n keyLength = ('00' + decimalToHex(5 + phoneNumber.length + params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\r\n value += keyLength + \"34\" + confTel + numberLength + numberHex + nameLength + nameHex + '00'; //no photo\r\n //value += keyLength + \"30\" + confTel + numberHex; //no photo \r\n counter++;\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 += \"0534\" + confTel + '000000'; //no number, no name, no photo\r\n}\r\n// watch settings section\r\n// lenght and key\r\nvar messageBody = '1136';\r\n// step count/heart value display\r\n// Watch setting related FACE ID\r\nmessageBody += '00'; // Default FACE ID 0 \r\n// Future\r\n//if (params.WatchFace.SetWatchFace) {\r\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \r\n//} else {\r\n// messageBody += '00'; // Analog Face Default FACE ID 0 \r\n//}\r\n// Watch Display setting related to Step and heart rate settings\r\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\r\n messageBody += '081B0000'; //both displays\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n messageBody += (counter > 0) ? 'E' : '6';\r\n //messageBody += '6'; //menu 1 and 2 \r\n //messageBody += 'E'; //menu 1 and 2 and contact (menu 3) \r\n messageBody += '000000'; // other settings\r\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\r\n messageBody += '080B0000'; // step display\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n //messageBody += '4'; //menu 2 \r\n //messageBody += 'C'; // menu 2 and contact (menu 3) \r\n messageBody += (counter > 0) ? 'C' : '4';\r\n messageBody += '000000'; // other settings\r\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\r\n messageBody += '08130000'; // heart display\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n //messageBody += '2'; //menu 1 no contact (menu 3) \r\n //messageBody += 'A'; //menu 1 and contact (menu 3) \r\n messageBody += (counter > 0) ? 'A' : '2';\r\n messageBody += '000000'; // other settings\r\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\r\n messageBody += '08030000'; // no displays\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n //messageBody += '0000000'; // no menu , //08 only contact\r\n //messageBody += '8'; // //08 only contact\r\n messageBody += (counter > 0) ? '8' : '0';\r\n messageBody += '000000'; // other settings\r\n} else {\r\n messageBody += '08030000'; //no displays\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n messageBody += '0000000'; // no menu..\r\n}\r\n// from autohome page to the end\r\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\r\nvalue += messageBody; //add watchsetting hex to contact hex in value var \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}","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":12387,"Group":{"Id":7454,"Name":"SPO2 Settings","Json":{"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":"Enable Disable SPO2 Settings","Json":"{\"name\":\"Enable Disable SPO2 Settings\",\"default\":\"false\",\"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":{"Id":5819,"Protocol":{"Id":297,"Code":"Access TEC Care Watch","Version":"1.6","FirmwareVersion":"V06.8601.2501","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":true},"Name":"setAuthorisedNumbersAndWatchSettings","TemplateSMS":null,"Template":"<>","AckTemplate":null,"Operation":"// Combinated version setAuthorisedNumber with Watch Settings for EV06\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// AB 10 22 00 32 FA 00 00 02 11 36 00 00 00 00 00 00 00 00 00 14 00 00 00 00 0A 00 0E 34 80 09 31 32 33 34 35 36 37 38 39 00 00\r\n// [Length]:11 [Key]:36 [Value]:00 00 00 00 00 00 00 00 00 14 00 00 00 00 0A 00\r\n//{\"watch\":{\"status18\":0,\"status17\":0,\"status19\":0,\"status10\":0,\"flagValue\":0,\"status12\":0,\"faceId\":0,\"status11\":0,\"status14\":0,\"status13\":0,\"status16\":0,\"status15\":0,\"status0\":0,\"status1\":0,\"menu8\":0,\"menu7\":0,\"menu6\":0,\"menu5\":0,\"menu4\":0,\"menu3\":0,\"menu2\":0,\"menu1\":0,\"autoTime\":20,\"brightNess\":0,\"logoIndex\":0,\"status20\":0,\"status8\":0,\"status9\":0,\"status2\":0,\"status3\":0,\"brightTime\":10}}\r\n//[Length]:0E [Key]:34 [Value]:80 09 31 32 33 34 35 36 37 38 39 00 00\r\n//{\"numberNamePhoto\":{\"call\":0,\"noCard\":0,\"number\":\"123456789\",\"enable\":1,\"sms\":0,\"name\":\"\",\"headURL\":\"\",\"index\":0}}\r\n// para pruebas en local Contact':\r\n//AB 10 12 00 94 ED 00 00 02 10 34 E0 09 31 32 33 34 35 36 37 38 39 02 79 6F 00\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 phoneNumber = '';\r\nvar numberLength = '00';\r\nvar numberHex = '';\r\nvar nameLength = '00';\r\nvar nameHex = '';\r\nvar value = '02';\r\nvar keyLength = '00';\r\nvar confTel = '';\r\nvar count = 1; // approved contact will be from A2 to A9 - index 1 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\ncounter = 0; // to check how many contacts are in the lists\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 += \"0534\" + 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 phoneNumber = params.ApprovedContacts[contact].Contact;\r\n if (phoneNumber.startsWith(\"+\")) {\r\n phoneNumber = \"00\" + phoneNumber.substring(1);\r\n }\r\n numberHex = ascii_to_hexa(phoneNumber).toUpperCase();\r\n numberLength = ('00' + decimalToHex(phoneNumber.length)).slice(-2).toUpperCase();\r\n nameHex = ascii_to_hexa(params.ApprovedContacts[contact].Name).toUpperCase();\r\n nameLength = ('00' + decimalToHex(params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\r\n keyLength = ('00' + decimalToHex(5 + phoneNumber.length + params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\r\n value += keyLength + \"34\" + confTel + numberLength + numberHex + nameLength + nameHex + '00'; //no photo\r\n //value += keyLength + \"30\" + confTel + numberHex; //no photo \r\n counter++;\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 phoneNumber = params.ApprovedContacts[contact].Contact;\r\n if (phoneNumber.startsWith(\"+\")) {\r\n phoneNumber = \"00\" + phoneNumber.substring(1);\r\n }\r\n numberHex = ascii_to_hexa(phoneNumber).toUpperCase();\r\n numberLength = ('00' + decimalToHex(phoneNumber.length)).slice(-2).toUpperCase();\r\n nameHex = ascii_to_hexa(params.ApprovedContacts[contact].Name).toUpperCase();\r\n nameLength = ('00' + decimalToHex(params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\r\n keyLength = ('00' + decimalToHex(5 + phoneNumber.length + params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\r\n value += keyLength + \"34\" + confTel + numberLength + numberHex + nameLength + nameHex + '00'; //no photo\r\n //value += keyLength + \"30\" + confTel + numberHex; //no photo \r\n counter++;\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 += \"0534\" + confTel + '000000'; //no number, no name, no photo\r\n}\r\n// watch settings section\r\n// lenght and key\r\nvar messageBody = '1136';\r\n// step count/heart value display\r\n// Watch setting related FACE ID\r\nmessageBody += '00'; // Default FACE ID 0 \r\n// Future\r\n//if (params.WatchFace.SetWatchFace) {\r\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \r\n//} else {\r\n// messageBody += '00'; // Analog Face Default FACE ID 0 \r\n//}\r\n// Watch Display setting related to Step and heart rate settings\r\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\r\n messageBody += '081B0000'; //both displays\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n messageBody += (counter > 0) ? 'E' : '6';\r\n //messageBody += '6'; //menu 1 and 2 \r\n //messageBody += 'E'; //menu 1 and 2 and contact (menu 3) \r\n messageBody += '000000'; // other settings\r\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\r\n messageBody += '080B0000'; // step display\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n //messageBody += '4'; //menu 2 \r\n //messageBody += 'C'; // menu 2 and contact (menu 3) \r\n messageBody += (counter > 0) ? 'C' : '4';\r\n messageBody += '000000'; // other settings\r\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\r\n messageBody += '08130000'; // heart display\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n //messageBody += '2'; //menu 1 no contact (menu 3) \r\n //messageBody += 'A'; //menu 1 and contact (menu 3) \r\n messageBody += (counter > 0) ? 'A' : '2';\r\n messageBody += '000000'; // other settings\r\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\r\n messageBody += '08030000'; // no displays\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n //messageBody += '0000000'; // no menu , //08 only contact\r\n //messageBody += '8'; // //08 only contact\r\n messageBody += (counter > 0) ? '8' : '0';\r\n messageBody += '000000'; // other settings\r\n} else {\r\n messageBody += '08030000'; //no displays\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n messageBody += '0000000'; // no menu..\r\n}\r\n// from autohome page to the end\r\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\r\nvalue += messageBody; //add watchsetting hex to contact hex in value var \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}","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":12388,"Group":{"Id":7454,"Name":"SPO2 Settings","Json":{"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":"Reporting Frequency","Json":"{\"name\":\"Reporting Frequency\",\"default\":\"\",\"description\":null,\"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\":\"720\",\"label\":\"12 hours\"},{\"value\":\"360\",\"label\":\"6 hours\"},{\"value\":\"60\",\"label\":\"1 hour\"},{\"value\":\"30\",\"label\":\"30 min\"}],\"toTranslate\":[\"name\",\"description\",\"helpText\",\"label\"]}","Default":"","Command":{"Id":5819,"Protocol":{"Id":297,"Code":"Access TEC Care Watch","Version":"1.6","FirmwareVersion":"V06.8601.2501","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":true},"Name":"setAuthorisedNumbersAndWatchSettings","TemplateSMS":null,"Template":"<>","AckTemplate":null,"Operation":"// Combinated version setAuthorisedNumber with Watch Settings for EV06\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// AB 10 22 00 32 FA 00 00 02 11 36 00 00 00 00 00 00 00 00 00 14 00 00 00 00 0A 00 0E 34 80 09 31 32 33 34 35 36 37 38 39 00 00\r\n// [Length]:11 [Key]:36 [Value]:00 00 00 00 00 00 00 00 00 14 00 00 00 00 0A 00\r\n//{\"watch\":{\"status18\":0,\"status17\":0,\"status19\":0,\"status10\":0,\"flagValue\":0,\"status12\":0,\"faceId\":0,\"status11\":0,\"status14\":0,\"status13\":0,\"status16\":0,\"status15\":0,\"status0\":0,\"status1\":0,\"menu8\":0,\"menu7\":0,\"menu6\":0,\"menu5\":0,\"menu4\":0,\"menu3\":0,\"menu2\":0,\"menu1\":0,\"autoTime\":20,\"brightNess\":0,\"logoIndex\":0,\"status20\":0,\"status8\":0,\"status9\":0,\"status2\":0,\"status3\":0,\"brightTime\":10}}\r\n//[Length]:0E [Key]:34 [Value]:80 09 31 32 33 34 35 36 37 38 39 00 00\r\n//{\"numberNamePhoto\":{\"call\":0,\"noCard\":0,\"number\":\"123456789\",\"enable\":1,\"sms\":0,\"name\":\"\",\"headURL\":\"\",\"index\":0}}\r\n// para pruebas en local Contact':\r\n//AB 10 12 00 94 ED 00 00 02 10 34 E0 09 31 32 33 34 35 36 37 38 39 02 79 6F 00\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 phoneNumber = '';\r\nvar numberLength = '00';\r\nvar numberHex = '';\r\nvar nameLength = '00';\r\nvar nameHex = '';\r\nvar value = '02';\r\nvar keyLength = '00';\r\nvar confTel = '';\r\nvar count = 1; // approved contact will be from A2 to A9 - index 1 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\ncounter = 0; // to check how many contacts are in the lists\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 += \"0534\" + 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 phoneNumber = params.ApprovedContacts[contact].Contact;\r\n if (phoneNumber.startsWith(\"+\")) {\r\n phoneNumber = \"00\" + phoneNumber.substring(1);\r\n }\r\n numberHex = ascii_to_hexa(phoneNumber).toUpperCase();\r\n numberLength = ('00' + decimalToHex(phoneNumber.length)).slice(-2).toUpperCase();\r\n nameHex = ascii_to_hexa(params.ApprovedContacts[contact].Name).toUpperCase();\r\n nameLength = ('00' + decimalToHex(params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\r\n keyLength = ('00' + decimalToHex(5 + phoneNumber.length + params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\r\n value += keyLength + \"34\" + confTel + numberLength + numberHex + nameLength + nameHex + '00'; //no photo\r\n //value += keyLength + \"30\" + confTel + numberHex; //no photo \r\n counter++;\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 phoneNumber = params.ApprovedContacts[contact].Contact;\r\n if (phoneNumber.startsWith(\"+\")) {\r\n phoneNumber = \"00\" + phoneNumber.substring(1);\r\n }\r\n numberHex = ascii_to_hexa(phoneNumber).toUpperCase();\r\n numberLength = ('00' + decimalToHex(phoneNumber.length)).slice(-2).toUpperCase();\r\n nameHex = ascii_to_hexa(params.ApprovedContacts[contact].Name).toUpperCase();\r\n nameLength = ('00' + decimalToHex(params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\r\n keyLength = ('00' + decimalToHex(5 + phoneNumber.length + params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\r\n value += keyLength + \"34\" + confTel + numberLength + numberHex + nameLength + nameHex + '00'; //no photo\r\n //value += keyLength + \"30\" + confTel + numberHex; //no photo \r\n counter++;\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 += \"0534\" + confTel + '000000'; //no number, no name, no photo\r\n}\r\n// watch settings section\r\n// lenght and key\r\nvar messageBody = '1136';\r\n// step count/heart value display\r\n// Watch setting related FACE ID\r\nmessageBody += '00'; // Default FACE ID 0 \r\n// Future\r\n//if (params.WatchFace.SetWatchFace) {\r\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \r\n//} else {\r\n// messageBody += '00'; // Analog Face Default FACE ID 0 \r\n//}\r\n// Watch Display setting related to Step and heart rate settings\r\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\r\n messageBody += '081B0000'; //both displays\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n messageBody += (counter > 0) ? 'E' : '6';\r\n //messageBody += '6'; //menu 1 and 2 \r\n //messageBody += 'E'; //menu 1 and 2 and contact (menu 3) \r\n messageBody += '000000'; // other settings\r\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\r\n messageBody += '080B0000'; // step display\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n //messageBody += '4'; //menu 2 \r\n //messageBody += 'C'; // menu 2 and contact (menu 3) \r\n messageBody += (counter > 0) ? 'C' : '4';\r\n messageBody += '000000'; // other settings\r\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\r\n messageBody += '08130000'; // heart display\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n //messageBody += '2'; //menu 1 no contact (menu 3) \r\n //messageBody += 'A'; //menu 1 and contact (menu 3) \r\n messageBody += (counter > 0) ? 'A' : '2';\r\n messageBody += '000000'; // other settings\r\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\r\n messageBody += '08030000'; // no displays\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n //messageBody += '0000000'; // no menu , //08 only contact\r\n //messageBody += '8'; // //08 only contact\r\n messageBody += (counter > 0) ? '8' : '0';\r\n messageBody += '000000'; // other settings\r\n} else {\r\n messageBody += '08030000'; //no displays\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n messageBody += '0000000'; // no menu..\r\n}\r\n// from autohome page to the end\r\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\r\nvalue += messageBody; //add watchsetting hex to contact hex in value var \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}","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":12359,"Group":{"Id":7415,"Name":"Steps Settings","Json":{"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":"Enable Disable Steps Settings","Json":"{\"name\":\"Enable Disable Steps Settings\",\"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":{"Id":5819,"Protocol":{"Id":297,"Code":"Access TEC Care Watch","Version":"1.6","FirmwareVersion":"V06.8601.2501","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":true},"Name":"setAuthorisedNumbersAndWatchSettings","TemplateSMS":null,"Template":"<>","AckTemplate":null,"Operation":"// Combinated version setAuthorisedNumber with Watch Settings for EV06\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// AB 10 22 00 32 FA 00 00 02 11 36 00 00 00 00 00 00 00 00 00 14 00 00 00 00 0A 00 0E 34 80 09 31 32 33 34 35 36 37 38 39 00 00\r\n// [Length]:11 [Key]:36 [Value]:00 00 00 00 00 00 00 00 00 14 00 00 00 00 0A 00\r\n//{\"watch\":{\"status18\":0,\"status17\":0,\"status19\":0,\"status10\":0,\"flagValue\":0,\"status12\":0,\"faceId\":0,\"status11\":0,\"status14\":0,\"status13\":0,\"status16\":0,\"status15\":0,\"status0\":0,\"status1\":0,\"menu8\":0,\"menu7\":0,\"menu6\":0,\"menu5\":0,\"menu4\":0,\"menu3\":0,\"menu2\":0,\"menu1\":0,\"autoTime\":20,\"brightNess\":0,\"logoIndex\":0,\"status20\":0,\"status8\":0,\"status9\":0,\"status2\":0,\"status3\":0,\"brightTime\":10}}\r\n//[Length]:0E [Key]:34 [Value]:80 09 31 32 33 34 35 36 37 38 39 00 00\r\n//{\"numberNamePhoto\":{\"call\":0,\"noCard\":0,\"number\":\"123456789\",\"enable\":1,\"sms\":0,\"name\":\"\",\"headURL\":\"\",\"index\":0}}\r\n// para pruebas en local Contact':\r\n//AB 10 12 00 94 ED 00 00 02 10 34 E0 09 31 32 33 34 35 36 37 38 39 02 79 6F 00\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 phoneNumber = '';\r\nvar numberLength = '00';\r\nvar numberHex = '';\r\nvar nameLength = '00';\r\nvar nameHex = '';\r\nvar value = '02';\r\nvar keyLength = '00';\r\nvar confTel = '';\r\nvar count = 1; // approved contact will be from A2 to A9 - index 1 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\ncounter = 0; // to check how many contacts are in the lists\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 += \"0534\" + 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 phoneNumber = params.ApprovedContacts[contact].Contact;\r\n if (phoneNumber.startsWith(\"+\")) {\r\n phoneNumber = \"00\" + phoneNumber.substring(1);\r\n }\r\n numberHex = ascii_to_hexa(phoneNumber).toUpperCase();\r\n numberLength = ('00' + decimalToHex(phoneNumber.length)).slice(-2).toUpperCase();\r\n nameHex = ascii_to_hexa(params.ApprovedContacts[contact].Name).toUpperCase();\r\n nameLength = ('00' + decimalToHex(params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\r\n keyLength = ('00' + decimalToHex(5 + phoneNumber.length + params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\r\n value += keyLength + \"34\" + confTel + numberLength + numberHex + nameLength + nameHex + '00'; //no photo\r\n //value += keyLength + \"30\" + confTel + numberHex; //no photo \r\n counter++;\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 phoneNumber = params.ApprovedContacts[contact].Contact;\r\n if (phoneNumber.startsWith(\"+\")) {\r\n phoneNumber = \"00\" + phoneNumber.substring(1);\r\n }\r\n numberHex = ascii_to_hexa(phoneNumber).toUpperCase();\r\n numberLength = ('00' + decimalToHex(phoneNumber.length)).slice(-2).toUpperCase();\r\n nameHex = ascii_to_hexa(params.ApprovedContacts[contact].Name).toUpperCase();\r\n nameLength = ('00' + decimalToHex(params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\r\n keyLength = ('00' + decimalToHex(5 + phoneNumber.length + params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\r\n value += keyLength + \"34\" + confTel + numberLength + numberHex + nameLength + nameHex + '00'; //no photo\r\n //value += keyLength + \"30\" + confTel + numberHex; //no photo \r\n counter++;\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 += \"0534\" + confTel + '000000'; //no number, no name, no photo\r\n}\r\n// watch settings section\r\n// lenght and key\r\nvar messageBody = '1136';\r\n// step count/heart value display\r\n// Watch setting related FACE ID\r\nmessageBody += '00'; // Default FACE ID 0 \r\n// Future\r\n//if (params.WatchFace.SetWatchFace) {\r\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \r\n//} else {\r\n// messageBody += '00'; // Analog Face Default FACE ID 0 \r\n//}\r\n// Watch Display setting related to Step and heart rate settings\r\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\r\n messageBody += '081B0000'; //both displays\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n messageBody += (counter > 0) ? 'E' : '6';\r\n //messageBody += '6'; //menu 1 and 2 \r\n //messageBody += 'E'; //menu 1 and 2 and contact (menu 3) \r\n messageBody += '000000'; // other settings\r\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\r\n messageBody += '080B0000'; // step display\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n //messageBody += '4'; //menu 2 \r\n //messageBody += 'C'; // menu 2 and contact (menu 3) \r\n messageBody += (counter > 0) ? 'C' : '4';\r\n messageBody += '000000'; // other settings\r\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\r\n messageBody += '08130000'; // heart display\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n //messageBody += '2'; //menu 1 no contact (menu 3) \r\n //messageBody += 'A'; //menu 1 and contact (menu 3) \r\n messageBody += (counter > 0) ? 'A' : '2';\r\n messageBody += '000000'; // other settings\r\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\r\n messageBody += '08030000'; // no displays\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n //messageBody += '0000000'; // no menu , //08 only contact\r\n //messageBody += '8'; // //08 only contact\r\n messageBody += (counter > 0) ? '8' : '0';\r\n messageBody += '000000'; // other settings\r\n} else {\r\n messageBody += '08030000'; //no displays\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n messageBody += '0000000'; // no menu..\r\n}\r\n// from autohome page to the end\r\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\r\nvalue += messageBody; //add watchsetting hex to contact hex in value var \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}","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":"Command","Name":"actionFactoryReset","Message":"(Update) (actionFactoryReset) delete SMS Template and disable ACK","Timestamp":1748537885},{"Version":"0.2","UserName":"juanmi","Resource":"Command","Name":"actionFactoryReset","Message":"(Update) (actionFactoryReset) delete SMS template and disable ACK","Timestamp":1748537902},{"Version":"0.2","UserName":"juanmi","Resource":"Command","Name":"actionFactoryReset","Message":"(Update) (actionFactoryReset) delete SMS template and disable ACK","Timestamp":1748537937},{"Version":"0.2","UserName":"juanmi","Resource":"Command","Name":"actionFactoryReset","Message":"(Update) (actionFactoryReset) delete SMS template","Timestamp":1748538097},{"Version":"0.2","UserName":"juanmi","Resource":"Command","Name":"actionFactoryReset","Message":"(Update) (actionFactoryReset) disable ACK","Timestamp":1748538116},{"Version":"0.2","UserName":"Michael_Admin","Resource":"Command","Name":"actionFactoryReset","Message":"(Update) (actionFactoryReset) michael helping out ","Timestamp":1748547976},{"Version":"0.2","UserName":"juanmi","Resource":"Group","Name":"Approved Contacts","Message":"(Update) (Approved Contacts) Now we can have 8 approved contacts","Timestamp":1748619953},{"Version":"0.2","UserName":"juanmi","Resource":"MessageType","Name":"ACK-APN","Message":"(Update) (ACK-APN) test to save","Timestamp":1748619991},{"Version":"0.2","UserName":"juanmi","Resource":"Group","Name":"Approved Contacts","Message":"(Update) (Approved Contacts) Now we can add 8 approved contacts","Timestamp":1748622501},{"Version":"0.2","UserName":"juanmi","Resource":"Command","Name":"setEmergencySettings","Message":"(Update) (setEmergencySettings) Change Emergency contact to \"SOS Info\"","Timestamp":1748622805},{"Version":"0.2","UserName":"juanmi","Resource":"Command","Name":"actionFactoryReset","Message":"(Update) (actionFactoryReset) delete SMS template and disable ACK","Timestamp":1748623419},{"Version":"0.2","UserName":"juanmi","Resource":"Group","Name":"TeleHealth","Message":"(Create) (TeleHealth) Add Telehealth group","Timestamp":1748623706},{"Version":"0.2","UserName":"juanmi","Resource":"Group","Name":"TeleHealth Settings","Message":"(Update) (TeleHealth Settings) modify name","Timestamp":1748623754},{"Version":"0.2","UserName":"juanmi","Resource":"Group","Name":"TeleHealth Settings","Message":"(Update) (TeleHealth Settings) add description","Timestamp":1748623780},{"Version":"0.2","UserName":"juanmi","Resource":"Group","Name":"Read TeleHealth Settings","Message":"(Create) (Read TeleHealth Settings) New group Read TeleHealth Settings","Timestamp":1748623827},{"Version":"0.2","UserName":"juanmi","Resource":"GroupParam","Name":"Enable Disable Steps","Message":"(Create) (Enable Disable Steps) Read Enable/Disable Steps","Timestamp":1748624079},{"Version":"0.2","UserName":"juanmi","Resource":"GroupParam","Name":"Reporting Frequency","Message":"(Create) (Reporting Frequency) Read reporting frequency for Steps","Timestamp":1748624251},{"Version":"0.2","UserName":"juanmi","Resource":"Group","Name":"Read TeleHealth Settings","Message":"(Update) (Read TeleHealth Settings) add description","Timestamp":1748624307},{"Version":"0.2","UserName":"juanmi","Resource":"GroupParam","Name":"Enable Disable Steps","Message":"(Create) (Enable Disable Steps) Add Enable Disable Steps","Timestamp":1748624878},{"Version":"0.2","UserName":"juanmi","Resource":"Group","Name":"Read Steps Settings","Message":"(Create) (Read Steps Settings) Add group for steps","Timestamp":1748625010},{"Version":"0.2","UserName":"juanmi","Resource":"GroupParam","Name":"Enable Disable Read Steps Settings","Message":"(Create) (Enable Disable Read Steps Settings) add enable/disable read steps","Timestamp":1748625076},{"Version":"0.2","UserName":"juanmi","Resource":"GroupParam","Name":"Reporting Frequency","Message":"(Create) (Reporting Frequency) add read freq steps","Timestamp":1748625468},{"Version":"0.2","UserName":"juanmi","Resource":"Group","Name":"Read Heartrate Settings","Message":"(Create) (Read Heartrate Settings) add group Read heartrate","Timestamp":1748625569},{"Version":"0.2","UserName":"juanmi","Resource":"Group","Name":"Read Heartrate Settings","Message":"(Update) (Read Heartrate Settings) Reorder Groups","Timestamp":1748625577},{"Version":"0.2","UserName":"juanmi","Resource":"GroupParam","Name":"Enable Disable Read Heartrate Settings","Message":"(Create) (Enable Disable Read Heartrate Settings) Enable Disable Read Heartrate Settings","Timestamp":1748625605},{"Version":"0.2","UserName":"juanmi","Resource":"GroupParam","Name":"Reporting Frequency","Message":"(Create) (Reporting Frequency) Read freq heartrate","Timestamp":1748625683},{"Version":"0.2","UserName":"juanmi","Resource":"GroupParam","Name":"Reporting Frequency","Message":"(Create) (Reporting Frequency) add freq steps","Timestamp":1748625885},{"Version":"0.2","UserName":"juanmi","Resource":"Group","Name":"Steps Settings","Message":"(Create) (Steps Settings) add steps settings group","Timestamp":1748625950},{"Version":"0.2","UserName":"juanmi","Resource":"Group","Name":"Heartrate Settings","Message":"(Create) (Heartrate Settings) add heartrate settings","Timestamp":1748625984},{"Version":"0.2","UserName":"juanmi","Resource":"GroupParam","Name":"Enable Disable Steps Settings","Message":"(Create) (Enable Disable Steps Settings) add enable disable steps settings","Timestamp":1748626017},{"Version":"0.2","UserName":"juanmi","Resource":"GroupParam","Name":"Reporting Frequency","Message":"(Create) (Reporting Frequency) add freq steps","Timestamp":1748626066},{"Version":"0.2","UserName":"juanmi","Resource":"GroupParam","Name":"Enable Disable Heartrate Settings","Message":"(Create) (Enable Disable Heartrate Settings) add enable disable HR settings","Timestamp":1748626090},{"Version":"0.2","UserName":"juanmi","Resource":"GroupParam","Name":"Reporting Frequency","Message":"(Create) (Reporting Frequency) add freq HR","Timestamp":1748626142},{"Version":"0.2","UserName":"oysta@superadmin.com","Resource":"Command","Name":"getCurrentSettings2","Message":"(Update) (getCurrentSettings2) set parent as getcurrentsetting","Timestamp":1748863939},{"Version":"0.2","UserName":"oysta@superadmin.com","Resource":"Command","Name":"getCurrentSettings3","Message":"(Update) (getCurrentSettings3) set parent as getcurrentsetting","Timestamp":1748863952},{"Version":"0.2","UserName":"oysta@superadmin.com","Resource":"Command","Name":"getCurrentSettings4","Message":"(Update) (getCurrentSettings4) set parent as getcurrentsetting","Timestamp":1748863968},{"Version":"0.2","UserName":"oysta@superadmin.com","Resource":"Command","Name":"getCurrentSettings5","Message":"(Update) (getCurrentSettings5) set parent as getcurrentsetting","Timestamp":1748863982},{"Version":"0.2","UserName":"juanmi","Resource":"Command","Name":"setEmergencySettings","Message":"(Update) (setEmergencySettings) change name contact to \"SOS\"","Timestamp":1748938524},{"Version":"0.2","UserName":"juanmi","Resource":"Operation","Name":"Access TEC Care Watch","Message":"(Update) (Access TEC Care Watch) Minor change to check customID in case=\"24\"","Timestamp":1748968518},{"Version":"0.2","UserName":"juanmi","Resource":"Command","Name":"setHeartRateDetectingInterval","Message":"(Update) (setHeartRateDetectingInterval) Modify params name and fix some bugs","Timestamp":1748971251},{"Version":"0.2","UserName":"juanmi","Resource":"GroupParam","Name":"Enable Disable Heartrate Settings","Message":"(Update) (Enable Disable Heartrate Settings) assign command\n","Timestamp":1748971292},{"Version":"0.2","UserName":"juanmi","Resource":"GroupParam","Name":"Enable Disable Heartrate Settings","Message":"Associate groupParam Enable Disable Heartrate Settings to command setHeartRateDetectingInterval","Timestamp":1748971295},{"Version":"0.2","UserName":"juanmi","Resource":"GroupParam","Name":"Reporting Frequency","Message":"(Update) (Reporting Frequency) assign command and change values","Timestamp":1748971385},{"Version":"0.2","UserName":"juanmi","Resource":"GroupParam","Name":"Reporting Frequency","Message":"Associate groupParam Reporting Frequency to command setHeartRateDetectingInterval","Timestamp":1748971389},{"Version":"0.2","UserName":"juanmi","Resource":"Group","Name":"Read Heartrate Settings","Message":"(Update) (Read Heartrate Settings) Reorder Groups","Timestamp":1748971793},{"Version":"0.2","UserName":"juanmi","Resource":"Group","Name":"Read Steps Settings","Message":"(Update) (Read Steps Settings) Reorder Groups","Timestamp":1748971795},{"Version":"0.2","UserName":"juanmi","Resource":"GroupParam","Name":"Reporting Frequency","Message":"(Update) (Reporting Frequency) change values","Timestamp":1748971849},{"Version":"0.2","UserName":"juanmi","Resource":"GroupParam","Name":"Reporting Frequency","Message":"(Update) (Reporting Frequency) change values","Timestamp":1748971997},{"Version":"0.2","UserName":"juanmi","Resource":"Group","Name":"Steps Settings","Message":"(Update) (Steps Settings) Reorder Groups","Timestamp":1748972021},{"Version":"0.2","UserName":"juanmi","Resource":"GroupParam","Name":"Reporting Frequency","Message":"(Update) (Reporting Frequency) change values","Timestamp":1748972076},{"Version":"0.2","UserName":"juanmi","Resource":"Command","Name":"setStepCollectSettings","Message":"(Update) (setStepCollectSettings) Change params names and modify values","Timestamp":1748972510},{"Version":"0.2","UserName":"juanmi","Resource":"GroupParam","Name":"Enable Disable Steps Settings","Message":"(Update) (Enable Disable Steps Settings) assign command","Timestamp":1748972551},{"Version":"0.2","UserName":"juanmi","Resource":"GroupParam","Name":"Enable Disable Steps Settings","Message":"Associate groupParam Enable Disable Steps Settings to command setStepCollectSettings","Timestamp":1748972555},{"Version":"0.2","UserName":"juanmi","Resource":"GroupParam","Name":"Reporting Frequency","Message":"(Update) (Reporting Frequency) assign command","Timestamp":1748972586},{"Version":"0.2","UserName":"juanmi","Resource":"GroupParam","Name":"Reporting Frequency","Message":"Associate groupParam Reporting Frequency to command setStepCollectSettings","Timestamp":1748972589},{"Version":"0.2","UserName":"juanmi","Resource":"Command","Name":"setWatchSettings","Message":"(Create) (setWatchSettings) new command to set watch Face and HR and step function","Timestamp":1748973730},{"Version":"0.2","UserName":"juanmi","Resource":"GroupParam","Name":"Reporting Frequency","Message":"(Update) (Reporting Frequency) change values","Timestamp":1748974585},{"Version":"0.2","UserName":"juanmi","Resource":"Protocol","Name":null,"Message":"Small changes to version 1 and adding HRT and STEP function","Timestamp":1748974840},{"Version":"0.3","UserName":"juanmi","Resource":"MessageType","Name":"CON-ASSO","Message":"(Update) (CON-ASSO) change type to CON","Timestamp":1749036744},{"Version":"0.3","UserName":"juanmi","Resource":"GroupParam","Name":"Reporting Frequency","Message":"(Update) (Reporting Frequency) Hide param until new firmware version","Timestamp":1749052743},{"Version":"0.3","UserName":"juanmi","Resource":"GroupParam","Name":"Reporting Frequency","Message":"(Update) (Reporting Frequency) hide and unassign until new firmware","Timestamp":1749052795},{"Version":"0.3","UserName":"juanmi","Resource":"GroupParam","Name":"Reporting Frequency","Message":"Dissociate groupParam Reporting Frequency from command setStepCollectSettings","Timestamp":1749052799},{"Version":"0.3","UserName":"juanmi","Resource":"Operation","Name":"Access TEC Care Watch","Message":"(Update) (Access TEC Care Watch) create long connection it it is needed for command 01 and 03","Timestamp":1749057260},{"Version":"0.3","UserName":"juanmi","Resource":"Command","Name":"setStepCollectSettings","Message":"(Update) (setStepCollectSettings) multiply reporting time *60; //in seconds","Timestamp":1749057591},{"Version":"0.3","UserName":"juanmi","Resource":"Command","Name":"setHeartRateDetectingInterval","Message":"(Update) (setHeartRateDetectingInterval) multiply *60; reporting interval //in seconds","Timestamp":1749057629},{"Version":"0.3","UserName":"juanmi","Resource":"GroupParam","Name":"Reporting Frequency","Message":"(Update) (Reporting Frequency) add 30 minutes","Timestamp":1749057954},{"Version":"0.3","UserName":"juanmi","Resource":"Command","Name":"setEnableStep","Message":"(Create) (setEnableStep) new command for step enable","Timestamp":1749059198},{"Version":"0.3","UserName":"juanmi","Resource":"Operation","Name":"Access TEC Care Watch","Message":"(Update) (Access TEC Care Watch) comment //return to create long connection","Timestamp":1749108422},{"Version":"0.3","UserName":"juanmi","Resource":"Command","Name":"actionFactoryReset","Message":"(Update) (actionFactoryReset) add SMS command version","Timestamp":1749193448},{"Version":"0.3","UserName":"juanmi","Resource":"Command","Name":"actionFactoryReset","Message":"(Update) (actionFactoryReset) enable ACK and force by SMS","Timestamp":1749211988},{"Version":"0.3","UserName":"Michael_Admin","Resource":"GroupParam","Name":"Factory Reset","Message":"(Update) (Factory Reset) Michael taking off only via sms help text now we have SMS and is the default ","Timestamp":1749472684},{"Version":"0.3","UserName":"juanmi","Resource":"GroupParam","Name":"Enable Disable Steps Settings","Message":"(Update) (Enable Disable Steps Settings) change command to enable/disable Step","Timestamp":1749574292},{"Version":"0.3","UserName":"juanmi","Resource":"GroupParam","Name":"Enable Disable Steps Settings","Message":"Associate groupParam Enable Disable Steps Settings to command setEnableStep","Timestamp":1749574296},{"Version":"0.3","UserName":"juanmi","Resource":"GroupParam","Name":"Enable Disable Steps Settings","Message":"Dissociate groupParam Enable Disable Steps Settings from command setStepCollectSettings","Timestamp":1749574299},{"Version":"0.3","UserName":"juanmi","Resource":"GroupParam","Name":"Enable Disable Heartrate Settings","Message":"(Update) (Enable Disable Heartrate Settings) add setWatchSetting command to change display","Timestamp":1749574458},{"Version":"0.3","UserName":"juanmi","Resource":"GroupParam","Name":"Enable Disable Heartrate Settings","Message":"Associate groupParam Enable Disable Heartrate Settings to command setWatchSettings","Timestamp":1749574461},{"Version":"0.3","UserName":"juanmi","Resource":"GroupParam","Name":"Enable Disable Steps Settings","Message":"(Update) (Enable Disable Steps Settings) add setWatchSetting command to change display","Timestamp":1749574476},{"Version":"0.3","UserName":"juanmi","Resource":"GroupParam","Name":"Enable Disable Steps Settings","Message":"Associate groupParam Enable Disable Steps Settings to command setWatchSettings","Timestamp":1749574479},{"Version":"0.3","UserName":"juanmi","Resource":"Command","Name":"setWatchSettings","Message":"(Update) (setWatchSettings) modify params' names","Timestamp":1749574591},{"Version":"0.3","UserName":"juanmi","Resource":"Command","Name":"setWatchSettings","Message":"(Update) (setWatchSettings) disable SMS version","Timestamp":1749575829},{"Version":"0.3","UserName":"juanmi","Resource":"Command","Name":"setWatchSettings","Message":"(Update) (setWatchSettings) change settings to follow ticket definition","Timestamp":1749576611},{"Version":"0.3","UserName":"juanmi","Resource":"Command","Name":"getCurrentSettings","Message":"(Update) (getCurrentSettings) add step and HRate settings","Timestamp":1749577720},{"Version":"0.3","UserName":"juanmi","Resource":"Operation","Name":"Access TEC Care Watch","Message":"(Update) (Access TEC Care Watch) add Get HeartRate","Timestamp":1749579157},{"Version":"0.3","UserName":"juanmi","Resource":"Operation","Name":"Access TEC Care Watch","Message":"(Update) (Access TEC Care Watch) detecting interval Hrate to minutes","Timestamp":1749579352},{"Version":"0.3","UserName":"juanmi","Resource":"Operation","Name":"Access TEC Care Watch","Message":"(Update) (Access TEC Care Watch) add get Step Settings Status","Timestamp":1749580364},{"Version":"0.3","UserName":"juanmi","Resource":"Protocol","Name":null,"Message":"Add Heartrate and Steps","Timestamp":1749580597},{"Version":"0.4","UserName":"juanmi","Resource":"GroupParam","Name":"Reporting Frequency","Message":"(Delete) (Reporting Frequency)","Timestamp":1749655876},{"Version":"0.4","UserName":"juanmi","Resource":"GroupParam","Name":"Enable Disable Steps","Message":"(Delete) (Enable Disable Steps)","Timestamp":1749655895},{"Version":"0.4","UserName":"juanmi","Resource":"GroupParam","Name":"Enable Disable Steps","Message":"(Delete) (Enable Disable Steps)","Timestamp":1749656285},{"Version":"0.4","UserName":"juanmi","Resource":"GroupParam","Name":"Reporting Frequency","Message":"(Delete) (Reporting Frequency)","Timestamp":1749656300},{"Version":"0.4","UserName":"juanmi","Resource":"Protocol","Name":null,"Message":"Removed duplicated params from groups (Steps and Hrate)","Timestamp":1749656455},{"Version":"0.5","UserName":"juanmi","Resource":"Group","Name":"TeleHealth Settings","Message":"(Update) (TeleHealth Settings) Modify description of the group","Timestamp":1749657024},{"Version":"0.5","UserName":"juanmi","Resource":"Protocol","Name":null,"Message":"(TeleHealth Settings) Modify description of the group","Timestamp":1749657173},{"Version":"0.6","UserName":"Michael_Admin","Resource":"GroupParam","Name":"Find Device","Message":"(Update) (Find Device) Reorder Group Params","Timestamp":1750165349},{"Version":"0.6","UserName":"Michael_Admin","Resource":"GroupParam","Name":"Power Off","Message":"(Update) (Power Off) Reorder Group Params","Timestamp":1750165353},{"Version":"0.6","UserName":"Michael_Admin","Resource":"GroupParam","Name":"Reboot","Message":"(Update) (Reboot) Reorder Group Params","Timestamp":1750165357},{"Version":"0.6","UserName":"Michael_Admin","Resource":"GroupParam","Name":"Firmware Upgrade","Message":"(Update) (Firmware Upgrade) Reorder Group Params","Timestamp":1750165361},{"Version":"0.6","UserName":"Michael_Admin","Resource":"GroupParam","Name":"Factory Reset","Message":"(Update) (Factory Reset) Reorder Group Params","Timestamp":1750165365},{"Version":"0.6","UserName":"Michael_Admin","Resource":"GroupParam","Name":"Get Alert Settings","Message":"(Update) (Get Alert Settings) Reorder Group Params","Timestamp":1750165370},{"Version":"0.6","UserName":"Michael_Admin","Resource":"GroupParam","Name":"Get Firmware Version","Message":"(Update) (Get Firmware Version) Reorder Group Params","Timestamp":1750165375},{"Version":"0.6","UserName":"Michael_Admin","Resource":"GroupParam","Name":"Get Language / Performance","Message":"(Update) (Get Language / Performance) Reorder Group Params","Timestamp":1750165379},{"Version":"0.6","UserName":"juanmi","Resource":"GroupParam","Name":"SystemLanguage","Message":"(Update) (SystemLanguage) ticket: 1709297 EV06: Language support","Timestamp":1750272360},{"Version":"0.6","UserName":"Michael_Admin","Resource":"GroupParam","Name":"SystemLanguage","Message":"(Update) (SystemLanguage) removed Polish and German is eview confirm no support ","Timestamp":1750348556},{"Version":"0.6","UserName":"juanmi","Resource":"GroupParam","Name":"Enable Disable Non Movement Settings","Message":"(Update) (Enable Disable Non Movement Settings) hide until feature is implemented by Eview","Timestamp":1750696525},{"Version":"0.6","UserName":"juanmi","Resource":"GroupParam","Name":"Time","Message":"(Update) (Time) hide until feature is implemented by Eview","Timestamp":1750696539},{"Version":"0.6","UserName":"juanmi","Resource":"GroupParam","Name":"Enable Disable Non Movement Settings","Message":"(Update) (Enable Disable Non Movement Settings) hide until feature is implemented by Eview","Timestamp":1750696557},{"Version":"0.6","UserName":"juanmi","Resource":"GroupParam","Name":"Time","Message":"(Update) (Time) hide until feature is implemented by Eview","Timestamp":1750696570},{"Version":"0.6","UserName":"juanmi","Resource":"Operation","Name":"Access TEC Care Watch","Message":"(Update) (Access TEC Care Watch) customID can be \"3036\" or \"06\"","Timestamp":1750698902},{"Version":"0.6","UserName":"juanmi","Resource":"Protocol","Name":null,"Message":"customID can be \"3036\" or \"06\". Hide \"no motion alarm\", define new languages","Timestamp":1750700358},{"Version":"0.7","UserName":"juanmi","Resource":"GroupParam","Name":"Enable Disable Non Movement Settings","Message":"(Delete) (Enable Disable Non Movement Settings)","Timestamp":1751039678},{"Version":"0.7","UserName":"juanmi","Resource":"GroupParam","Name":"Time","Message":"(Delete) (Time)","Timestamp":1751039709},{"Version":"0.7","UserName":"juanmi","Resource":"Group","Name":"Read Non Movement Settings","Message":"(Delete) (Read Non Movement Settings)","Timestamp":1751039724},{"Version":"0.7","UserName":"juanmi","Resource":"GroupParam","Name":"Enable Disable Non Movement Settings","Message":"(Delete) (Enable Disable Non Movement Settings)","Timestamp":1751039756},{"Version":"0.7","UserName":"juanmi","Resource":"GroupParam","Name":"Time","Message":"(Delete) (Time)","Timestamp":1751039803},{"Version":"0.7","UserName":"juanmi","Resource":"Group","Name":"Non Movement Settings","Message":"(Delete) (Non Movement Settings)","Timestamp":1751039819},{"Version":"0.7","UserName":"juanmi","Resource":"Command","Name":"setWatchSettings","Message":"(Update) (setWatchSettings) no contact (menu 3) ticket 1735474","Timestamp":1751040656},{"Version":"0.7","UserName":"juanmi","Resource":"Protocol","Name":null,"Message":"Delete \"Non movement settings\" and hide Contacts Menu in watch screen","Timestamp":1751098416},{"Version":"0.8","UserName":"juanmi","Resource":"Operation","Name":"Access TEC Care Watch","Message":"(Update) (Access TEC Care Watch) ticket 1737797: fix get current config, commented \"no motion alert\"","Timestamp":1751358168},{"Version":"0.8","UserName":"juanmi","Resource":"Protocol","Name":null,"Message":" ticket 1737797: fix get current config, commented \"no motion alert\"","Timestamp":1751358450},{"Version":"0.9","UserName":"juanmi","Resource":"GroupParam","Name":"SystemLanguage","Message":"(Update) (SystemLanguage) Define new labels and values for languages","Timestamp":1751442394},{"Version":"0.9","UserName":"juanmi","Resource":"Protocol","Name":null,"Message":"Add new languages for voice","Timestamp":1751443647},{"Version":"1.0","UserName":"Sean-Admin","Resource":"Operation","Name":"Access TEC Care Watch","Message":"(Update) (Access TEC Care Watch) move allowedCID initialisation","Timestamp":1751886283},{"Version":"1.0","UserName":"Sean-Admin","Resource":"Protocol","Name":null,"Message":"Deploy allowedCID fix","Timestamp":1751886339},{"Version":"1.1","UserName":"juanmi","Resource":"Command","Name":"setEmergencySettings","Message":"(Update) (setEmergencySettings) ticket 1765817: change \"+\" by \"00\" in international number","Timestamp":1752596355},{"Version":"1.1","UserName":"juanmi","Resource":"Command","Name":"setAuthorisedNumbers","Message":"(Update) (setAuthorisedNumbers) ticket 1765817: match number with country code","Timestamp":1752596927},{"Version":"1.1","UserName":"juanmi","Resource":"Command","Name":"setAuthorisedNumbers","Message":"(Update) (setAuthorisedNumbers) ticket 1765817: fix phoneNumber lenght","Timestamp":1752597287},{"Version":"1.1","UserName":"juanmi","Resource":"Operation","Name":"Access TEC Care Watch","Message":"(Update) (Access TEC Care Watch) ticket 1796516: include location data in alarm msg","Timestamp":1754555071},{"Version":"1.1","UserName":"juanmi","Resource":"MessageType","Name":"ALA-F","Message":"(Create) (ALA-F) define Msg Type ALA-F Alarm finished","Timestamp":1758220159},{"Version":"1.1","UserName":"juanmi","Resource":"MessageType","Name":"ALA-F","Message":"(Update) (ALA-F) define as Warning","Timestamp":1758220240},{"Version":"1.1","UserName":"juanmi","Resource":"MessageType","Name":"ALA-TLT","Message":"(Create) (ALA-TLT) define msg type ALA Tilt","Timestamp":1758220352},{"Version":"1.1","UserName":"juanmi","Resource":"Operation","Name":"Access TEC Care Watch","Message":"(Update) (Access TEC Care Watch) Pull Request 393658: Ticket 1822799: AGPS bug location time and 1823723: Split msg and 1796516: In...","Timestamp":1758223135},{"Version":"1.1","UserName":"juanmi","Resource":"Protocol","Name":null,"Message":"Ticket 1822799: AGPS bug location time and 1823723: Split msg and 1796516: In...","Timestamp":1758223695},{"Version":"1.2","UserName":"Sean-Admin","Resource":"Operation","Name":"Access TEC Care Watch","Message":"(Update) (Access TEC Care Watch) fix hex_to_ascii","Timestamp":1758638721},{"Version":"1.2","UserName":"Sean-Admin","Resource":"Protocol","Name":null,"Message":"get config fix","Timestamp":1758639147},{"Version":"1.3","UserName":"juanmi","Resource":"Operation","Name":"Access TEC Care Watch","Message":"(Update) (Access TEC Care Watch) Ticket 1875500: Add GPS Location on SOS Alarm msg","Timestamp":1762887514},{"Version":"1.3","UserName":"juanmi","Resource":"Protocol","Name":null,"Message":"Ticket 1875500: Add GPS Location on SOS Alarm msg","Timestamp":1762890211},{"Version":"1.4","UserName":"juanmi","Resource":"Command","Name":"setSPOInterval","Message":"(Create) (setSPOInterval) create command to setSPOInterval","Timestamp":1762892227},{"Version":"1.4","UserName":"juanmi","Resource":"Group","Name":"SPO2 Settings","Message":"(Create) (SPO2 Settings) create group for SPO2 Settings","Timestamp":1762892832},{"Version":"1.4","UserName":"juanmi","Resource":"GroupParam","Name":"Enable Disable SPO2 Settings","Message":"(Create) (Enable Disable SPO2 Settings) Add Enable Disable SPO Settings","Timestamp":1762892924},{"Version":"1.4","UserName":"juanmi","Resource":"GroupParam","Name":"Enable Disable SPO2 Settings","Message":"Associate groupParam Enable Disable SPO2 Settings to command setSPOInterval","Timestamp":1762892927},{"Version":"1.4","UserName":"juanmi","Resource":"GroupParam","Name":"Enable Disable SPO2 Settings","Message":"Associate groupParam Enable Disable SPO2 Settings to command setWatchSettings","Timestamp":1762892929},{"Version":"1.4","UserName":"juanmi","Resource":"GroupParam","Name":"Reporting Frequency","Message":"(Create) (Reporting Frequency) Add Reporting Frequency param","Timestamp":1762893055},{"Version":"1.4","UserName":"juanmi","Resource":"GroupParam","Name":"Reporting Frequency","Message":"Associate groupParam Reporting Frequency to command setSPOInterval","Timestamp":1762893058},{"Version":"1.4","UserName":"juanmi","Resource":"Command","Name":"setSPOInterval","Message":"(Update) (setSPOInterval) modify command to set SPO2","Timestamp":1762893497},{"Version":"1.4","UserName":"juanmi","Resource":"Group","Name":"Read SPO2 Settings","Message":"(Create) (Read SPO2 Settings) Create group Read SPO2 Settings","Timestamp":1763059210},{"Version":"1.4","UserName":"juanmi","Resource":"GroupParam","Name":"Enable Disable Read SPO2 Settings","Message":"(Create) (Enable Disable Read SPO2 Settings) Enable Disable Read SPO2 Settings","Timestamp":1763059280},{"Version":"1.4","UserName":"juanmi","Resource":"GroupParam","Name":"Reporting Frequency","Message":"(Create) (Reporting Frequency) Reporting Frequency for Read SPO2 Settings","Timestamp":1763059374},{"Version":"1.4","UserName":"juanmi","Resource":"GroupParam","Name":"Reporting Frequency","Message":"(Update) (Reporting Frequency) modify value","Timestamp":1763059448},{"Version":"1.4","UserName":"juanmi","Resource":"Command","Name":"setWatchSettings","Message":"(Update) (setWatchSettings) add enable//disable menu for SPO2","Timestamp":1763060987},{"Version":"1.4","UserName":"juanmi","Resource":"Command","Name":"setWatchSettings","Message":"(Update) (setWatchSettings) fix small typo","Timestamp":1763107860},{"Version":"1.4","UserName":"juanmi","Resource":"Command","Name":"setWatchSettings","Message":"(Update) (setWatchSettings) small typo error","Timestamp":1763108274},{"Version":"1.4","UserName":"juanmi","Resource":"Command","Name":"setEnableStep","Message":"(Update) (setEnableStep) ticket 1946312","Timestamp":1763456936},{"Version":"1.4","UserName":"juanmi","Resource":"Protocol","Name":null,"Message":"ticket 1946312: Set Steps switches ON TCP Fast and half ticket 1913728:\nadd command and settings for SPO2","Timestamp":1763457055},{"Version":"1.5","UserName":"juanmi","Resource":"MessageType","Name":"HBP","Message":"(Create) (HBP) Create Msg Type for SPO2 data","Timestamp":1763492881},{"Version":"1.5","UserName":"juanmi","Resource":"MessageType","Name":"HBP","Message":"(Update) (HBP) change name","Timestamp":1763493293},{"Version":"1.5","UserName":"juanmi","Resource":"Operation","Name":"Access TEC Care Watch","Message":"(Update) (Access TEC Care Watch) Add parsering SPO2 data received from the device","Timestamp":1763493459},{"Version":"1.5","UserName":"juanmi","Resource":"MessageType","Name":"SPO2","Message":"(Update) (SPO2) change msg code to SPO2","Timestamp":1763494978},{"Version":"1.5","UserName":"juanmi","Resource":"MessageType","Name":"SPO2","Message":"(Update) (SPO2) add trust level","Timestamp":1763495262},{"Version":"1.5","UserName":"juanmi","Resource":"Operation","Name":"Access TEC Care Watch","Message":"(Update) (Access TEC Care Watch) add trust level on SPO2 data","Timestamp":1763495297},{"Version":"1.5","UserName":"juanmi","Resource":"Command","Name":"getCurrentSettings","Message":"(Update) (getCurrentSettings) Add Read SPO2 interval","Timestamp":1763495958},{"Version":"1.5","UserName":"juanmi","Resource":"Operation","Name":"Access TEC Care Watch","Message":"(Update) (Access TEC Care Watch) add parsering Read SPO2 settings from the device","Timestamp":1763496553},{"Version":"1.5","UserName":"juanmi","Resource":"Protocol","Name":null,"Message":"ticket 1913728:\nshow SPO2 values on Events and read settings for SPO2","Timestamp":1763557322},{"Version":"1.6","UserName":"juanmi","Resource":"Command","Name":"setWatchSettings","Message":"(Update) (setWatchSettings) enable always contact menu","Timestamp":1764099175},{"Version":"1.6","UserName":"juanmi","Resource":"Command","Name":"setWatchSettings","Message":"(Update) (setWatchSettings) Consulting the quantity of contacts in the whitelist to enable disable the contact menu","Timestamp":1764100032},{"Version":"1.6","UserName":"juanmi","Resource":"GroupParam","Name":"Contact","Message":"(Update) (Contact) Add setWatchSettings to enable//disable contact menu","Timestamp":1764100128},{"Version":"1.6","UserName":"juanmi","Resource":"GroupParam","Name":"Contact","Message":"Associate groupParam Contact to command setWatchSettings","Timestamp":1764100131},{"Version":"1.6","UserName":"juanmi","Resource":"Command","Name":"setWatchSettings","Message":"(Update) (setWatchSettings) obtain quantity with params.ApprovedContacts.length","Timestamp":1764100744},{"Version":"1.6","UserName":"juanmi","Resource":"Command","Name":"setWatchSettings","Message":"(Update) (setWatchSettings) fix counter > 0","Timestamp":1764101454},{"Version":"1.6","UserName":"juanmi","Resource":"GroupParam","Name":"Contact","Message":"(Update) (Contact) unselect setWatchSettings","Timestamp":1764101901},{"Version":"1.6","UserName":"juanmi","Resource":"GroupParam","Name":"Contact","Message":"Dissociate groupParam Contact from command setWatchSettings","Timestamp":1764101904},{"Version":"1.6","UserName":"juanmi","Resource":"GroupParam","Name":"Contact","Message":"(Update) (Contact) Associate command setWatchSettings to enable Contact Menu on watch screen","Timestamp":1764837345},{"Version":"1.6","UserName":"juanmi","Resource":"GroupParam","Name":"Contact","Message":"Associate groupParam Contact to command setWatchSettings","Timestamp":1764837349},{"Version":"1.6","UserName":"juanmi","Resource":"Command","Name":"setWatchSettings","Message":"(Update) (setWatchSettings) provide idToUpdate in the script","Timestamp":1764837636},{"Version":"1.6","UserName":"juanmi","Resource":"Command","Name":"setWatchSettings","Message":"(Update) (setWatchSettings) var notSend = false;","Timestamp":1764837717},{"Version":"1.6","UserName":"juanmi","Resource":"Command","Name":"setWatchSettings","Message":"(Update) (setWatchSettings) check if a number was deleted, and remove it from the list","Timestamp":1764838121},{"Version":"1.6","UserName":"juanmi","Resource":"Command","Name":"setWatchSettings","Message":"(Update) (setWatchSettings) remove changes","Timestamp":1764838305},{"Version":"1.6","UserName":"juanmi","Resource":"GroupParam","Name":"Contact","Message":"(Update) (Contact) unassing setWatchSettings","Timestamp":1764838452},{"Version":"1.6","UserName":"juanmi","Resource":"GroupParam","Name":"Contact","Message":"Dissociate groupParam Contact from command setWatchSettings","Timestamp":1764838456},{"Version":"1.6","UserName":"juanmi","Resource":"GroupParam","Name":"Reporting Frequency","Message":"(Update) (Reporting Frequency) add setwatchsettings","Timestamp":1764839109},{"Version":"1.6","UserName":"juanmi","Resource":"GroupParam","Name":"Reporting Frequency","Message":"Associate groupParam Reporting Frequency to command setWatchSettings","Timestamp":1764839113},{"Version":"1.6","UserName":"juanmi","Resource":"GroupParam","Name":"Reporting Frequency","Message":"(Update) (Reporting Frequency) add setwatchsettings","Timestamp":1764839130},{"Version":"1.6","UserName":"juanmi","Resource":"GroupParam","Name":"Reporting Frequency","Message":"Associate groupParam Reporting Frequency to command setWatchSettings","Timestamp":1764839134},{"Version":"1.6","UserName":"juanmi","Resource":"Command","Name":"setWatchSettings","Message":"(Update) (setWatchSettings) small fix","Timestamp":1764839274},{"Version":"1.6","UserName":"juanmi","Resource":"Command","Name":"setWatchSettings","Message":"(Update) (setWatchSettings) count the number or approved contacts","Timestamp":1764840000},{"Version":"1.6","UserName":"juanmi","Resource":"Command","Name":"setWatchSettings","Message":"(Update) (setWatchSettings) small fix","Timestamp":1764840561},{"Version":"1.6","UserName":"juanmi","Resource":"Command","Name":"setWatchSettings","Message":"(Update) (setWatchSettings) test","Timestamp":1764840793},{"Version":"1.6","UserName":"juanmi","Resource":"Command","Name":"setWatchSettings","Message":"(Update) (setWatchSettings) test","Timestamp":1764841065},{"Version":"1.6","UserName":"juanmi","Resource":"Command","Name":"setWatchSettings","Message":"(Update) (setWatchSettings) Count number of approved contacts","Timestamp":1764842271},{"Version":"1.6","UserName":"juanmi","Resource":"Command","Name":"setWatchSettings","Message":"(Update) (setWatchSettings) test","Timestamp":1764842718},{"Version":"1.6","UserName":"juanmi","Resource":"Command","Name":"setAuthorisedNumbersAndWatchSettings","Message":"(Create) (setAuthorisedNumbersAndWatchSettings) create setAuthorisedNumbersAndWatchSettings","Timestamp":1765217764},{"Version":"1.6","UserName":"juanmi","Resource":"Command","Name":"setWatchSettings","Message":"(Update) (setWatchSettings) small test","Timestamp":1765218047},{"Version":"1.6","UserName":"juanmi","Resource":"Command","Name":"setAuthorisedNumbersAndWatchSettings","Message":"(Update) (setAuthorisedNumbersAndWatchSettings) modified code to the command","Timestamp":1765219303},{"Version":"1.6","UserName":"juanmi","Resource":"GroupParam","Name":"Contact","Message":"(Update) (Contact) change command to setAuthorisedNumbersAndWatchSettings","Timestamp":1765219387},{"Version":"1.6","UserName":"juanmi","Resource":"GroupParam","Name":"Contact","Message":"Associate groupParam Contact to command setAuthorisedNumbersAndWatchSettings","Timestamp":1765219390},{"Version":"1.6","UserName":"juanmi","Resource":"GroupParam","Name":"Contact","Message":"Dissociate groupParam Contact from command setAuthorisedNumbers","Timestamp":1765219392},{"Version":"1.6","UserName":"juanmi","Resource":"Command","Name":"setAuthorisedNumbersAndWatchSettings","Message":"(Update) (setAuthorisedNumbersAndWatchSettings) compare count>2","Timestamp":1765219826},{"Version":"1.6","UserName":"juanmi","Resource":"Command","Name":"setAuthorisedNumbersAndWatchSettings","Message":"(Update) (setAuthorisedNumbersAndWatchSettings) insert code to count valid contacts","Timestamp":1765220298},{"Version":"1.6","UserName":"juanmi","Resource":"GroupParam","Name":"Enable Disable Heartrate Settings","Message":"(Update) (Enable Disable Heartrate Settings) modify commands: add new setAuthorisedNumbersAndWatchSettings","Timestamp":1765220584},{"Version":"1.6","UserName":"juanmi","Resource":"GroupParam","Name":"Enable Disable Heartrate Settings","Message":"Associate groupParam Enable Disable Heartrate Settings to command setAuthorisedNumbersAndWatchSettings","Timestamp":1765220587},{"Version":"1.6","UserName":"juanmi","Resource":"GroupParam","Name":"Enable Disable Heartrate Settings","Message":"Dissociate groupParam Enable Disable Heartrate Settings from command setWatchSettings","Timestamp":1765220589},{"Version":"1.6","UserName":"juanmi","Resource":"GroupParam","Name":"Reporting Frequency","Message":"(Update) (Reporting Frequency) modify commands: add new setAuthorisedNumbersAndWatchSettings","Timestamp":1765220655},{"Version":"1.6","UserName":"juanmi","Resource":"GroupParam","Name":"Reporting Frequency","Message":"Associate groupParam Reporting Frequency to command setAuthorisedNumbersAndWatchSettings","Timestamp":1765220658},{"Version":"1.6","UserName":"juanmi","Resource":"GroupParam","Name":"Reporting Frequency","Message":"Dissociate groupParam Reporting Frequency from command setWatchSettings","Timestamp":1765220661},{"Version":"1.6","UserName":"juanmi","Resource":"GroupParam","Name":"Enable Disable SPO2 Settings","Message":"(Update) (Enable Disable SPO2 Settings) modify commands: add new setAuthorisedNumbersAndWatchSettings","Timestamp":1765220695},{"Version":"1.6","UserName":"juanmi","Resource":"GroupParam","Name":"Enable Disable SPO2 Settings","Message":"Associate groupParam Enable Disable SPO2 Settings to command setAuthorisedNumbersAndWatchSettings","Timestamp":1765220698},{"Version":"1.6","UserName":"juanmi","Resource":"GroupParam","Name":"Enable Disable SPO2 Settings","Message":"Dissociate groupParam Enable Disable SPO2 Settings from command setWatchSettings","Timestamp":1765220701},{"Version":"1.6","UserName":"juanmi","Resource":"GroupParam","Name":"Reporting Frequency","Message":"(Update) (Reporting Frequency) modify commands: add new setAuthorisedNumbersAndWatchSettings","Timestamp":1765220728},{"Version":"1.6","UserName":"juanmi","Resource":"GroupParam","Name":"Reporting Frequency","Message":"Associate groupParam Reporting Frequency to command setAuthorisedNumbersAndWatchSettings","Timestamp":1765220731},{"Version":"1.6","UserName":"juanmi","Resource":"GroupParam","Name":"Reporting Frequency","Message":"Dissociate groupParam Reporting Frequency from command setWatchSettings","Timestamp":1765220733},{"Version":"1.6","UserName":"juanmi","Resource":"GroupParam","Name":"Enable Disable Steps Settings","Message":"(Update) (Enable Disable Steps Settings) modify commands: add new setAuthorisedNumbersAndWatchSettings","Timestamp":1765220760},{"Version":"1.6","UserName":"juanmi","Resource":"GroupParam","Name":"Enable Disable Steps Settings","Message":"Associate groupParam Enable Disable Steps Settings to command setAuthorisedNumbersAndWatchSettings","Timestamp":1765220764},{"Version":"1.6","UserName":"juanmi","Resource":"GroupParam","Name":"Enable Disable Steps Settings","Message":"Dissociate groupParam Enable Disable Steps Settings from command setWatchSettings","Timestamp":1765220766},{"Version":"1.6","UserName":"juanmi","Resource":"MessageType","Name":"STP","Message":"(Update) (STP) change <> for <>","Timestamp":1765478967},{"Version":"1.6","UserName":"juanmi","Resource":"MessageType","Name":"SPO2","Message":"(Update) (SPO2) change <> for <>","Timestamp":1765478989},{"Version":"1.6","UserName":"juanmi","Resource":"MessageType","Name":"HRT","Message":"(Update) (HRT) change <> for <>","Timestamp":1765479010},{"Version":"1.6","UserName":"juanmi","Resource":"Operation","Name":"Access TEC Care Watch","Message":"(Update) (Access TEC Care Watch) ticket 1819052: solving STEPS label","Timestamp":1765479698},{"Version":"1.6","UserName":"juanmi","Resource":"Operation","Name":"Access TEC Care Watch","Message":"(Update) (Access TEC Care Watch) solving HRT and SPO labels","Timestamp":1765479872},{"Version":"1.6","UserName":"juanmi","Resource":"Operation","Name":"Access TEC Care Watch","Message":"(Update) (Access TEC Care Watch) define labels as array","Timestamp":1765480260},{"Version":"1.6","UserName":"juanmi","Resource":"Operation","Name":"Access TEC Care Watch","Message":"(Update) (Access TEC Care Watch) create function normalizeLabels to output labels as array","Timestamp":1765480978},{"Version":"1.6","UserName":"juanmi","Resource":"Operation","Name":"Access TEC Care Watch","Message":"(Update) (Access TEC Care Watch) AddValue(codeValues, 'oysta_labels', labels);","Timestamp":1765481426},{"Version":"1.6","UserName":"juanmi","Resource":"Operation","Name":"Access TEC Care Watch","Message":"(Update) (Access TEC Care Watch) AddValue(codeValues, 'oysta_labels', params.rawlabel);","Timestamp":1765482205},{"Version":"1.6","UserName":"juanmi","Resource":"Operation","Name":"Access TEC Care Watch","Message":"(Update) (Access TEC Care Watch) AddValue(codeValues, 'oysta_labels', `['${params.rawlabel}]'`);","Timestamp":1765483605},{"Version":"1.6","UserName":"juanmi","Resource":"Operation","Name":"Access TEC Care Watch","Message":"(Update) (Access TEC Care Watch) small fix","Timestamp":1765483826},{"Version":"1.6","UserName":"juanmi","Resource":"Operation","Name":"Access TEC Care Watch","Message":"(Update) (Access TEC Care Watch) //console.log(dataToReceiver);","Timestamp":1765485094},{"Version":"1.6","UserName":"juanmi","Resource":"Operation","Name":"Access TEC Care Watch","Message":"(Update) (Access TEC Care Watch) uncomment console.log()","Timestamp":1765485476},{"Version":"1.6","UserName":"juanmi","Resource":"Operation","Name":"Access TEC Care Watch","Message":"(Update) (Access TEC Care Watch) change ' ' to \" \"","Timestamp":1765486097},{"Version":"1.6","UserName":"juanmi","Resource":"Operation","Name":"Access TEC Care Watch","Message":"(Update) (Access TEC Care Watch) console.log(JSON.stringify(dataToReceiver));","Timestamp":1765522431},{"Version":"1.6","UserName":"juanmi","Resource":"Operation","Name":"Access TEC Care Watch","Message":"(Update) (Access TEC Care Watch) maps as an array","Timestamp":1765522901}],"ProtocolActionObjects":[],"Tags":[{"Id":2220,"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}]} \ No newline at end of file +{"Id":297,"Name":null,"Description":null,"FirmwareVersion":"V06.8601.2501","InProgress":false,"MessageTypes":[{"Id":7943,"Code":"Alert Finalized","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Watch-SOSEnding;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;GENERAL=<>;<>","HasTemplateGlobal":false,"ResponseTemplate":"<>","TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^Watch-SOSEnding;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;GENERAL=[^;;]*;[^;]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7970,"Code":"PWRF","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Watch-PWRF;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;GENERAL=<>;<>","HasTemplateGlobal":false,"ResponseTemplate":"<>","TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^Watch-PWRF;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;GENERAL=[^;;]*;[^;]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7982,"Code":"PWRN","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Watch-PWRN;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;GENERAL=<>;<>","HasTemplateGlobal":false,"ResponseTemplate":"<>","TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^Watch-PWRN;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;GENERAL=[^;;]*;[^;]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":8011,"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":5720,"Protocol":{"Id":297,"Code":"Access TEC Care Watch","Version":"0.1","FirmwareVersion":"","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":false},"Name":"actionDeviceReboot","TemplateSMS":"<>","Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\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":[]},{"Id":8010,"Code":"ACK-FALLSENS-SMS","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":true,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Mode:<>","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":true,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":false,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":{"Id":5764,"Protocol":{"Id":297,"Code":"Access TEC Care Watch","Version":"0.1","FirmwareVersion":"","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":false},"Name":"getCurrentSettings2","TemplateSMS":"<>","Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n 0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\nvar msg = [];\r\nvar configs = [];\r\nvar configsSMS = [];\r\n// Contacts, APN, server details, fall sensitivity and Beacon List\r\nvar dataSMS = 'status'; // Check fall sens (function settings)\r\n/* Mode:4,0 second\r\nLED: on\r\nBeep: on\r\nVibration: on\r\nTime zone: +10:00\r\nGEO Fence:0,0,0,0\r\nMotion alarm: off\r\nNo Motion alarm: off\r\nTilt alert: off\r\nFall alarm: on, level:5\r\nLow power alarm: on,15%\r\nSOS Call:10 minutes, loop:1 */\r\nvar data = ''; // empty\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar notSend = false;\r\nif (isForcedBySMS == 'False' && ((serverParams.CommandType == 'ByGPRS') || (serverParams.CommandType == 'Default' && ((serverParams.ParentCommandType == 'ByGPRS') || (serverParams.ParentCommandType == 'Default' && serverParams.ConfigType == 'GPRS') || (serverParams.ParentCommandType === null && serverParams.ConfigType == 'GPRS'))))) {\r\n notSend = true;\r\n}\r\n// For GPRS command\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\n// For SMS command\r\nAddValueSMS('dataSMS', dataSMS);\r\nvar commandConfigs = {\r\n template: \"main\",\r\n configs: configs,\r\n configsSMS: configsSMS,\r\n notSend: notSend\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n// functions\r\nfunction AddValue(p1, p2) {\r\n var cvpair = {\r\n code: p1,\r\n value: p2\r\n };\r\n configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n var cvpair = {\r\n code: p1,\r\n value: p2\r\n };\r\n configsSMS.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n var arr1 = [];\r\n for (var n = 0, l = str.length; n < l; n++) {\r\n var hex = Number(str.charCodeAt(n)).toString(16);\r\n arr1.push(hex);\r\n }\r\n return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n var crc = 0x0000;\r\n var j, i;\r\n for (i = 0; i < s.length; i++) {\r\n c = s[i];\r\n if (c > 255) {\r\n throw new RangeError();\r\n }\r\n j = (c ^ (crc >> 8)) & 0xFF;\r\n crc = crcTable[j] ^ (crc << 8);\r\n }\r\n return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n var splitStr = []\r\n var j = 0\r\n for (let i = 0; i < str.length; i += 2) {\r\n splitStr[j] = str.substring(i, i + 2)\r\n j++\r\n }\r\n var bytes = []\r\n var bytePos = 0\r\n for (let i = 0; i < splitStr.length; i++) {\r\n var byteStr = splitStr[i]\r\n var b = parseInt(byteStr, 16)\r\n if (b < 256) {\r\n bytes[bytePos] = b\r\n bytePos++\r\n }\r\n }\r\n return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n hexString = str.toString(16);\r\n return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n let bin = 0;\r\n let rem, i = 1,\r\n step = 1;\r\n while (x != 0) {\r\n rem = x % 2;\r\n x = parseInt(x / 2);\r\n bin = bin + rem * i;\r\n i = i * 10;\r\n }\r\n return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n var hexa = parseInt(x, 2).toString(16);\r\n return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n const result = [];\r\n let len = string.length - 2;\r\n while (len >= 0) {\r\n result.push(string.substr(len, 2));\r\n len -= 2;\r\n }\r\n return result.join('');\r\n}","AvoidResending":false,"FollowParentSentType":true,"SendingType":0,"CommandToUpdateId":null,"ParentId":4958,"Parent":null,"HasAck":true,"HexString":true,"SendAttempts":4,"Order":18},"CacheImei":false,"RegEx":"^Mode:[^:]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":8009,"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: }}<>","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":{"Id":5775,"Protocol":{"Id":297,"Code":"Access TEC Care Watch","Version":"0.1","FirmwareVersion":"","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":false},"Name":"actionRequestLocation","TemplateSMS":null,"Template":"<>","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":8008,"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":5774,"Protocol":{"Id":297,"Code":"Access TEC Care Watch","Version":"0.1","FirmwareVersion":"","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":false},"Name":"setSMSPrefix","TemplateSMS":null,"Template":"<>","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":8007,"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":5773,"Protocol":{"Id":297,"Code":"Access TEC Care Watch","Version":"0.1","FirmwareVersion":"","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":false},"Name":"actionFactoryReset","TemplateSMS":"<>","Template":"<>","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 = 'ineedtoresetEV06A!'; // ticket 604747\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":3,"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":[],"Tags":[]},{"Id":8006,"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":5772,"Protocol":{"Id":297,"Code":"Access TEC Care Watch","Version":"0.1","FirmwareVersion":"","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":false},"Name":"actionDeleteRecords","TemplateSMS":"<>","Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\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":[],"Tags":[]},{"Id":8005,"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":5771,"Protocol":{"Id":297,"Code":"Access TEC Care Watch","Version":"0.1","FirmwareVersion":"","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":false},"Name":"actionPowerOff","TemplateSMS":"<>","Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\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":[],"Tags":[]},{"Id":8004,"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":5770,"Protocol":{"Id":297,"Code":"Access TEC Care Watch","Version":"0.1","FirmwareVersion":"","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":false},"Name":"actionTrace","TemplateSMS":"<>","Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\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":8003,"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":5779,"Protocol":{"Id":297,"Code":"Access TEC Care Watch","Version":"0.1","FirmwareVersion":"","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":false},"Name":"actionRealTimeLocation","TemplateSMS":"<>","Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\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":[],"Tags":[]},{"Id":8002,"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":5777,"Protocol":{"Id":297,"Code":"Access TEC Care Watch","Version":"0.1","FirmwareVersion":"","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":false},"Name":"setAPN","TemplateSMS":"<>","Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\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\":8002,\"Code\":\"ACK-APN\",\"Name\":null,\"MessageCode\":\"ACK\",\"NeedAck\":false,\"IsAck\":true,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":0,\"Template\":\"{{Set APN ok.|Configuracin APN OK.}\",\"HasTemplateGlobal\":false,\"ResponseTemplate\":\"ok1\",\"TemplateGlobal\":null,\"LongConnection\":true,\"HexString\":false,\"AckFirst\":false,\"ScaipH\":false,\"DoNotSendCommands\":false,\"ProtocolsLibraryMethod\":null,\"ProtocolsLibraryMethodArgs\":null,\"Command\":{\"Id\":5777,\"Protocol\":{\"Id\":297,\"Code\":\"Access TEC Care Watch\",\"Version\":\"0.2\",\"FirmwareVersion\":\"\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"setAPN\",\"TemplateSMS\":\"<>\",\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\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\":[],\"Tags\":[]}","Timestamp":1748619991}],"Tags":[]},{"Id":8001,"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":5769,"Protocol":{"Id":297,"Code":"Access TEC Care Watch","Version":"0.1","FirmwareVersion":"","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":false},"Name":"setFallSettings","TemplateSMS":"<>","Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n 0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\nvar msg = [];\r\nvar configs = [];\r\nvar configsSMS = [];\r\n// configuration command (0X02) Fall sensitivity\r\nvar messageBody = '02';\r\nvar sensitivity = '';\r\nvar dataSMS = '';\r\nvar value = ''\r\nif (params.FallSettings.EnableDisableFallSettings == 'true') {\r\n value += '1'\r\n value += '100' //Dial\r\n //}\r\n if (params.FallSettings.Sensitivity) {\r\n var sensiString = params.FallSettings.Sensitivity.split(',');\r\n var level = sensiString[1];\r\n sensitivity = parseInt(sensiString[0]);\r\n // For SMS\r\n dataSMS = `FL1,${sensitivity},1`;\r\n //numberHex = ascii_to_hexa(sensitivity).toUpperCase();\r\n sensitivity = ('0000' + decimalToBinary(sensitivity)).slice(-4).toUpperCase()\r\n value += sensitivity\r\n }\r\n} else {\r\n value = '01100001'\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":[],"Tags":[]},{"Id":8000,"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":5767,"Protocol":{"Id":297,"Code":"Access TEC Care Watch","Version":"0.1","FirmwareVersion":"","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":false},"Name":"setGateway","TemplateSMS":"<>","Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\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 = '34';\r\nvar gateway_number = '00000000000';\r\nvar numberHex = '';\r\nvar numberLength = '00';\r\nvar nameLength = '00';\r\nvar nameHex = '';\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 nameHex = ascii_to_hexa(gateway).toUpperCase();\r\n nameLength = ('00' + decimalToHex(gateway.length)).slice(-2).toUpperCase();\r\n sosKeyLength = ('00' + decimalToHex(5 + (numberHex.length / 2) + (nameHex.length / 2))).slice(-2).toUpperCase();\r\n messageBody += sosKeyLength + key + confSOS + numberLength + numberHex + nameLength + nameHex + '00';\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":[],"Tags":[]},{"Id":7999,"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":5766,"Protocol":{"Id":297,"Code":"Access TEC Care Watch","Version":"0.1","FirmwareVersion":"","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":false},"Name":"setServer","TemplateSMS":"<>","Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\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":[],"Tags":[]},{"Id":7998,"Code":"ACK-FIRM-SMS","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":true,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"IMEI:<>","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":true,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":false,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":{"Id":5765,"Protocol":{"Id":297,"Code":"Access TEC Care Watch","Version":"0.1","FirmwareVersion":"","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":false},"Name":"getCurrentSettings","TemplateSMS":"<>","Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\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 = '1A73344041424356101F44534733'; //1A73\r\n// Firmware Long, Contacts, APNusername, APNpass, server details, fall sensitivity and Beacon List, Fall down alert, Ring tome vol,System language, time interval, No motion alert,custom id, allow list\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar command = '02';\r\n//var keyLength = '10'; // previous\r\nvar keyLength = '0F'; //+1 qnt of commands\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' + '1100' + 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":7997,"Code":"ACK-GDATA","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":true,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Watch;ACK-GDATA;<>;","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":true,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":false,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":{"Id":5765,"Protocol":{"Id":297,"Code":"Access TEC Care Watch","Version":"0.1","FirmwareVersion":"","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":false},"Name":"getCurrentSettings","TemplateSMS":"<>","Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\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 = '1A73344041424356101F44534733'; //1A73\r\n// Firmware Long, Contacts, APNusername, APNpass, server details, fall sensitivity and Beacon List, Fall down alert, Ring tome vol,System language, time interval, No motion alert,custom id, allow list\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar command = '02';\r\n//var keyLength = '10'; // previous\r\nvar keyLength = '0F'; //+1 qnt of commands\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' + '1100' + 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":"^Watch;ACK-GDATA;[^;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7996,"Code":"ACK-BEAC-SMS","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":true,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"1,<>","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":true,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":false,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":{"Id":5763,"Protocol":{"Id":297,"Code":"Access TEC Care Watch","Version":"0.1","FirmwareVersion":"","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":false},"Name":"getCurrentSettings3","TemplateSMS":"<>","Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n 0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\nvar msg = [];\r\nvar configs = [];\r\nvar configsSMS = [];\r\n// Contacts, APN, server details, fall sensitivity and Beacon List\r\nvar dataSMS = 'BCQ1'; // Check Beacon List\r\n/* 1,F7:37:B7:10:81:CE,office1\r\n2,C4:9F:A6:15:24:3F,office2\r\n3,D3:E3:AC:86:5E:46,office7 */\r\nvar data = ''; // empty\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar notSend = false;\r\nif (isForcedBySMS == 'False' && ((serverParams.CommandType == 'ByGPRS') || (serverParams.CommandType == 'Default' && ((serverParams.ParentCommandType == 'ByGPRS') || (serverParams.ParentCommandType == 'Default' && serverParams.ConfigType == 'GPRS') || (serverParams.ParentCommandType === null && serverParams.ConfigType == 'GPRS'))))) {\r\n notSend = true;\r\n}\r\n// For GPRS command\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\n// For SMS command\r\nAddValueSMS('dataSMS', dataSMS);\r\nvar commandConfigs = {\r\n template: \"main\",\r\n configs: configs,\r\n configsSMS: configsSMS,\r\n notSend: notSend\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n// functions\r\nfunction AddValue(p1, p2) {\r\n var cvpair = {\r\n code: p1,\r\n value: p2\r\n };\r\n configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n var cvpair = {\r\n code: p1,\r\n value: p2\r\n };\r\n configsSMS.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n var arr1 = [];\r\n for (var n = 0, l = str.length; n < l; n++) {\r\n var hex = Number(str.charCodeAt(n)).toString(16);\r\n arr1.push(hex);\r\n }\r\n return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n var crc = 0x0000;\r\n var j, i;\r\n for (i = 0; i < s.length; i++) {\r\n c = s[i];\r\n if (c > 255) {\r\n throw new RangeError();\r\n }\r\n j = (c ^ (crc >> 8)) & 0xFF;\r\n crc = crcTable[j] ^ (crc << 8);\r\n }\r\n return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n var splitStr = []\r\n var j = 0\r\n for (let i = 0; i < str.length; i += 2) {\r\n splitStr[j] = str.substring(i, i + 2)\r\n j++\r\n }\r\n var bytes = []\r\n var bytePos = 0\r\n for (let i = 0; i < splitStr.length; i++) {\r\n var byteStr = splitStr[i]\r\n var b = parseInt(byteStr, 16)\r\n if (b < 256) {\r\n bytes[bytePos] = b\r\n bytePos++\r\n }\r\n }\r\n return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n hexString = str.toString(16);\r\n return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n let bin = 0;\r\n let rem, i = 1,\r\n step = 1;\r\n while (x != 0) {\r\n rem = x % 2;\r\n x = parseInt(x / 2);\r\n bin = bin + rem * i;\r\n i = i * 10;\r\n }\r\n return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n var hexa = parseInt(x, 2).toString(16);\r\n return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n const result = [];\r\n let len = string.length - 2;\r\n while (len >= 0) {\r\n result.push(string.substr(len, 2));\r\n len -= 2;\r\n }\r\n return result.join('');\r\n}","AvoidResending":false,"FollowParentSentType":true,"SendingType":0,"CommandToUpdateId":null,"ParentId":4958,"Parent":null,"HasAck":true,"HexString":true,"SendAttempts":4,"Order":19},"CacheImei":false,"RegEx":"^1,[^,]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7995,"Code":"ACK-CONTAC-SMS","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":true,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"A1:<>","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":true,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":false,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":{"Id":5762,"Protocol":{"Id":297,"Code":"Access TEC Care Watch","Version":"0.1","FirmwareVersion":"","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":false},"Name":"getCurrentSettings4","TemplateSMS":"<>","Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n 0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\nvar msg = [];\r\nvar configs = [];\r\nvar configsSMS = [];\r\n// Contacts, APN, server details, fall sensitivity and Beacon List\r\nvar dataSMS = 'A?'; // Check Contact List\r\n/* A1: 1,1,15899795842\r\nA2: 1,0,13632770106\r\nA3: 0,1,15986236978 */\r\nvar data = ''; // empty\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar notSend = false;\r\nif (isForcedBySMS == 'False' && ((serverParams.CommandType == 'ByGPRS') || (serverParams.CommandType == 'Default' && ((serverParams.ParentCommandType == 'ByGPRS') || (serverParams.ParentCommandType == 'Default' && serverParams.ConfigType == 'GPRS') || (serverParams.ParentCommandType === null && serverParams.ConfigType == 'GPRS'))))) {\r\n notSend = true;\r\n}\r\n// For GPRS command\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\n// For SMS command\r\nAddValueSMS('dataSMS', dataSMS);\r\nvar commandConfigs = {\r\n template: \"main\",\r\n configs: configs,\r\n configsSMS: configsSMS,\r\n notSend: notSend\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n// functions\r\nfunction AddValue(p1, p2) {\r\n var cvpair = {\r\n code: p1,\r\n value: p2\r\n };\r\n configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n var cvpair = {\r\n code: p1,\r\n value: p2\r\n };\r\n configsSMS.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n var arr1 = [];\r\n for (var n = 0, l = str.length; n < l; n++) {\r\n var hex = Number(str.charCodeAt(n)).toString(16);\r\n arr1.push(hex);\r\n }\r\n return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n var crc = 0x0000;\r\n var j, i;\r\n for (i = 0; i < s.length; i++) {\r\n c = s[i];\r\n if (c > 255) {\r\n throw new RangeError();\r\n }\r\n j = (c ^ (crc >> 8)) & 0xFF;\r\n crc = crcTable[j] ^ (crc << 8);\r\n }\r\n return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n var splitStr = []\r\n var j = 0\r\n for (let i = 0; i < str.length; i += 2) {\r\n splitStr[j] = str.substring(i, i + 2)\r\n j++\r\n }\r\n var bytes = []\r\n var bytePos = 0\r\n for (let i = 0; i < splitStr.length; i++) {\r\n var byteStr = splitStr[i]\r\n var b = parseInt(byteStr, 16)\r\n if (b < 256) {\r\n bytes[bytePos] = b\r\n bytePos++\r\n }\r\n }\r\n return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n hexString = str.toString(16);\r\n return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n let bin = 0;\r\n let rem, i = 1,\r\n step = 1;\r\n while (x != 0) {\r\n rem = x % 2;\r\n x = parseInt(x / 2);\r\n bin = bin + rem * i;\r\n i = i * 10;\r\n }\r\n return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n var hexa = parseInt(x, 2).toString(16);\r\n return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n const result = [];\r\n let len = string.length - 2;\r\n while (len >= 0) {\r\n result.push(string.substr(len, 2));\r\n len -= 2;\r\n }\r\n return result.join('');\r\n}","AvoidResending":false,"FollowParentSentType":true,"SendingType":0,"CommandToUpdateId":null,"ParentId":4958,"Parent":null,"HasAck":true,"HexString":true,"SendAttempts":4,"Order":20},"CacheImei":false,"RegEx":"^A1:[^:]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7994,"Code":"ACK-SERV-SMS","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":true,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"GRPS:<>","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":true,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":false,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":{"Id":5761,"Protocol":{"Id":297,"Code":"Access TEC Care Watch","Version":"0.1","FirmwareVersion":"","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":false},"Name":"getCurrentSettings5","TemplateSMS":"<>","Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n 0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\nvar msg = [];\r\nvar configs = [];\r\nvar configsSMS = [];\r\n// Contacts, APN, server details, fall sensitivity and Beacon List\r\nvar dataSMS = 'GPRS?'; // Check Server Details\r\n/*GRPS: ON\r\nAPN: internet\r\nUsername:\r\nPassword:\r\nIP: 1, www.smart-locator.com\r\nPort: 6060\r\nMove report time: 30 minutes\r\nNo move report time: 60 minutes\r\nHB: on, 20 minutes */\r\nvar data = ''; // empty\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar notSend = false;\r\nif (isForcedBySMS == 'False' && ((serverParams.CommandType == 'ByGPRS') || (serverParams.CommandType == 'Default' && ((serverParams.ParentCommandType == 'ByGPRS') || (serverParams.ParentCommandType == 'Default' && serverParams.ConfigType == 'GPRS') || (serverParams.ParentCommandType === null && serverParams.ConfigType == 'GPRS'))))) {\r\n notSend = true;\r\n}\r\n// For GPRS command\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\n// For SMS command\r\nAddValueSMS('dataSMS', dataSMS);\r\nvar commandConfigs = {\r\n template: \"main\",\r\n configs: configs,\r\n configsSMS: configsSMS,\r\n notSend: notSend\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n// functions\r\nfunction AddValue(p1, p2) {\r\n var cvpair = {\r\n code: p1,\r\n value: p2\r\n };\r\n configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n var cvpair = {\r\n code: p1,\r\n value: p2\r\n };\r\n configsSMS.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n var arr1 = [];\r\n for (var n = 0, l = str.length; n < l; n++) {\r\n var hex = Number(str.charCodeAt(n)).toString(16);\r\n arr1.push(hex);\r\n }\r\n return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n var crc = 0x0000;\r\n var j, i;\r\n for (i = 0; i < s.length; i++) {\r\n c = s[i];\r\n if (c > 255) {\r\n throw new RangeError();\r\n }\r\n j = (c ^ (crc >> 8)) & 0xFF;\r\n crc = crcTable[j] ^ (crc << 8);\r\n }\r\n return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n var splitStr = []\r\n var j = 0\r\n for (let i = 0; i < str.length; i += 2) {\r\n splitStr[j] = str.substring(i, i + 2)\r\n j++\r\n }\r\n var bytes = []\r\n var bytePos = 0\r\n for (let i = 0; i < splitStr.length; i++) {\r\n var byteStr = splitStr[i]\r\n var b = parseInt(byteStr, 16)\r\n if (b < 256) {\r\n bytes[bytePos] = b\r\n bytePos++\r\n }\r\n }\r\n return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n hexString = str.toString(16);\r\n return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n let bin = 0;\r\n let rem, i = 1,\r\n step = 1;\r\n while (x != 0) {\r\n rem = x % 2;\r\n x = parseInt(x / 2);\r\n bin = bin + rem * i;\r\n i = i * 10;\r\n }\r\n return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n var hexa = parseInt(x, 2).toString(16);\r\n return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n const result = [];\r\n let len = string.length - 2;\r\n while (len >= 0) {\r\n result.push(string.substr(len, 2));\r\n len -= 2;\r\n }\r\n return result.join('');\r\n}","AvoidResending":false,"FollowParentSentType":true,"SendingType":0,"CommandToUpdateId":null,"ParentId":4958,"Parent":null,"HasAck":true,"HexString":true,"SendAttempts":4,"Order":21},"CacheImei":false,"RegEx":"^GRPS:[^:]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7993,"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":5768,"Protocol":{"Id":297,"Code":"Access TEC Care Watch","Version":"0.1","FirmwareVersion":"","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":false},"Name":"setEmergencySettings","TemplateSMS":"<>","Template":"<>","AckTemplate":null,"Operation":"//updated for EV06\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 msg = [];\r\nvar configs = [];\r\nvar configsSMS = [];\r\nvar messageBody = '02';\r\nvar key = '34';\r\nvar phone_number = '00000000000';\r\nvar numberHex = '';\r\nvar numberLength = '00';\r\nvar nameLength = '00';\r\nvar nameHex = '';\r\nvar sosKeyLength = '00';\r\n//var confFall = '1100'; // Enable, Dial\r\nvar confSOS = '10100000'; // Enable, no SMS, Toggle Call, No Sim Dialing, Contact Number 1\r\nvar dataSMS = '';\r\nif (params.AlertSettings.EmergencyNumber) {\r\n confSOS = ('00' + binaryToHex(confSOS)).slice(-2).toUpperCase();\r\n phone_number = params.AlertSettings.EmergencyNumber;\r\n numberHex = ascii_to_hexa(phone_number).toUpperCase();\r\n numberLength = ('00' + decimalToHex(phone_number.length)).slice(-2).toUpperCase();\r\n nameHex = ascii_to_hexa('Support').toUpperCase(); // Support 53 75 70 70 6F 72 74\r\n nameLength = '07'; // lenght of 'Support'\r\n sosKeyLength = ('00' + decimalToHex(5 + (numberHex.length / 2) + (nameHex.length / 2))).slice(-2).toUpperCase();\r\n messageBody += sosKeyLength + key + confSOS + numberLength + numberHex + nameLength + nameHex + '00';\r\n dataSMS = `A1,0,1,${phone_number}`;\r\n}\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar totalLength = ('0000' + decimalToHex(messageBody.length / 2)).slice(-4).toUpperCase();\r\ntotalLength = changeEndianness(totalLength);\r\n//totalLength = '1000'; //better to calculate it\r\nvar checksum = byteStringToByteArray(messageBody);\r\nchecksum = crc16byte(checksum);\r\nchecksum = decimalToHex(checksum);\r\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\r\nchecksum = changeEndianness(checksum);\r\nvar prefix = 'AB10' + totalLength + checksum + sequenceID;\r\nvar data = prefix + messageBody;\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\n// For SMS command\r\nAddValueSMS('dataSMS', dataSMS);\r\nvar commandConfigs = {\r\n template: \"main\",\r\n configs: configs,\r\n configsSMS: configsSMS\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n// functions\r\nfunction AddValue(p1, p2) {\r\n var cvpair = {\r\n code: p1,\r\n value: p2\r\n };\r\n configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n var cvpair = {\r\n code: p1,\r\n value: p2\r\n };\r\n configsSMS.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n var arr1 = [];\r\n for (var n = 0, l = str.length; n < l; n++) {\r\n var hex = Number(str.charCodeAt(n)).toString(16);\r\n arr1.push(hex);\r\n }\r\n return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n var crc = 0x0000;\r\n var j, i;\r\n for (i = 0; i < s.length; i++) {\r\n c = s[i];\r\n if (c > 255) {\r\n throw new RangeError();\r\n }\r\n j = (c ^ (crc >> 8)) & 0xFF;\r\n crc = crcTable[j] ^ (crc << 8);\r\n }\r\n return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n var splitStr = []\r\n var j = 0\r\n for (let i = 0; i < str.length; i += 2) {\r\n splitStr[j] = str.substring(i, i + 2)\r\n j++\r\n }\r\n var bytes = []\r\n var bytePos = 0\r\n for (let i = 0; i < splitStr.length; i++) {\r\n var byteStr = splitStr[i]\r\n var b = parseInt(byteStr, 16)\r\n if (b < 256) {\r\n bytes[bytePos] = b\r\n bytePos++\r\n }\r\n }\r\n return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n hexString = str.toString(16);\r\n return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n let bin = 0;\r\n let rem, i = 1,\r\n step = 1;\r\n while (x != 0) {\r\n rem = x % 2;\r\n x = parseInt(x / 2);\r\n bin = bin + rem * i;\r\n i = i * 10;\r\n }\r\n return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n var hexa = parseInt(x, 2).toString(16);\r\n return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n const result = [];\r\n let len = string.length - 2;\r\n while (len >= 0) {\r\n result.push(string.substr(len, 2));\r\n len -= 2;\r\n }\r\n return result.join('');\r\n}","AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"CommandToUpdateId":null,"ParentId":null,"Parent":null,"HasAck":true,"HexString":true,"SendAttempts":4,"Order":3},"CacheImei":false,"RegEx":"^(Set contact number 1 ok.|Configuracin numero contacto 1 ok.)","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7992,"Code":"ACK-GAPN","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":true,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Watch;ACK-GAPN;<>;","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":true,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":false,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":{"Id":5778,"Protocol":{"Id":297,"Code":"Access TEC Care Watch","Version":"0.1","FirmwareVersion":"","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":false},"Name":"getAPN","TemplateSMS":null,"Template":"<>","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":"^Watch;ACK-GAPN;[^;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7991,"Code":"ACK-GSRV","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":true,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Watch;ACK-GSRV;<>;","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":true,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":false,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":{"Id":5782,"Protocol":{"Id":297,"Code":"Access TEC Care Watch","Version":"0.1","FirmwareVersion":"","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":false},"Name":"getServer","TemplateSMS":null,"Template":"<>","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":"^Watch;ACK-GSRV;[^;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7990,"Code":"ACK-HB-SMS","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":true,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Set heart beat<>","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":true,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":false,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":{"Id":5780,"Protocol":{"Id":297,"Code":"Access TEC Care Watch","Version":"0.1","FirmwareVersion":"","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":false},"Name":"actionConfigurationMode","TemplateSMS":null,"Template":"<>","AckTemplate":null,"Operation":"var configs = [];\r\nif (params.Controls.ConfigurationMode == 'true') {\r\n var data = `GPRSHB1M`;\r\n} else {\r\n var data = `GPRSHB240S`; //`GPRSHB0M`;\r\n}\r\nAddValue('data', data);\r\nvar commandConfigs = {\r\n template: \"main\",\r\n configs: configs\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n\r\nfunction AddValue(p1, p2) {\r\n var cvpair = {\r\n code: p1,\r\n value: p2\r\n };\r\n configs.push(cvpair);\r\n}","AvoidResending":false,"FollowParentSentType":false,"SendingType":2,"CommandToUpdateId":null,"ParentId":null,"Parent":null,"HasAck":true,"HexString":false,"SendAttempts":4,"Order":null},"CacheImei":false,"RegEx":"^Set heart beat[^t]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7989,"Code":"ACK-FIRM","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":true,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Watch;ACK-FIRM;<>;","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":true,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":false,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":{"Id":5796,"Protocol":{"Id":297,"Code":"Access TEC Care Watch","Version":"0.1","FirmwareVersion":"","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":false},"Name":"getFirmwareVersion","TemplateSMS":"<>","Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\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":"^Watch;ACK-FIRM;[^;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7988,"Code":"ACK-LANG","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":true,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Watch;ACK-LANG;<>;","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":true,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":false,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":{"Id":5798,"Protocol":{"Id":297,"Code":"Access TEC Care Watch","Version":"0.1","FirmwareVersion":"","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":false},"Name":"getSystemLanguage","TemplateSMS":"<>","Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\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":"^Watch;ACK-LANG;[^;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7987,"Code":"ACK-MODE","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":true,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Watch;ACK-MODE;<>;","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":true,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":false,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":{"Id":5795,"Protocol":{"Id":297,"Code":"Access TEC Care Watch","Version":"0.1","FirmwareVersion":"","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":false},"Name":"getPerformanceMode","TemplateSMS":"","Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\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":"^Watch;ACK-MODE;[^;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7986,"Code":"ACK-CUSTID","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":true,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Watch;ACK-CUSTID;<>;","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":true,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":false,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":{"Id":5794,"Protocol":{"Id":297,"Code":"Access TEC Care Watch","Version":"0.1","FirmwareVersion":"","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":false},"Name":"getCustomId","TemplateSMS":"","Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\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":"^Watch;ACK-CUSTID;[^;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7985,"Code":"ACK-NOMOTION","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":true,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Watch;ACK-NOMOTION;<>;","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":true,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":false,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":{"Id":5793,"Protocol":{"Id":297,"Code":"Access TEC Care Watch","Version":"0.1","FirmwareVersion":"","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":false},"Name":"getNoMotionAlert","TemplateSMS":"","Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\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":"^Watch;ACK-NOMOTION;[^;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7984,"Code":"ACK-FALLALERT","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":true,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Watch;ACK-FALLALERT;<>;","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":true,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":false,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":{"Id":5792,"Protocol":{"Id":297,"Code":"Access TEC Care Watch","Version":"0.1","FirmwareVersion":"","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":false},"Name":"getFallDownAlert","TemplateSMS":"","Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\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":"^Watch;ACK-FALLALERT;[^;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7983,"Code":"ACK-VOL","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":true,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Watch;ACK-VOL;<>;","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":true,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":false,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":{"Id":5791,"Protocol":{"Id":297,"Code":"Access TEC Care Watch","Version":"0.1","FirmwareVersion":"","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":false},"Name":"getVolume","TemplateSMS":null,"Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\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":"^Watch;ACK-VOL;[^;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7981,"Code":"ALF","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":1,"Template":"Watch-ALF;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;GENERAL=<>;<>","HasTemplateGlobal":false,"ResponseTemplate":"<>","TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^Watch-ALF;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;GENERAL=[^;;]*;[^;]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7980,"Code":"ACK-SPEED","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Watch;ACK-SPEED;<>;","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":"^Watch;ACK-SPEED;[^;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7979,"Code":"ACK-WIFI","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Watch;ACK-WIFI;<>;","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":"^Watch;ACK-WIFI;[^;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7978,"Code":"BATCF","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Watch-BATCF;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;GENERAL=<>;<>","HasTemplateGlobal":false,"ResponseTemplate":"<>","TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^Watch-BATCF;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;GENERAL=[^;;]*;[^;]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7977,"Code":"BATCN","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Watch-BATCN;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;GENERAL=<>;<>","HasTemplateGlobal":false,"ResponseTemplate":"<>","TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^Watch-BATCN;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;GENERAL=[^;;]*;[^;]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7976,"Code":"COMM-SMS","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Watch-SMS;<>;<>","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":"esendex<>esendex<>","LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^Watch-SMS;[^;]*;[^;]*","RegExGlobal":"^esendex[^e]*esendex[^x]*","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7975,"Code":"NACT","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"+RESP:NACT,<>,<>$","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":7974,"Code":"ALA-O","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Watch-ALA-O;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;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":"^Watch-ALA-O;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;GENERAL=[^;;]*;[^;]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7973,"Code":"ENC-2","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"","HasTemplateGlobal":true,"ResponseTemplate":"<>","TemplateGlobal":"AB00<>","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":7972,"Code":"RTL-BEACON","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Beacon:Loc Time: <>","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":7971,"Code":"HRT","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Watch-HRT;<>;STATUS=<>;ETIME=<>;GENERAL=<>;<>;HRT=<>;TLEVEL=<>;LABEL=<>","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":"^Watch-HRT;[^;]*;STATUS=[^;;]*;ETIME=[^;;]*;GENERAL=[^;;]*;[^;;]*;HRT=[^;;]*;TLEVEL=[^;;]*;LABEL=[^=]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":7971,\"Code\":\"HRT\",\"Name\":null,\"MessageCode\":\"HRT\",\"NeedAck\":false,\"IsAck\":false,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":0,\"Template\":\"Watch-HRT;<>;STATUS=<>;ETIME=<>;GENERAL=<>;<>;HRT=<>;TLEVEL=<>;LABEL=<>\",\"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\":\"^Watch-HRT;[^;]*;STATUS=[^;;]*;ETIME=[^;;]*;GENERAL=[^;;]*;[^;;]*;HRT=[^;;]*;TLEVEL=[^;;]*;LABEL=[^=]*\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1765479010}],"Tags":[]},{"Id":7969,"Code":"ALA-C","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Watch-ALA-C;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;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":"^Watch-ALA-C;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;GENERAL=[^;;]*;[^;]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7968,"Code":"ENC","Name":null,"MessageCode":null,"NeedAck":true,"IsAck":false,"IsFailAck":false,"IsAckHexString":true,"NoOperation":false,"Type":0,"Template":"","HasTemplateGlobal":true,"ResponseTemplate":"<>","TemplateGlobal":"AB10<>","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":7967,"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: <>","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":7966,"Code":"COMM-GT","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Eview;<>;<>;Get timestamp","HasTemplateGlobal":false,"ResponseTemplate":"<>","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":7965,"Code":"F-ACK-Version Invalid","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":true,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Watch-ACK;<>;AB00030018C5<>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":"^Watch-ACK;[^;]*;AB00030018C5[^ ]*7F0111","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7964,"Code":"F-ACK-Key Invalid","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":true,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Watch-ACK;<>;AB000300FFB5<>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":"^Watch-ACK;[^;]*;AB000300FFB5[^ ]*7F0116","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7963,"Code":"F-ACK-Encryption Invalid","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":true,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Watch-ACK;<>;AB0003007BF5<>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":"^Watch-ACK;[^;]*;AB0003007BF5[^ ]*7F0112","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7962,"Code":"F-ACK-Checksum Error","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":true,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Watch-ACK;<>;AB000300BD95<>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":"^Watch-ACK;[^;]*;AB000300BD95[^ ]*7F0114","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7961,"Code":"F-ACK-BLE Password","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":true,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Watch-ACK;<>;AB000300CC8F<>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":"^Watch-ACK;[^;]*;AB000300CC8F[^7;]*7F0140","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7960,"Code":"F-ACK-Address Resp","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":true,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Watch-ACK;<>;AB0003006262<>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":"^Watch-ACK;[^;]*;AB0003006262[^ ]*7F0128","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7959,"Code":"ACK-global","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":true,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Watch-ACK;<>;AB00030008C7<>7F0100","HasTemplateGlobal":false,"ResponseTemplate":"<>","TemplateGlobal":null,"LongConnection":true,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":false,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^Watch-ACK;[^;]*;AB00030008C7[^ ]*7F0100","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7958,"Code":"F-ACK-Invalid Parameter","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":true,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Watch-ACK;<>;AB000300EEA3<>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":"^Watch-ACK;[^;]*;AB000300EEA3[^ ]*7F0124","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7957,"Code":"F-ACK-Length Error","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":true,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Watch-ACK;<>;AB0003005AE5<>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":"^Watch-ACK;[^;]*;AB0003005AE5[^ ]*7F0113","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7956,"Code":"ALF-C","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Watch-ALF-C;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;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":"^Watch-ALF-C;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;GENERAL=[^;;]*;[^;]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7955,"Code":"ALNM","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":1,"Template":"Watch-ALNM;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;GENERAL=<>;<>","HasTemplateGlobal":false,"ResponseTemplate":"<>","TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^Watch-ALNM;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;GENERAL=[^;;]*;[^;]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7954,"Code":"ALSP","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":1,"Template":"Watch-ALSP;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;GENERAL=<>;<>","HasTemplateGlobal":false,"ResponseTemplate":"<>","TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^Watch-ALSP;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;GENERAL=[^;;]*;[^;]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7953,"Code":"RTL","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Watch-RTL;<>;<>;<>;<>;<>;<>;<>;<>;<>;","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":"^Watch-RTL;[^;]*;[^;;]*;[^;;]*;[^;;]*;[^;;]*;[^;;]*;[^;;]*;[^;;]*;[^;;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7952,"Code":"ALA-S","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Watch-ALA-S;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;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":"^Watch-ALA-S;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;GENERAL=[^;;]*;[^;]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7951,"Code":"STP","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Watch-STP;<>;STATUS=<>;ETIME=<>;GENERAL=<>;<>;STP=<>;LABEL=<>","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":"^Watch-STP;[^;]*;STATUS=[^;;]*;ETIME=[^;;]*;GENERAL=[^;;]*;[^;;]*;STP=[^;;]*;LABEL=[^=]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":7951,\"Code\":\"STP\",\"Name\":null,\"MessageCode\":\"STEPS\",\"NeedAck\":false,\"IsAck\":false,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":0,\"Template\":\"Watch-STP;<>;STATUS=<>;ETIME=<>;GENERAL=<>;<>;STP=<>;LABEL=<>\",\"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\":\"^Watch-STP;[^;]*;STATUS=[^;;]*;ETIME=[^;;]*;GENERAL=[^;;]*;[^;;]*;STP=[^;;]*;LABEL=[^=]*\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1765478967}],"Tags":[]},{"Id":7950,"Code":"BATL","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":1,"Template":"Watch-BATL;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;GENERAL=<>;<>","HasTemplateGlobal":false,"ResponseTemplate":"<>","TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^Watch-BATL;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;GENERAL=[^;;]*;[^;]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7949,"Code":"BATF","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Watch-BATF;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;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":"^Watch-BATF;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;GENERAL=[^;;]*;[^;]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7948,"Code":"ALMOV","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":1,"Template":"Watch-ALMOV;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;GENERAL=<>;<>","HasTemplateGlobal":false,"ResponseTemplate":"<>","TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^Watch-ALMOV;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;GENERAL=[^;;]*;[^;]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7947,"Code":"ALSOS","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":1,"Template":"Watch-ALSOS;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;GENERAL=<>;<>","HasTemplateGlobal":false,"ResponseTemplate":"<>","TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^Watch-ALSOS;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;GENERAL=[^;;]*;[^;]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7946,"Code":"F-ACK-No Memory","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":true,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Watch-ACK;<>;AB000300CFB3<>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":"^Watch-ACK;[^;]*;AB000300CFB3[^ ]*7F0125","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7945,"Code":"CHK","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Watch-HTB;<>;STATUS=<>;TIME=<>;BATP=<>;SIGNAL=<>;WM=<>;GENERAL=<>","HasTemplateGlobal":false,"ResponseTemplate":"<>","TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^Watch-HTB;[^;]*;STATUS=[^;;]*;TIME=[^;;]*;BATP=[^;;]*;SIGNAL=[^;;]*;WM=[^;;]*;GENERAL=[^=]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7944,"Code":"CYC","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Watch-CYC;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;SIGNAL=<>;WM=<>;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":"^Watch-CYC;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;SIGNAL=[^;;]*;WM=[^;;]*;GENERAL=[^=]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7942,"Code":"ALA","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":1,"Template":"Watch-ALA;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;GENERAL=<>;<>","HasTemplateGlobal":false,"ResponseTemplate":"<>","TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^Watch-ALA;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;GENERAL=[^;;]*;[^;]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7941,"Code":"F-ACK-Invalid State","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":true,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Watch-ACK;<>;AB00030009D3<>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":"^Watch-ACK;[^;]*;AB00030009D3[^ ]*7F0123","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7940,"Code":"F-ACK-SubFunction Not Supported","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":true,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Watch-ACK;<>;AB000300AC83<>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":"^Watch-ACK;[^;]*;AB000300AC83[^ ]*7F0126","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7939,"Code":"CHK-ASSO","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Eview-ASSOCIATE;<>;<>;","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\":7939,\"Code\":\"CON-ASSO\",\"Name\":null,\"MessageCode\":\"CON\",\"NeedAck\":false,\"IsAck\":false,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":0,\"Template\":\"Eview-ASSOCIATE;<>;<>;\",\"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":1749036744}],"Tags":[]},{"Id":7938,"Code":"F-ACK-Data Size Error","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":true,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Watch-ACK;<>;AB00030028C3<>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":"^Watch-ACK;[^;]*;AB00030028C3[^ ]*7F0122","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7937,"Code":"ZNI","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":1,"Template":"+RESP:ZIN,<>,<>,<>,<>,<>,<>,<>,<>$","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":7936,"Code":"F-ACK-GPS Is Not Ready","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":true,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Watch-ACK;<>;AB0003008D93<>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":"^Watch-ACK;[^;]*;AB0003008D93[^ ]*7F0127","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7935,"Code":"ZNO","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":1,"Template":"+RESP:ZOUT,<>,<>,<>,<>,<>,<>,<>,<>$","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":7934,"Code":"F-ACK-Key Length Error","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":true,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Watch-ACK;<>;AB000300DEA5<>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":"^Watch-ACK;[^;]*;AB000300DEA5[^ ]*7F0117","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7933,"Code":"F-ACK-Data Format Invalid","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":true,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Watch-ACK;<>;AB0003004BF3<>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":"^Watch-ACK;[^;]*;AB0003004BF3[^ ]*7F0121","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7932,"Code":"ACK-Out Of Service","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":true,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Watch-ACK;<>;AB0003005BF1<>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":"^Watch-ACK;[^;]*;AB0003005BF1[^ ]*7F0130","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7931,"Code":"F-ACK-Command Invalid","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":true,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Watch-ACK;<>;AB0003009C85<>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":"^Watch-ACK;[^;]*;AB0003009C85[^ ]*7F0115","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":8055,"Code":"ALA-F","Name":null,"MessageCode":"ALA-F","NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Watch-ALA-F;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;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":"^Watch-ALA-F;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;GENERAL=[^;;]*;[^;]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[{"Type":0,"NewValue":"{\"Id\":8055,\"Code\":\"ALA-F\",\"Name\":null,\"MessageCode\":\"ALA-F\",\"NeedAck\":false,\"IsAck\":false,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":0,\"Template\":\"Watch-ALA-F;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;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\":\"^Watch-ALA-F;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;GENERAL=[^;;]*;[^;]*\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1758220159},{"Type":1,"NewValue":"{\"Id\":8055,\"Code\":\"ALA-F\",\"Name\":null,\"MessageCode\":\"ALA-F\",\"NeedAck\":false,\"IsAck\":false,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":2,\"Template\":\"Watch-ALA-F;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;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\":\"^Watch-ALA-F;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;GENERAL=[^;;]*;[^;]*\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1758220240}],"Tags":[]},{"Id":8056,"Code":"ALA-TLT","Name":null,"MessageCode":"ALTLT","NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":1,"Template":"Watch-TLT;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;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":"^Watch-TLT;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;GENERAL=[^;;]*;[^;]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[{"Type":0,"NewValue":"{\"Id\":8056,\"Code\":\"ALA-TLT\",\"Name\":null,\"MessageCode\":\"ALTLT\",\"NeedAck\":false,\"IsAck\":false,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":1,\"Template\":\"Watch-TLT;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;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\":\"^Watch-TLT;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;GENERAL=[^;;]*;[^;]*\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1758220352}],"Tags":[]},{"Id":8057,"Code":"HBP","Name":null,"MessageCode":"HBP","NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Watch-HBP;<>;STATUS=<>;ETIME=<>;GENERAL=<>;<>;STP=<>;LABEL=<>","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":"^Watch-HBP;[^;]*;STATUS=[^;;]*;ETIME=[^;;]*;GENERAL=[^;;]*;[^;;]*;STP=[^;;]*;LABEL=[^=]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[{"Type":0,"NewValue":"{\"Id\":8057,\"Code\":\"HBP\",\"Name\":null,\"MessageCode\":\"HBP\",\"NeedAck\":false,\"IsAck\":false,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":0,\"Template\":\"Watch-HBP;<>;STATUS=<>;ETIME=<>;GENERAL=<>;<>;STP=<>;LABEL=<>\",\"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\":\"^Watch-HBP;[^;]*;STATUS=[^;;]*;ETIME=[^;;]*;GENERAL=[^;;]*;[^;;]*;STP=[^;;]*;LABEL=[^=]*\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1763492881},{"Type":1,"NewValue":"{\"Id\":8057,\"Code\":\"HBP\",\"Name\":null,\"MessageCode\":\"HBP\",\"NeedAck\":false,\"IsAck\":false,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":0,\"Template\":\"Watch-HBP;<>;STATUS=<>;ETIME=<>;GENERAL=<>;<>;SPO=<>;LABEL=<>\",\"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\":\"^Watch-HBP;[^;]*;STATUS=[^;;]*;ETIME=[^;;]*;GENERAL=[^;;]*;[^;;]*;SPO=[^;;]*;LABEL=[^=]*\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1763493293},{"Type":1,"NewValue":"{\"Id\":8057,\"Code\":\"SPO2\",\"Name\":null,\"MessageCode\":\"SPO2\",\"NeedAck\":false,\"IsAck\":false,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":0,\"Template\":\"Watch-SPO2;<>;STATUS=<>;ETIME=<>;GENERAL=<>;<>;SPO2=<>;LABEL=<>\",\"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\":\"^Watch-SPO2;[^;]*;STATUS=[^;;]*;ETIME=[^;;]*;GENERAL=[^;;]*;[^;;]*;SPO2=[^;;]*;LABEL=[^=]*\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1763494978},{"Type":1,"NewValue":"{\"Id\":8057,\"Code\":\"SPO2\",\"Name\":null,\"MessageCode\":\"SPO2\",\"NeedAck\":false,\"IsAck\":false,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":0,\"Template\":\"Watch-SPO2;<>;STATUS=<>;ETIME=<>;GENERAL=<>;<>;SPO2=<>;TLEVEL=<>;LABEL=<>\",\"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\":\"^Watch-SPO2;[^;]*;STATUS=[^;;]*;ETIME=[^;;]*;GENERAL=[^;;]*;[^;;]*;SPO2=[^;;]*;TLEVEL=[^;;]*;LABEL=[^=]*\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1763495262},{"Type":1,"NewValue":"{\"Id\":8057,\"Code\":\"SPO2\",\"Name\":null,\"MessageCode\":\"SPO2\",\"NeedAck\":false,\"IsAck\":false,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":0,\"Template\":\"Watch-SPO2;<>;STATUS=<>;ETIME=<>;GENERAL=<>;<>;SPO2=<>;TLEVEL=<>;LABEL=<>\",\"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\":\"^Watch-SPO2;[^;]*;STATUS=[^;;]*;ETIME=[^;;]*;GENERAL=[^;;]*;[^;;]*;SPO2=[^;;]*;TLEVEL=[^;;]*;LABEL=[^=]*\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1765478989}],"Tags":[]}],"Commands":[{"Id":5720,"Name":"actionDeviceReboot","TemplateSMS":"<>","Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n 0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\nvar configs = [];\r\nvar configsSMS = [];\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar command = '04';\r\nvar keyLength = '01';\r\nvar key = '12';\r\nvar messageBody = command + keyLength + key;\r\nvar checksum = byteStringToByteArray(messageBody);\r\nchecksum = crc16byte(checksum);\r\nchecksum = decimalToHex(checksum).toUpperCase();\r\nchecksum = ('0000' + checksum).slice(-4);\r\nchecksum = checksum.toString().substring(2, 4) + checksum.toString().substring(0, 2);\r\nvar prefix = 'AB10' + '0300' + checksum + sequenceID;\r\nvar data = prefix + messageBody;\r\n// For GPRS command\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\n// For SMS command\r\nvar dataSMS = 'reboot';\r\nAddValueSMS('dataSMS', dataSMS);\r\nvar commandConfigs = {\r\n template: \"main\",\r\n configs: configs,\r\n configsSMS: configsSMS\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n\r\nfunction AddValue(p1, p2) {\r\n var cvpair = {\r\n code: p1,\r\n value: p2\r\n };\r\n configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n var cvpair = {\r\n code: p1,\r\n value: p2\r\n };\r\n configsSMS.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n var arr1 = [];\r\n for (var n = 0, l = str.length; n < l; n++) {\r\n var hex = Number(str.charCodeAt(n)).toString(16);\r\n arr1.push(hex);\r\n }\r\n return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n var crc = 0x0000;\r\n var j, i;\r\n for (i = 0; i < s.length; i++) {\r\n c = s[i];\r\n if (c > 255) {\r\n throw new RangeError();\r\n }\r\n j = (c ^ (crc >> 8)) & 0xFF;\r\n crc = crcTable[j] ^ (crc << 8);\r\n }\r\n return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n var splitStr = []\r\n var j = 0\r\n for (let i = 0; i < str.length; i += 2) {\r\n splitStr[j] = str.substring(i, i + 2)\r\n j++\r\n }\r\n var bytes = []\r\n var bytePos = 0\r\n for (let i = 0; i < splitStr.length; i++) {\r\n var byteStr = splitStr[i]\r\n var b = parseInt(byteStr, 16)\r\n if (b < 256) {\r\n bytes[bytePos] = b\r\n bytePos++\r\n }\r\n }\r\n return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n hexString = str.toString(16);\r\n return hexString\r\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":2,"HasAck":true,"HexString":true,"Order":13,"SendAttempts":4,"ProtocolActionObjects":[],"Tags":[]},{"Id":5721,"Name":"setSOSOption","TemplateSMS":null,"Template":"<>","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":[],"Tags":[]},{"Id":5722,"Name":"setSpeedDialSettings","TemplateSMS":null,"Template":"<>","AckTemplate":null,"Operation":"var configs = [];\nvar crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\n 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\n 0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\n 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\n];\n//create the bit table to use with control\nvar value = '';\nif (params.SpeedDial.EnableDisableSpeedDial == 'true') {\n value += '10'; //Enable\n value += '0'; //Long Press\n /*if (params.SpeedDialButtonSettings.TriggerMode == '0') {\n value += '0';\n } else {\n value += '1';\n }*/\n value += '0010'; //Auth2 number\n var time = 20;\n value += ('0000000' + decimalToBinary(parseInt(time))).slice(-7);\n value += '11'; //feedback vibrate and voice\n /*if (params.SpeedDialButtonSettings.Feedback) {\n value += params.SpeedDialButtonSettings.Feedback;\n } else {\n value += '00';\n }*/\n} else {\n value = '0000000000000000';\n}\nvalue = ('0000' + binaryToHex(value)).slice(-4).toUpperCase();\nvalue = value.substring(2, 4) + value.substring(0, 2);\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\nvar command = '02';\nvar keyLength = '03';\nvar key = '21';\nvar messageBody = command + keyLength + key + value;\nvar checksum = byteStringToByteArray(messageBody);\nchecksum = crc16byte(checksum);\nchecksum = decimalToHex(checksum);\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\nchecksum = checksum.toString().substring(2, 4) + checksum.toString().substring(0, 2);\n//Hpw to calculate sequenceID\nvar prefix = 'AB10' + '0500' + checksum + sequenceID;\nvar data = prefix + messageBody;\nAddValue('data', data);\nAddValue('sequenceNumber', sequenceID); //add 20/07\nvar commandConfigs = {\n template: \"main\",\n configs: configs\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValue(p1, p2) {\n var cvpair = {\n code: p1,\n value: p2\n };\n configs.push(cvpair);\n}\n\nfunction ascii_to_hexa(str) {\n var arr1 = [];\n for (var n = 0, l = str.length; n < l; n++) {\n var hex = Number(str.charCodeAt(n)).toString(16);\n arr1.push(hex);\n }\n return arr1.join('');\n}\n\nfunction crc16byte(s) {\n var crc = 0x0000;\n var j, i;\n for (i = 0; i < s.length; i++) {\n c = s[i];\n if (c > 255) {\n throw new RangeError();\n }\n j = (c ^ (crc >> 8)) & 0xFF;\n crc = crcTable[j] ^ (crc << 8);\n }\n return ((crc ^ 0) & 0xFFFF);\n}\n\nfunction byteStringToByteArray(str) {\n var splitStr = []\n var j = 0\n for (let i = 0; i < str.length; i += 2) {\n splitStr[j] = str.substring(i, i + 2)\n j++\n }\n var bytes = []\n var bytePos = 0\n for (let i = 0; i < splitStr.length; i++) {\n var byteStr = splitStr[i]\n var b = parseInt(byteStr, 16)\n if (b < 256) {\n bytes[bytePos] = b\n bytePos++\n }\n }\n return bytes\n}\n\nfunction decimalToHex(str) {\n hexString = str.toString(16);\n return hexString\n}\n\nfunction decimalToBinary(x) {\n let bin = 0;\n let rem, i = 1,\n step = 1;\n while (x != 0) {\n rem = x % 2;\n x = parseInt(x / 2);\n bin = bin + rem * i;\n i = i * 10;\n }\n return bin\n}\n\nfunction binaryToHex(x) {\n var hexa = parseInt(x, 2).toString(16);\n return hexa\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":true,"Order":null,"SendAttempts":6,"ProtocolActionObjects":[],"Tags":[]},{"Id":5723,"Name":"setOystaNumber","TemplateSMS":null,"Template":"<>","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":5724,"Name":"setSMSPassword","TemplateSMS":null,"Template":"<>","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":5725,"Name":"setExtraEnableControl","TemplateSMS":null,"Template":"<>","AckTemplate":null,"Operation":"var configs = [];\r\nvar crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n 0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\n//create the bit table to use with control\r\nvar value = '';\r\n// Wifi loc name EV07, beacon leaves home alert, beacon V2, BLE scan switch,\r\n// XXX, no motion alert data only EV05, power saving EV06, Stop alert call sequence.\r\nvalue += '0000000';\r\nif (params.EnableControl.StopCallSequence == 'true') {\r\n value += '1';\r\n} else {\r\n value += '0';\r\n}\r\nvalue = reverseString(value);\r\n\r\nfunction reverseString(str) {\r\n var newString = \"\";\r\n for (var i = str.length - 1; i >= 0; i--) {\r\n newString += str[i];\r\n }\r\n return newString;\r\n}\r\nvalue = ('00000000' + binaryToHex(value)).slice(-8).toUpperCase();\r\nvalue = changeEndianness(value);\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar command = '02';\r\nvar keyLength = '05';\r\nvar key = '75';\r\nvar messageBody = command + keyLength + key + value;\r\nvar checksum = byteStringToByteArray(messageBody);\r\nchecksum = crc16byte(checksum);\r\nchecksum = decimalToHex(checksum);\r\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\r\nchecksum = changeEndianness(checksum);\r\n//How to calculate sequenceID\r\nvar prefix = 'AB10' + '0700' + checksum + sequenceID;\r\nvar data = prefix + messageBody;\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID); //add 20/07\r\nvar commandConfigs = {\r\n template: \"main\",\r\n configs: configs\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n\r\nfunction AddValue(p1, p2) {\r\n var cvpair = {\r\n code: p1,\r\n value: p2\r\n };\r\n configs.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n var arr1 = [];\r\n for (var n = 0, l = str.length; n < l; n++) {\r\n var hex = Number(str.charCodeAt(n)).toString(16);\r\n arr1.push(hex);\r\n }\r\n return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n var crc = 0x0000;\r\n var j, i;\r\n for (i = 0; i < s.length; i++) {\r\n c = s[i];\r\n if (c > 255) {\r\n throw new RangeError();\r\n }\r\n j = (c ^ (crc >> 8)) & 0xFF;\r\n crc = crcTable[j] ^ (crc << 8);\r\n }\r\n return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n var splitStr = []\r\n var j = 0\r\n for (let i = 0; i < str.length; i += 2) {\r\n splitStr[j] = str.substring(i, i + 2)\r\n j++\r\n }\r\n var bytes = []\r\n var bytePos = 0\r\n for (let i = 0; i < splitStr.length; i++) {\r\n var byteStr = splitStr[i]\r\n var b = parseInt(byteStr, 16)\r\n if (b < 256) {\r\n bytes[bytePos] = b\r\n bytePos++\r\n }\r\n }\r\n return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n hexString = str.toString(16);\r\n return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n let bin = 0;\r\n let rem, i = 1,\r\n step = 1;\r\n while (x != 0) {\r\n rem = x % 2;\r\n x = parseInt(x / 2);\r\n bin = bin + rem * i;\r\n i = i * 10;\r\n }\r\n return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n var hexa = parseInt(x, 2).toString(16);\r\n return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n const result = [];\r\n let len = string.length - 2;\r\n while (len >= 0) {\r\n result.push(string.substr(len, 2));\r\n len -= 2;\r\n }\r\n return result.join('');\r\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":true,"Order":null,"SendAttempts":2,"ProtocolActionObjects":[],"Tags":[]},{"Id":5726,"Name":"setHeartRateDetectingInterval","TemplateSMS":null,"Template":"<>","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":[{"Type":1,"NewValue":"{\"Id\":5726,\"Name\":\"setHeartRateDetectingInterval\",\"TemplateSMS\":null,\"Template\":\"<>\",\"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.HeartrateSettings.ReportingFrequency) {\\n var heartBeat = parseInt(params.HeartrateSettings.ReportingFrequency);\\n heartBeat = decimalToHex(heartBeat);\\n heartBeat = ('000000' + heartBeat).slice(-6).toUpperCase();\\n if (params.HeartrateSettings.EnableDisableHeartrateSettings == '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 = '58020000'\\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\":[]}","Timestamp":1748971251},{"Type":1,"NewValue":"{\"Id\":5726,\"Name\":\"setHeartRateDetectingInterval\",\"TemplateSMS\":null,\"Template\":\"<>\",\"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.HeartrateSettings.ReportingFrequency) {\\n var heartBeat = parseInt(params.HeartrateSettings.ReportingFrequency) * 60; //in seconds\\n heartBeat = decimalToHex(heartBeat);\\n heartBeat = ('000000' + heartBeat).slice(-6).toUpperCase();\\n if (params.HeartrateSettings.EnableDisableHeartrateSettings == '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 = '58020000'\\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\":[]}","Timestamp":1749057629}],"Tags":[]},{"Id":5727,"Name":"setFallDownAlert","TemplateSMS":null,"Template":"<>","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":5728,"Name":"setSOSButtonSettings","TemplateSMS":null,"Template":"<>","AckTemplate":null,"Operation":"var configs = [];\nvar crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\n 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\n 0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\n 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\n];\n//create the bit table to use with control\nvar value = '';\nif (params.SOSButtonSettings.EnableDisableSOSButtonSettings == 'true') {\n value += '10';\n if (params.SOSButtonSettings.TriggerMode == '0') {\n value += '0';\n } else {\n value += '1';\n }\n /*\n if (params.SOSButtonSettings.CallTo == '0'){\n value += '0001'\n }else { \n value += '0000'\n }\n */\n value += '1111'; //SOS task (Default) Standard\n var time = 20;\n value += ('0000000' + decimalToBinary(parseInt(time))).slice(-7);\n if (params.SOSButtonSettings.Feedback) {\n value += params.SOSButtonSettings.Feedback;\n } else {\n value += '00';\n }\n} else {\n value = '0000000000000000';\n}\nvalue = ('0000' + binaryToHex(value)).slice(-4).toUpperCase();\nvalue = value.substring(2, 4) + value.substring(0, 2);\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\nvar command = '02';\nvar keyLength = '03';\nvar key = '20';\nvar messageBody = command + keyLength + key + value;\nvar checksum = byteStringToByteArray(messageBody);\nchecksum = crc16byte(checksum);\nchecksum = decimalToHex(checksum);\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\nchecksum = checksum.toString().substring(2, 4) + checksum.toString().substring(0, 2);\n//Hpw to calculate sequenceID\nvar prefix = 'AB10' + '0500' + checksum + sequenceID;\nvar data = prefix + messageBody;\nAddValue('data', data);\nAddValue('sequenceNumber', sequenceID);\nvar commandConfigs = {\n template: \"main\",\n configs: configs\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValue(p1, p2) {\n var cvpair = {\n code: p1,\n value: p2\n };\n configs.push(cvpair);\n}\n\nfunction ascii_to_hexa(str) {\n var arr1 = [];\n for (var n = 0, l = str.length; n < l; n++) {\n var hex = Number(str.charCodeAt(n)).toString(16);\n arr1.push(hex);\n }\n return arr1.join('');\n}\n\nfunction crc16byte(s) {\n var crc = 0x0000;\n var j, i;\n for (i = 0; i < s.length; i++) {\n c = s[i];\n if (c > 255) {\n throw new RangeError();\n }\n j = (c ^ (crc >> 8)) & 0xFF;\n crc = crcTable[j] ^ (crc << 8);\n }\n return ((crc ^ 0) & 0xFFFF);\n}\n\nfunction byteStringToByteArray(str) {\n var splitStr = [];\n var j = 0;\n for (let i = 0; i < str.length; i += 2) {\n splitStr[j] = str.substring(i, i + 2);\n j++;\n }\n var bytes = [];\n var bytePos = 0;\n for (let i = 0; i < splitStr.length; i++) {\n var byteStr = splitStr[i];\n var b = parseInt(byteStr, 16);\n if (b < 256) {\n bytes[bytePos] = b;\n bytePos++;\n }\n }\n return bytes;\n}\n\nfunction decimalToHex(str) {\n hexString = str.toString(16);\n return hexString;\n}\n\nfunction decimalToBinary(x) {\n let bin = 0;\n let rem, i = 1,\n step = 1;\n while (x !== 0) {\n rem = x % 2;\n x = parseInt(x / 2);\n bin = bin + rem * i;\n i = i * 10;\n }\n return bin;\n}\n\nfunction binaryToHex(x) {\n var hexa = parseInt(x, 2).toString(16);\n return hexa;\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":true,"Order":null,"SendAttempts":6,"ProtocolActionObjects":[],"Tags":[]},{"Id":5729,"Name":"setEnableControl","TemplateSMS":null,"Template":"<>","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":[],"Tags":[]},{"Id":5731,"Name":"setAlarmClock4","TemplateSMS":null,"Template":"<>","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":5732,"Name":"setAlarmClock3","TemplateSMS":null,"Template":"<>","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":5733,"Name":"setAlarmClock2","TemplateSMS":null,"Template":"<>","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":5734,"Name":"setCustom ID","TemplateSMS":null,"Template":"<>","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":[],"Tags":[]},{"Id":5735,"Name":"setHomeBeacon","TemplateSMS":"<>","Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\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":[],"Tags":[]},{"Id":5736,"Name":"setSystemLanguage","TemplateSMS":"<>","Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\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":5737,"Name":"setNoMotionAlert","TemplateSMS":null,"Template":"<>","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":5738,"Name":"setContinuousLocate","TemplateSMS":null,"Template":"<>","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":[],"Tags":[]},{"Id":5739,"Name":"setStepCollectSettings","TemplateSMS":null,"Template":"<>","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":[{"Type":1,"NewValue":"{\"Id\":5739,\"Name\":\"setStepCollectSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"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.StepsSettings.ReportingFrequency) {\\n var heartBeat = parseInt(params.StepsSettings.ReportingFrequency);\\n heartBeat = decimalToHex(heartBeat);\\n heartBeat = ('000000' + heartBeat).slice(-6).toUpperCase();\\n if (params.StepsSettings.EnableDisableStepsSettings == '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 = '58020000';\\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\":[]}","Timestamp":1748972510},{"Type":1,"NewValue":"{\"Id\":5739,\"Name\":\"setStepCollectSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"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.StepsSettings.ReportingFrequency) {\\n var heartBeat = parseInt(params.StepsSettings.ReportingFrequency) * 60; //in seconds\\n heartBeat = decimalToHex(heartBeat);\\n heartBeat = ('000000' + heartBeat).slice(-6).toUpperCase();\\n if (params.StepsSettings.EnableDisableStepsSettings == '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 = '58020000';\\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\":[]}","Timestamp":1749057591}],"Tags":[]},{"Id":5740,"Name":"setSMSGatewayNumber","TemplateSMS":null,"Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\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":5741,"Name":"getHomeBeacon","TemplateSMS":null,"Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\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":5742,"Name":"setSystemSettings","TemplateSMS":null,"Template":"<>","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":[],"Tags":[]},{"Id":5743,"Name":"getAuthorisedNumbers","TemplateSMS":null,"Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\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":5744,"Name":"setServerSMS","TemplateSMS":"<>","Template":"<>","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":5745,"Name":"setEmergencyNumberbySMS","TemplateSMS":"<>","Template":"<>","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":5746,"Name":"setBeacons","TemplateSMS":null,"Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\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":5747,"Name":"setFallSensitivitybySMS","TemplateSMS":"<>","Template":"<>","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":5748,"Name":"setOverSpeedAlert","TemplateSMS":null,"Template":"<>","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":5749,"Name":"setAPNSMS","TemplateSMS":"<>","Template":"<>","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":5750,"Name":"setPerformanceMode","TemplateSMS":"<>","Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n 0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\n//Añadir comando para poner modo6 ??\r\nvar configs = [];\r\nvar configsSMS = [];\r\nvar command = '02';\r\nvar keyLength = '0D';\r\nvar key = '44'; // Time interval command\r\nvar cycleInterval = 60;\r\nvar lazyCycleInterval = 60;\r\nvar heartBeatStatus = '00000000'; //heartbeat OFF and heartBeat = 0; heartbeat ON and heartBeat = 240 F0000080; \r\nvar selectedMode = '2'; // Balanced mode\r\nif (params.PerformanceSettings.Mode) {\r\n selectedMode = params.PerformanceSettings.Mode;\r\n}\r\nvar value = '000000'; // Time interval to zero\r\nswitch (selectedMode) {\r\n case '0': // No reporting\r\n cycleInterval = 86400; // Time interval to 24 hrs \r\n lazyCycleInterval = 86400; // Lazy Time interval to 24 hrs \r\n // HB = 0\r\n break;\r\n case '1': //Power Saving\r\n cycleInterval = 28800; // Time interval to 8 hrs \r\n lazyCycleInterval = 43200; // Lazy Time interval to 12 hrs \r\n // HB = 0\r\n break;\r\n case '2': //Balanced\r\n cycleInterval = 600; // Time interval to 10 min \r\n lazyCycleInterval = 3600; // Lazy Time interval to 1 hrs \r\n //heartBeatStatus = 'F0000080'; //heartbeat ON and heartBeat = 240\r\n break;\r\n case '3': //High Freq\r\n cycleInterval = 240; // Time interval to 4 min \r\n lazyCycleInterval = 3600; // Lazy Time interval to 1 hrs\r\n //heartBeatStatus = 'F0000080'; //heartbeat ON and heartBeat = 240 \r\n break;\r\n default:\r\n var value = '000000'; // Time interval to zero\r\n //var valueSMS = '';\r\n}\r\n//Sms Value\r\nvar valueSMS = ',' + cycleInterval + 'S,' + lazyCycleInterval + 'S';\r\nvar value = parseInt(cycleInterval);\r\nif (params.Controls.ConfigurationMode == 'true') {\r\n heartBeatStatus = '3C000080'; //heartbeat ON and heartBeat = 60;\r\n} else {\r\n heartBeatStatus = 'F0000080'; //heartbeat ON and heartBeat = 240; \r\n}\r\nvalue = decimalToHex(value);\r\nvalue = ('000000' + value).slice(-6).toUpperCase();\r\nvalue = value.substring(4, 6) + value.substring(2, 4) + value.substring(0, 2);\r\nvar valueLazy = parseInt(lazyCycleInterval);\r\nvar valueLazy = decimalToHex(valueLazy);\r\nvalueLazy = ('000000' + valueLazy).slice(-6).toUpperCase();\r\nvalueLazy = valueLazy.substring(4, 6) + valueLazy.substring(2, 4) + valueLazy.substring(0, 2);\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar messageBody = command + keyLength + key + heartBeatStatus + value + '00' + valueLazy + '00';\r\nvar checksum = byteStringToByteArray(messageBody);\r\nchecksum = crc16byte(checksum);\r\nchecksum = decimalToHex(checksum);\r\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\r\nchecksum = checksum.toString().substring(2, 4) + checksum.toString().substring(0, 2);\r\n//How to calculate sequenceID\r\nvar prefix = 'AB10' + '0F00' + checksum + sequenceID;\r\nvar data = prefix + messageBody;\r\n// For GPRS command\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\n// For SMS command\r\nvar dataSMS = 'mode6' + valueSMS;\r\nAddValueSMS('dataSMS', dataSMS);\r\n//debug(data);\r\n//debug(dataSMS);\r\nvar commandConfigs = {\r\n template: \"main\",\r\n configs: configs,\r\n configsSMS: configsSMS\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n\r\nfunction AddValue(p1, p2) {\r\n var cvpair = {\r\n code: p1,\r\n value: p2\r\n };\r\n configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n var cvpair = {\r\n code: p1,\r\n value: p2\r\n };\r\n configsSMS.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n var arr1 = [];\r\n for (var n = 0, l = str.length; n < l; n++) {\r\n var hex = Number(str.charCodeAt(n)).toString(16);\r\n arr1.push(hex);\r\n }\r\n return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n var crc = 0x0000;\r\n var j, i;\r\n for (i = 0; i < s.length; i++) {\r\n c = s[i];\r\n if (c > 255) {\r\n throw new RangeError();\r\n }\r\n j = (c ^ (crc >> 8)) & 0xFF;\r\n crc = crcTable[j] ^ (crc << 8);\r\n }\r\n return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n var splitStr = []\r\n var j = 0\r\n for (let i = 0; i < str.length; i += 2) {\r\n splitStr[j] = str.substring(i, i + 2)\r\n j++\r\n }\r\n var bytes = []\r\n var bytePos = 0\r\n for (let i = 0; i < splitStr.length; i++) {\r\n var byteStr = splitStr[i]\r\n var b = parseInt(byteStr, 16)\r\n if (b < 256) {\r\n bytes[bytePos] = b\r\n bytePos++\r\n }\r\n }\r\n return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n hexString = str.toString(16);\r\n return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n let bin = 0;\r\n let rem, i = 1,\r\n step = 1;\r\n while (x != 0) {\r\n rem = x % 2;\r\n x = parseInt(x / 2);\r\n bin = bin + rem * i;\r\n i = i * 10;\r\n }\r\n return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n var hexa = parseInt(x, 2).toString(16);\r\n return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n const result = [];\r\n let len = string.length - 2;\r\n while (len >= 0) {\r\n result.push(string.substr(len, 2));\r\n len -= 2;\r\n }\r\n return result.join('');\r\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":true,"Order":null,"SendAttempts":2,"ProtocolActionObjects":[],"Tags":[]},{"Id":5751,"Name":"setAlarmClock1","TemplateSMS":null,"Template":"<>","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":5752,"Name":"setSpeakerVolume","TemplateSMS":null,"Template":"<>","AckTemplate":null,"Operation":"var configs = [];\nvar crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\n 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\n 0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\n 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\n];\nif (params.SystemSettings.Volume) {\n var volume = parseInt(params.SystemSettings.Volume)\n volume = decimalToHex(volume)\n volume = ('00' + volume).slice(-2).toUpperCase()\n}\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase()\nvar command = '02'\nvar keyLength = '02'\nvar key = '12'\nvar messageBody = command + keyLength + key + volume\nvar checksum = byteStringToByteArray(messageBody)\nchecksum = crc16byte(checksum)\nchecksum = decimalToHex(checksum).toUpperCase()\nchecksum = ('0000' + checksum).slice(-4)\nchecksum = checksum.toString().substring(2, 4) + checksum.toString().substring(0, 2)\n//Hpw to calculate sequenceID\nvar prefix = 'AB10' + '0400' + checksum + sequenceID\nvar data = prefix + messageBody\nAddValue('data', data);\nAddValue('sequenceNumber', sequenceID); //add 20/07\nvar commandConfigs = {\n template: \"main\",\n configs: configs\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValue(p1, p2) {\n var cvpair = {\n code: p1,\n value: p2\n };\n configs.push(cvpair);\n}\n\nfunction ascii_to_hexa(str) {\n var arr1 = [];\n for (var n = 0, l = str.length; n < l; n++) {\n var hex = Number(str.charCodeAt(n)).toString(16);\n arr1.push(hex);\n }\n return arr1.join('');\n}\n\nfunction crc16byte(s) {\n var crc = 0x0000;\n var j, i;\n for (i = 0; i < s.length; i++) {\n c = s[i];\n if (c > 255) {\n throw new RangeError();\n }\n j = (c ^ (crc >> 8)) & 0xFF;\n crc = crcTable[j] ^ (crc << 8);\n }\n return ((crc ^ 0) & 0xFFFF);\n}\n\nfunction byteStringToByteArray(str) {\n var splitStr = []\n var j = 0\n for (let i = 0; i < str.length; i += 2) {\n splitStr[j] = str.substring(i, i + 2)\n j++\n }\n var bytes = []\n var bytePos = 0\n for (let i = 0; i < splitStr.length; i++) {\n var byteStr = splitStr[i]\n var b = parseInt(byteStr, 16)\n if (b < 256) {\n bytes[bytePos] = b\n bytePos++\n }\n }\n return bytes\n}\n\nfunction decimalToHex(str) {\n hexString = str.toString(16);\n return hexString\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":true,"Order":null,"SendAttempts":2,"ProtocolActionObjects":[],"Tags":[]},{"Id":5753,"Name":"setNoDisturb","TemplateSMS":null,"Template":"<>","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":5754,"Name":"setMotionAlert","TemplateSMS":null,"Template":"<>","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":5755,"Name":"setCycle","TemplateSMS":null,"Template":"<>","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":5756,"Name":"setVoicePrompt","TemplateSMS":null,"Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\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":5757,"Name":"setGatewayNumberbySMS","TemplateSMS":"<>","Template":"<>","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":5758,"Name":"setTiltAlertSettings","TemplateSMS":null,"Template":"<>","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":5759,"Name":"setRingToneVolume","TemplateSMS":null,"Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\n 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\n 0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\n 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\n];\nvar configs = [];\nif (params.SystemSettings.Volume) {\n var volume = parseInt(params.SystemSettings.Volume);\n volume = decimalToHex(parseInt(volume));\n volume = ('00' + volume).slice(-2);\n}\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\nvar command = '02';\nvar keyLength = '02';\nvar key = '10';\nvar messageBody = command + keyLength + key + volume;\nvar checksum = byteStringToByteArray(messageBody);\nchecksum = crc16byte(checksum);\nchecksum = decimalToHex(checksum).toUpperCase();\nchecksum = ('0000' + checksum).slice(-4);\nchecksum = checksum.toString().substring(2, 4) + checksum.toString().substring(0, 2);\n//Hpw to calculate sequenceID // change to AB10 from AB18\nvar prefix = 'AB10' + '0400' + checksum + sequenceID;\nvar data = prefix + messageBody;\nAddValue('data', data);\nAddValue('sequenceNumber', sequenceID); //add 20/07\n//var commandConfigs = {\nvar commandConfigs = {\n template: \"main\",\n configs: configs\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValue(p1, p2) {\n var cvpair = {\n code: p1,\n value: p2\n };\n configs.push(cvpair);\n}\n\nfunction ascii_to_hexa(str) {\n var arr1 = [];\n for (var n = 0, l = str.length; n < l; n++) {\n var hex = Number(str.charCodeAt(n)).toString(16);\n arr1.push(hex);\n }\n return arr1.join('');\n}\n\nfunction crc16byte(s) {\n var crc = 0x0000;\n var j, i;\n for (i = 0; i < s.length; i++) {\n c = s[i];\n if (c > 255) {\n throw new RangeError();\n }\n j = (c ^ (crc >> 8)) & 0xFF;\n crc = crcTable[j] ^ (crc << 8);\n }\n return ((crc ^ 0) & 0xFFFF);\n}\n\nfunction byteStringToByteArray(str) {\n var splitStr = [];\n var j = 0;\n for (let i = 0; i < str.length; i += 2) {\n splitStr[j] = str.substring(i, i + 2)\n j++\n }\n var bytes = []\n var bytePos = 0\n for (let i = 0; i < splitStr.length; i++) {\n var byteStr = splitStr[i]\n var b = parseInt(byteStr, 16)\n if (b < 256) {\n bytes[bytePos] = b\n bytePos++\n }\n }\n return bytes\n}\n\nfunction decimalToHex(str) {\n hexString = str.toString(16);\n return hexString\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":true,"Order":null,"SendAttempts":2,"ProtocolActionObjects":[],"Tags":[]},{"Id":5760,"Name":"setPhoneSettings","TemplateSMS":null,"Template":"<>","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":5761,"Name":"getCurrentSettings5","TemplateSMS":"<>","Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n 0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\nvar msg = [];\r\nvar configs = [];\r\nvar configsSMS = [];\r\n// Contacts, APN, server details, fall sensitivity and Beacon List\r\nvar dataSMS = 'GPRS?'; // Check Server Details\r\n/*GRPS: ON\r\nAPN: internet\r\nUsername:\r\nPassword:\r\nIP: 1, www.smart-locator.com\r\nPort: 6060\r\nMove report time: 30 minutes\r\nNo move report time: 60 minutes\r\nHB: on, 20 minutes */\r\nvar data = ''; // empty\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar notSend = false;\r\nif (isForcedBySMS == 'False' && ((serverParams.CommandType == 'ByGPRS') || (serverParams.CommandType == 'Default' && ((serverParams.ParentCommandType == 'ByGPRS') || (serverParams.ParentCommandType == 'Default' && serverParams.ConfigType == 'GPRS') || (serverParams.ParentCommandType === null && serverParams.ConfigType == 'GPRS'))))) {\r\n notSend = true;\r\n}\r\n// For GPRS command\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\n// For SMS command\r\nAddValueSMS('dataSMS', dataSMS);\r\nvar commandConfigs = {\r\n template: \"main\",\r\n configs: configs,\r\n configsSMS: configsSMS,\r\n notSend: notSend\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n// functions\r\nfunction AddValue(p1, p2) {\r\n var cvpair = {\r\n code: p1,\r\n value: p2\r\n };\r\n configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n var cvpair = {\r\n code: p1,\r\n value: p2\r\n };\r\n configsSMS.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n var arr1 = [];\r\n for (var n = 0, l = str.length; n < l; n++) {\r\n var hex = Number(str.charCodeAt(n)).toString(16);\r\n arr1.push(hex);\r\n }\r\n return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n var crc = 0x0000;\r\n var j, i;\r\n for (i = 0; i < s.length; i++) {\r\n c = s[i];\r\n if (c > 255) {\r\n throw new RangeError();\r\n }\r\n j = (c ^ (crc >> 8)) & 0xFF;\r\n crc = crcTable[j] ^ (crc << 8);\r\n }\r\n return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n var splitStr = []\r\n var j = 0\r\n for (let i = 0; i < str.length; i += 2) {\r\n splitStr[j] = str.substring(i, i + 2)\r\n j++\r\n }\r\n var bytes = []\r\n var bytePos = 0\r\n for (let i = 0; i < splitStr.length; i++) {\r\n var byteStr = splitStr[i]\r\n var b = parseInt(byteStr, 16)\r\n if (b < 256) {\r\n bytes[bytePos] = b\r\n bytePos++\r\n }\r\n }\r\n return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n hexString = str.toString(16);\r\n return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n let bin = 0;\r\n let rem, i = 1,\r\n step = 1;\r\n while (x != 0) {\r\n rem = x % 2;\r\n x = parseInt(x / 2);\r\n bin = bin + rem * i;\r\n i = i * 10;\r\n }\r\n return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n var hexa = parseInt(x, 2).toString(16);\r\n return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n const result = [];\r\n let len = string.length - 2;\r\n while (len >= 0) {\r\n result.push(string.substr(len, 2));\r\n len -= 2;\r\n }\r\n return result.join('');\r\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":true,"SendingType":0,"HasAck":true,"HexString":true,"Order":21,"SendAttempts":4,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":5761,\"Name\":\"getCurrentSettings5\",\"TemplateSMS\":\"<>\",\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\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\":5765,\"Protocol\":{\"Id\":297,\"Code\":\"Access TEC Care Watch\",\"Version\":\"0.2\",\"FirmwareVersion\":\"\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"getCurrentSettings\",\"TemplateSMS\":\"<>\",\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\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 = '1A73344041424356101F44534733'; //1A73\\r\\n// Firmware Long, Contacts, APNusername, APNpass, server details, fall sensitivity and Beacon List, Fall down alert, Ring tome vol,System language, time interval, No motion alert,custom id, allow list\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\nvar command = '02';\\r\\n//var keyLength = '10'; // previous\\r\\nvar keyLength = '0F'; //+1 qnt of commands\\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' + '1100' + checksum + sequenceID; // add 2 to keylenght\\r\\nvar data = prefix + messageBody;\\r\\n// For GPRS command\\r\\nAddValue('data', data);\\r\\nAddValue('sequenceNumber', sequenceID);\\r\\n// For SMS command\\r\\nAddValueSMS('dataSMS', dataSMS);\\r\\nvar commandConfigs = {\\r\\n template: \\\"main\\\",\\r\\n configs: configs,\\r\\n configsSMS: configsSMS\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n// functions\\r\\nfunction AddValue(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n var arr1 = [];\\r\\n for (var n = 0, l = str.length; n < l; n++) {\\r\\n var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n arr1.push(hex);\\r\\n }\\r\\n return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n var crc = 0x0000;\\r\\n var j, i;\\r\\n for (i = 0; i < s.length; i++) {\\r\\n c = s[i];\\r\\n if (c > 255) {\\r\\n throw new RangeError();\\r\\n }\\r\\n j = (c ^ (crc >> 8)) & 0xFF;\\r\\n crc = crcTable[j] ^ (crc << 8);\\r\\n }\\r\\n return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n var splitStr = []\\r\\n var j = 0\\r\\n for (let i = 0; i < str.length; i += 2) {\\r\\n splitStr[j] = str.substring(i, i + 2)\\r\\n j++\\r\\n }\\r\\n var bytes = []\\r\\n var bytePos = 0\\r\\n for (let i = 0; i < splitStr.length; i++) {\\r\\n var byteStr = splitStr[i]\\r\\n var b = parseInt(byteStr, 16)\\r\\n if (b < 256) {\\r\\n bytes[bytePos] = b\\r\\n bytePos++\\r\\n }\\r\\n }\\r\\n return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n hexString = str.toString(16);\\r\\n return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n let bin = 0;\\r\\n let rem, i = 1,\\r\\n step = 1;\\r\\n while (x != 0) {\\r\\n rem = x % 2;\\r\\n x = parseInt(x / 2);\\r\\n bin = bin + rem * i;\\r\\n i = i * 10;\\r\\n }\\r\\n return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n var hexa = parseInt(x, 2).toString(16);\\r\\n return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n const result = [];\\r\\n let len = string.length - 2;\\r\\n while (len >= 0) {\\r\\n result.push(string.substr(len, 2));\\r\\n len -= 2;\\r\\n }\\r\\n return result.join('');\\r\\n}\",\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":true,\"SendAttempts\":4,\"Order\":17},\"AvoidResending\":false,\"FollowParentSentType\":true,\"SendingType\":0,\"HasAck\":true,\"HexString\":true,\"Order\":21,\"SendAttempts\":4,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1748863982}],"Tags":[]},{"Id":5762,"Name":"getCurrentSettings4","TemplateSMS":"<>","Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n 0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\nvar msg = [];\r\nvar configs = [];\r\nvar configsSMS = [];\r\n// Contacts, APN, server details, fall sensitivity and Beacon List\r\nvar dataSMS = 'A?'; // Check Contact List\r\n/* A1: 1,1,15899795842\r\nA2: 1,0,13632770106\r\nA3: 0,1,15986236978 */\r\nvar data = ''; // empty\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar notSend = false;\r\nif (isForcedBySMS == 'False' && ((serverParams.CommandType == 'ByGPRS') || (serverParams.CommandType == 'Default' && ((serverParams.ParentCommandType == 'ByGPRS') || (serverParams.ParentCommandType == 'Default' && serverParams.ConfigType == 'GPRS') || (serverParams.ParentCommandType === null && serverParams.ConfigType == 'GPRS'))))) {\r\n notSend = true;\r\n}\r\n// For GPRS command\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\n// For SMS command\r\nAddValueSMS('dataSMS', dataSMS);\r\nvar commandConfigs = {\r\n template: \"main\",\r\n configs: configs,\r\n configsSMS: configsSMS,\r\n notSend: notSend\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n// functions\r\nfunction AddValue(p1, p2) {\r\n var cvpair = {\r\n code: p1,\r\n value: p2\r\n };\r\n configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n var cvpair = {\r\n code: p1,\r\n value: p2\r\n };\r\n configsSMS.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n var arr1 = [];\r\n for (var n = 0, l = str.length; n < l; n++) {\r\n var hex = Number(str.charCodeAt(n)).toString(16);\r\n arr1.push(hex);\r\n }\r\n return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n var crc = 0x0000;\r\n var j, i;\r\n for (i = 0; i < s.length; i++) {\r\n c = s[i];\r\n if (c > 255) {\r\n throw new RangeError();\r\n }\r\n j = (c ^ (crc >> 8)) & 0xFF;\r\n crc = crcTable[j] ^ (crc << 8);\r\n }\r\n return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n var splitStr = []\r\n var j = 0\r\n for (let i = 0; i < str.length; i += 2) {\r\n splitStr[j] = str.substring(i, i + 2)\r\n j++\r\n }\r\n var bytes = []\r\n var bytePos = 0\r\n for (let i = 0; i < splitStr.length; i++) {\r\n var byteStr = splitStr[i]\r\n var b = parseInt(byteStr, 16)\r\n if (b < 256) {\r\n bytes[bytePos] = b\r\n bytePos++\r\n }\r\n }\r\n return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n hexString = str.toString(16);\r\n return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n let bin = 0;\r\n let rem, i = 1,\r\n step = 1;\r\n while (x != 0) {\r\n rem = x % 2;\r\n x = parseInt(x / 2);\r\n bin = bin + rem * i;\r\n i = i * 10;\r\n }\r\n return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n var hexa = parseInt(x, 2).toString(16);\r\n return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n const result = [];\r\n let len = string.length - 2;\r\n while (len >= 0) {\r\n result.push(string.substr(len, 2));\r\n len -= 2;\r\n }\r\n return result.join('');\r\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":true,"SendingType":0,"HasAck":true,"HexString":true,"Order":20,"SendAttempts":4,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":5762,\"Name\":\"getCurrentSettings4\",\"TemplateSMS\":\"<>\",\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\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\":5765,\"Protocol\":{\"Id\":297,\"Code\":\"Access TEC Care Watch\",\"Version\":\"0.2\",\"FirmwareVersion\":\"\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"getCurrentSettings\",\"TemplateSMS\":\"<>\",\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\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 = '1A73344041424356101F44534733'; //1A73\\r\\n// Firmware Long, Contacts, APNusername, APNpass, server details, fall sensitivity and Beacon List, Fall down alert, Ring tome vol,System language, time interval, No motion alert,custom id, allow list\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\nvar command = '02';\\r\\n//var keyLength = '10'; // previous\\r\\nvar keyLength = '0F'; //+1 qnt of commands\\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' + '1100' + checksum + sequenceID; // add 2 to keylenght\\r\\nvar data = prefix + messageBody;\\r\\n// For GPRS command\\r\\nAddValue('data', data);\\r\\nAddValue('sequenceNumber', sequenceID);\\r\\n// For SMS command\\r\\nAddValueSMS('dataSMS', dataSMS);\\r\\nvar commandConfigs = {\\r\\n template: \\\"main\\\",\\r\\n configs: configs,\\r\\n configsSMS: configsSMS\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n// functions\\r\\nfunction AddValue(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n var arr1 = [];\\r\\n for (var n = 0, l = str.length; n < l; n++) {\\r\\n var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n arr1.push(hex);\\r\\n }\\r\\n return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n var crc = 0x0000;\\r\\n var j, i;\\r\\n for (i = 0; i < s.length; i++) {\\r\\n c = s[i];\\r\\n if (c > 255) {\\r\\n throw new RangeError();\\r\\n }\\r\\n j = (c ^ (crc >> 8)) & 0xFF;\\r\\n crc = crcTable[j] ^ (crc << 8);\\r\\n }\\r\\n return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n var splitStr = []\\r\\n var j = 0\\r\\n for (let i = 0; i < str.length; i += 2) {\\r\\n splitStr[j] = str.substring(i, i + 2)\\r\\n j++\\r\\n }\\r\\n var bytes = []\\r\\n var bytePos = 0\\r\\n for (let i = 0; i < splitStr.length; i++) {\\r\\n var byteStr = splitStr[i]\\r\\n var b = parseInt(byteStr, 16)\\r\\n if (b < 256) {\\r\\n bytes[bytePos] = b\\r\\n bytePos++\\r\\n }\\r\\n }\\r\\n return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n hexString = str.toString(16);\\r\\n return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n let bin = 0;\\r\\n let rem, i = 1,\\r\\n step = 1;\\r\\n while (x != 0) {\\r\\n rem = x % 2;\\r\\n x = parseInt(x / 2);\\r\\n bin = bin + rem * i;\\r\\n i = i * 10;\\r\\n }\\r\\n return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n var hexa = parseInt(x, 2).toString(16);\\r\\n return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n const result = [];\\r\\n let len = string.length - 2;\\r\\n while (len >= 0) {\\r\\n result.push(string.substr(len, 2));\\r\\n len -= 2;\\r\\n }\\r\\n return result.join('');\\r\\n}\",\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":true,\"SendAttempts\":4,\"Order\":17},\"AvoidResending\":false,\"FollowParentSentType\":true,\"SendingType\":0,\"HasAck\":true,\"HexString\":true,\"Order\":20,\"SendAttempts\":4,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1748863968}],"Tags":[]},{"Id":5763,"Name":"getCurrentSettings3","TemplateSMS":"<>","Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n 0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\nvar msg = [];\r\nvar configs = [];\r\nvar configsSMS = [];\r\n// Contacts, APN, server details, fall sensitivity and Beacon List\r\nvar dataSMS = 'BCQ1'; // Check Beacon List\r\n/* 1,F7:37:B7:10:81:CE,office1\r\n2,C4:9F:A6:15:24:3F,office2\r\n3,D3:E3:AC:86:5E:46,office7 */\r\nvar data = ''; // empty\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar notSend = false;\r\nif (isForcedBySMS == 'False' && ((serverParams.CommandType == 'ByGPRS') || (serverParams.CommandType == 'Default' && ((serverParams.ParentCommandType == 'ByGPRS') || (serverParams.ParentCommandType == 'Default' && serverParams.ConfigType == 'GPRS') || (serverParams.ParentCommandType === null && serverParams.ConfigType == 'GPRS'))))) {\r\n notSend = true;\r\n}\r\n// For GPRS command\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\n// For SMS command\r\nAddValueSMS('dataSMS', dataSMS);\r\nvar commandConfigs = {\r\n template: \"main\",\r\n configs: configs,\r\n configsSMS: configsSMS,\r\n notSend: notSend\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n// functions\r\nfunction AddValue(p1, p2) {\r\n var cvpair = {\r\n code: p1,\r\n value: p2\r\n };\r\n configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n var cvpair = {\r\n code: p1,\r\n value: p2\r\n };\r\n configsSMS.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n var arr1 = [];\r\n for (var n = 0, l = str.length; n < l; n++) {\r\n var hex = Number(str.charCodeAt(n)).toString(16);\r\n arr1.push(hex);\r\n }\r\n return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n var crc = 0x0000;\r\n var j, i;\r\n for (i = 0; i < s.length; i++) {\r\n c = s[i];\r\n if (c > 255) {\r\n throw new RangeError();\r\n }\r\n j = (c ^ (crc >> 8)) & 0xFF;\r\n crc = crcTable[j] ^ (crc << 8);\r\n }\r\n return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n var splitStr = []\r\n var j = 0\r\n for (let i = 0; i < str.length; i += 2) {\r\n splitStr[j] = str.substring(i, i + 2)\r\n j++\r\n }\r\n var bytes = []\r\n var bytePos = 0\r\n for (let i = 0; i < splitStr.length; i++) {\r\n var byteStr = splitStr[i]\r\n var b = parseInt(byteStr, 16)\r\n if (b < 256) {\r\n bytes[bytePos] = b\r\n bytePos++\r\n }\r\n }\r\n return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n hexString = str.toString(16);\r\n return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n let bin = 0;\r\n let rem, i = 1,\r\n step = 1;\r\n while (x != 0) {\r\n rem = x % 2;\r\n x = parseInt(x / 2);\r\n bin = bin + rem * i;\r\n i = i * 10;\r\n }\r\n return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n var hexa = parseInt(x, 2).toString(16);\r\n return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n const result = [];\r\n let len = string.length - 2;\r\n while (len >= 0) {\r\n result.push(string.substr(len, 2));\r\n len -= 2;\r\n }\r\n return result.join('');\r\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":true,"SendingType":0,"HasAck":true,"HexString":true,"Order":19,"SendAttempts":4,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":5763,\"Name\":\"getCurrentSettings3\",\"TemplateSMS\":\"<>\",\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\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\":5765,\"Protocol\":{\"Id\":297,\"Code\":\"Access TEC Care Watch\",\"Version\":\"0.2\",\"FirmwareVersion\":\"\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"getCurrentSettings\",\"TemplateSMS\":\"<>\",\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\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 = '1A73344041424356101F44534733'; //1A73\\r\\n// Firmware Long, Contacts, APNusername, APNpass, server details, fall sensitivity and Beacon List, Fall down alert, Ring tome vol,System language, time interval, No motion alert,custom id, allow list\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\nvar command = '02';\\r\\n//var keyLength = '10'; // previous\\r\\nvar keyLength = '0F'; //+1 qnt of commands\\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' + '1100' + checksum + sequenceID; // add 2 to keylenght\\r\\nvar data = prefix + messageBody;\\r\\n// For GPRS command\\r\\nAddValue('data', data);\\r\\nAddValue('sequenceNumber', sequenceID);\\r\\n// For SMS command\\r\\nAddValueSMS('dataSMS', dataSMS);\\r\\nvar commandConfigs = {\\r\\n template: \\\"main\\\",\\r\\n configs: configs,\\r\\n configsSMS: configsSMS\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n// functions\\r\\nfunction AddValue(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n var arr1 = [];\\r\\n for (var n = 0, l = str.length; n < l; n++) {\\r\\n var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n arr1.push(hex);\\r\\n }\\r\\n return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n var crc = 0x0000;\\r\\n var j, i;\\r\\n for (i = 0; i < s.length; i++) {\\r\\n c = s[i];\\r\\n if (c > 255) {\\r\\n throw new RangeError();\\r\\n }\\r\\n j = (c ^ (crc >> 8)) & 0xFF;\\r\\n crc = crcTable[j] ^ (crc << 8);\\r\\n }\\r\\n return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n var splitStr = []\\r\\n var j = 0\\r\\n for (let i = 0; i < str.length; i += 2) {\\r\\n splitStr[j] = str.substring(i, i + 2)\\r\\n j++\\r\\n }\\r\\n var bytes = []\\r\\n var bytePos = 0\\r\\n for (let i = 0; i < splitStr.length; i++) {\\r\\n var byteStr = splitStr[i]\\r\\n var b = parseInt(byteStr, 16)\\r\\n if (b < 256) {\\r\\n bytes[bytePos] = b\\r\\n bytePos++\\r\\n }\\r\\n }\\r\\n return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n hexString = str.toString(16);\\r\\n return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n let bin = 0;\\r\\n let rem, i = 1,\\r\\n step = 1;\\r\\n while (x != 0) {\\r\\n rem = x % 2;\\r\\n x = parseInt(x / 2);\\r\\n bin = bin + rem * i;\\r\\n i = i * 10;\\r\\n }\\r\\n return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n var hexa = parseInt(x, 2).toString(16);\\r\\n return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n const result = [];\\r\\n let len = string.length - 2;\\r\\n while (len >= 0) {\\r\\n result.push(string.substr(len, 2));\\r\\n len -= 2;\\r\\n }\\r\\n return result.join('');\\r\\n}\",\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":true,\"SendAttempts\":4,\"Order\":17},\"AvoidResending\":false,\"FollowParentSentType\":true,\"SendingType\":0,\"HasAck\":true,\"HexString\":true,\"Order\":19,\"SendAttempts\":4,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1748863952}],"Tags":[]},{"Id":5764,"Name":"getCurrentSettings2","TemplateSMS":"<>","Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n 0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\nvar msg = [];\r\nvar configs = [];\r\nvar configsSMS = [];\r\n// Contacts, APN, server details, fall sensitivity and Beacon List\r\nvar dataSMS = 'status'; // Check fall sens (function settings)\r\n/* Mode:4,0 second\r\nLED: on\r\nBeep: on\r\nVibration: on\r\nTime zone: +10:00\r\nGEO Fence:0,0,0,0\r\nMotion alarm: off\r\nNo Motion alarm: off\r\nTilt alert: off\r\nFall alarm: on, level:5\r\nLow power alarm: on,15%\r\nSOS Call:10 minutes, loop:1 */\r\nvar data = ''; // empty\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar notSend = false;\r\nif (isForcedBySMS == 'False' && ((serverParams.CommandType == 'ByGPRS') || (serverParams.CommandType == 'Default' && ((serverParams.ParentCommandType == 'ByGPRS') || (serverParams.ParentCommandType == 'Default' && serverParams.ConfigType == 'GPRS') || (serverParams.ParentCommandType === null && serverParams.ConfigType == 'GPRS'))))) {\r\n notSend = true;\r\n}\r\n// For GPRS command\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\n// For SMS command\r\nAddValueSMS('dataSMS', dataSMS);\r\nvar commandConfigs = {\r\n template: \"main\",\r\n configs: configs,\r\n configsSMS: configsSMS,\r\n notSend: notSend\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n// functions\r\nfunction AddValue(p1, p2) {\r\n var cvpair = {\r\n code: p1,\r\n value: p2\r\n };\r\n configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n var cvpair = {\r\n code: p1,\r\n value: p2\r\n };\r\n configsSMS.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n var arr1 = [];\r\n for (var n = 0, l = str.length; n < l; n++) {\r\n var hex = Number(str.charCodeAt(n)).toString(16);\r\n arr1.push(hex);\r\n }\r\n return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n var crc = 0x0000;\r\n var j, i;\r\n for (i = 0; i < s.length; i++) {\r\n c = s[i];\r\n if (c > 255) {\r\n throw new RangeError();\r\n }\r\n j = (c ^ (crc >> 8)) & 0xFF;\r\n crc = crcTable[j] ^ (crc << 8);\r\n }\r\n return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n var splitStr = []\r\n var j = 0\r\n for (let i = 0; i < str.length; i += 2) {\r\n splitStr[j] = str.substring(i, i + 2)\r\n j++\r\n }\r\n var bytes = []\r\n var bytePos = 0\r\n for (let i = 0; i < splitStr.length; i++) {\r\n var byteStr = splitStr[i]\r\n var b = parseInt(byteStr, 16)\r\n if (b < 256) {\r\n bytes[bytePos] = b\r\n bytePos++\r\n }\r\n }\r\n return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n hexString = str.toString(16);\r\n return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n let bin = 0;\r\n let rem, i = 1,\r\n step = 1;\r\n while (x != 0) {\r\n rem = x % 2;\r\n x = parseInt(x / 2);\r\n bin = bin + rem * i;\r\n i = i * 10;\r\n }\r\n return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n var hexa = parseInt(x, 2).toString(16);\r\n return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n const result = [];\r\n let len = string.length - 2;\r\n while (len >= 0) {\r\n result.push(string.substr(len, 2));\r\n len -= 2;\r\n }\r\n return result.join('');\r\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":true,"SendingType":0,"HasAck":true,"HexString":true,"Order":18,"SendAttempts":4,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":5764,\"Name\":\"getCurrentSettings2\",\"TemplateSMS\":\"<>\",\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\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\":5765,\"Protocol\":{\"Id\":297,\"Code\":\"Access TEC Care Watch\",\"Version\":\"0.2\",\"FirmwareVersion\":\"\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"getCurrentSettings\",\"TemplateSMS\":\"<>\",\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\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 = '1A73344041424356101F44534733'; //1A73\\r\\n// Firmware Long, Contacts, APNusername, APNpass, server details, fall sensitivity and Beacon List, Fall down alert, Ring tome vol,System language, time interval, No motion alert,custom id, allow list\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\nvar command = '02';\\r\\n//var keyLength = '10'; // previous\\r\\nvar keyLength = '0F'; //+1 qnt of commands\\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' + '1100' + checksum + sequenceID; // add 2 to keylenght\\r\\nvar data = prefix + messageBody;\\r\\n// For GPRS command\\r\\nAddValue('data', data);\\r\\nAddValue('sequenceNumber', sequenceID);\\r\\n// For SMS command\\r\\nAddValueSMS('dataSMS', dataSMS);\\r\\nvar commandConfigs = {\\r\\n template: \\\"main\\\",\\r\\n configs: configs,\\r\\n configsSMS: configsSMS\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n// functions\\r\\nfunction AddValue(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n var arr1 = [];\\r\\n for (var n = 0, l = str.length; n < l; n++) {\\r\\n var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n arr1.push(hex);\\r\\n }\\r\\n return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n var crc = 0x0000;\\r\\n var j, i;\\r\\n for (i = 0; i < s.length; i++) {\\r\\n c = s[i];\\r\\n if (c > 255) {\\r\\n throw new RangeError();\\r\\n }\\r\\n j = (c ^ (crc >> 8)) & 0xFF;\\r\\n crc = crcTable[j] ^ (crc << 8);\\r\\n }\\r\\n return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n var splitStr = []\\r\\n var j = 0\\r\\n for (let i = 0; i < str.length; i += 2) {\\r\\n splitStr[j] = str.substring(i, i + 2)\\r\\n j++\\r\\n }\\r\\n var bytes = []\\r\\n var bytePos = 0\\r\\n for (let i = 0; i < splitStr.length; i++) {\\r\\n var byteStr = splitStr[i]\\r\\n var b = parseInt(byteStr, 16)\\r\\n if (b < 256) {\\r\\n bytes[bytePos] = b\\r\\n bytePos++\\r\\n }\\r\\n }\\r\\n return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n hexString = str.toString(16);\\r\\n return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n let bin = 0;\\r\\n let rem, i = 1,\\r\\n step = 1;\\r\\n while (x != 0) {\\r\\n rem = x % 2;\\r\\n x = parseInt(x / 2);\\r\\n bin = bin + rem * i;\\r\\n i = i * 10;\\r\\n }\\r\\n return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n var hexa = parseInt(x, 2).toString(16);\\r\\n return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n const result = [];\\r\\n let len = string.length - 2;\\r\\n while (len >= 0) {\\r\\n result.push(string.substr(len, 2));\\r\\n len -= 2;\\r\\n }\\r\\n return result.join('');\\r\\n}\",\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":true,\"SendAttempts\":4,\"Order\":17},\"AvoidResending\":false,\"FollowParentSentType\":true,\"SendingType\":0,\"HasAck\":true,\"HexString\":true,\"Order\":18,\"SendAttempts\":4,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1748863939}],"Tags":[]},{"Id":5766,"Name":"setServer","TemplateSMS":"<>","Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\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":[],"Tags":[]},{"Id":5767,"Name":"setGateway","TemplateSMS":"<>","Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\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 = '34';\r\nvar gateway_number = '00000000000';\r\nvar numberHex = '';\r\nvar numberLength = '00';\r\nvar nameLength = '00';\r\nvar nameHex = '';\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 nameHex = ascii_to_hexa(gateway).toUpperCase();\r\n nameLength = ('00' + decimalToHex(gateway.length)).slice(-2).toUpperCase();\r\n sosKeyLength = ('00' + decimalToHex(5 + (numberHex.length / 2) + (nameHex.length / 2))).slice(-2).toUpperCase();\r\n messageBody += sosKeyLength + key + confSOS + numberLength + numberHex + nameLength + nameHex + '00';\r\n dataSMS = `A10,0,0,${gateway_number}`; // doesn't accept SMS+ Untogle Call\r\n}\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar totalLength = ('0000' + decimalToHex(messageBody.length / 2)).slice(-4).toUpperCase();\r\ntotalLength = changeEndianness(totalLength);\r\n//totalLength = '1000'; //better to calculate it\r\nvar checksum = byteStringToByteArray(messageBody);\r\nchecksum = crc16byte(checksum);\r\nchecksum = decimalToHex(checksum);\r\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\r\nchecksum = changeEndianness(checksum);\r\nvar prefix = 'AB10' + totalLength + checksum + sequenceID;\r\nvar data = prefix + messageBody;\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\n// For SMS command\r\nAddValueSMS('dataSMS', dataSMS);\r\nvar commandConfigs = {\r\n template: \"main\",\r\n configs: configs,\r\n configsSMS: configsSMS\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n// functions\r\nfunction AddValue(p1, p2) {\r\n var cvpair = {\r\n code: p1,\r\n value: p2\r\n };\r\n configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n var cvpair = {\r\n code: p1,\r\n value: p2\r\n };\r\n configsSMS.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n var arr1 = [];\r\n for (var n = 0, l = str.length; n < l; n++) {\r\n var hex = Number(str.charCodeAt(n)).toString(16);\r\n arr1.push(hex);\r\n }\r\n return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n var crc = 0x0000;\r\n var j, i;\r\n for (i = 0; i < s.length; i++) {\r\n c = s[i];\r\n if (c > 255) {\r\n throw new RangeError();\r\n }\r\n j = (c ^ (crc >> 8)) & 0xFF;\r\n crc = crcTable[j] ^ (crc << 8);\r\n }\r\n return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n var splitStr = []\r\n var j = 0\r\n for (let i = 0; i < str.length; i += 2) {\r\n splitStr[j] = str.substring(i, i + 2)\r\n j++\r\n }\r\n var bytes = []\r\n var bytePos = 0\r\n for (let i = 0; i < splitStr.length; i++) {\r\n var byteStr = splitStr[i]\r\n var b = parseInt(byteStr, 16)\r\n if (b < 256) {\r\n bytes[bytePos] = b\r\n bytePos++\r\n }\r\n }\r\n return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n hexString = str.toString(16);\r\n return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n let bin = 0;\r\n let rem, i = 1,\r\n step = 1;\r\n while (x != 0) {\r\n rem = x % 2;\r\n x = parseInt(x / 2);\r\n bin = bin + rem * i;\r\n i = i * 10;\r\n }\r\n return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n var hexa = parseInt(x, 2).toString(16);\r\n return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n const result = [];\r\n let len = string.length - 2;\r\n while (len >= 0) {\r\n result.push(string.substr(len, 2));\r\n len -= 2;\r\n }\r\n return result.join('');\r\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":2,"HasAck":true,"HexString":true,"Order":2,"SendAttempts":4,"ProtocolActionObjects":[],"Tags":[]},{"Id":5768,"Name":"setEmergencySettings","TemplateSMS":"<>","Template":"<>","AckTemplate":null,"Operation":"//updated for EV06\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 msg = [];\r\nvar configs = [];\r\nvar configsSMS = [];\r\nvar messageBody = '02';\r\nvar key = '34';\r\nvar phone_number = '00000000000';\r\nvar numberHex = '';\r\nvar numberLength = '00';\r\nvar nameLength = '00';\r\nvar nameHex = '';\r\nvar sosKeyLength = '00';\r\n//var confFall = '1100'; // Enable, Dial\r\nvar confSOS = '10100000'; // Enable, no SMS, Toggle Call, No Sim Dialing, Contact Number 1\r\nvar dataSMS = '';\r\nif (params.AlertSettings.EmergencyNumber) {\r\n confSOS = ('00' + binaryToHex(confSOS)).slice(-2).toUpperCase();\r\n phone_number = params.AlertSettings.EmergencyNumber;\r\n numberHex = ascii_to_hexa(phone_number).toUpperCase();\r\n numberLength = ('00' + decimalToHex(phone_number.length)).slice(-2).toUpperCase();\r\n nameHex = ascii_to_hexa('Support').toUpperCase(); // Support 53 75 70 70 6F 72 74\r\n nameLength = '07'; // lenght of 'Support'\r\n sosKeyLength = ('00' + decimalToHex(5 + (numberHex.length / 2) + (nameHex.length / 2))).slice(-2).toUpperCase();\r\n messageBody += sosKeyLength + key + confSOS + numberLength + numberHex + nameLength + nameHex + '00';\r\n dataSMS = `A1,0,1,${phone_number}`;\r\n}\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar totalLength = ('0000' + decimalToHex(messageBody.length / 2)).slice(-4).toUpperCase();\r\ntotalLength = changeEndianness(totalLength);\r\n//totalLength = '1000'; //better to calculate it\r\nvar checksum = byteStringToByteArray(messageBody);\r\nchecksum = crc16byte(checksum);\r\nchecksum = decimalToHex(checksum);\r\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\r\nchecksum = changeEndianness(checksum);\r\nvar prefix = 'AB10' + totalLength + checksum + sequenceID;\r\nvar data = prefix + messageBody;\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\n// For SMS command\r\nAddValueSMS('dataSMS', dataSMS);\r\nvar commandConfigs = {\r\n template: \"main\",\r\n configs: configs,\r\n configsSMS: configsSMS\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n// functions\r\nfunction AddValue(p1, p2) {\r\n var cvpair = {\r\n code: p1,\r\n value: p2\r\n };\r\n configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n var cvpair = {\r\n code: p1,\r\n value: p2\r\n };\r\n configsSMS.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n var arr1 = [];\r\n for (var n = 0, l = str.length; n < l; n++) {\r\n var hex = Number(str.charCodeAt(n)).toString(16);\r\n arr1.push(hex);\r\n }\r\n return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n var crc = 0x0000;\r\n var j, i;\r\n for (i = 0; i < s.length; i++) {\r\n c = s[i];\r\n if (c > 255) {\r\n throw new RangeError();\r\n }\r\n j = (c ^ (crc >> 8)) & 0xFF;\r\n crc = crcTable[j] ^ (crc << 8);\r\n }\r\n return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n var splitStr = []\r\n var j = 0\r\n for (let i = 0; i < str.length; i += 2) {\r\n splitStr[j] = str.substring(i, i + 2)\r\n j++\r\n }\r\n var bytes = []\r\n var bytePos = 0\r\n for (let i = 0; i < splitStr.length; i++) {\r\n var byteStr = splitStr[i]\r\n var b = parseInt(byteStr, 16)\r\n if (b < 256) {\r\n bytes[bytePos] = b\r\n bytePos++\r\n }\r\n }\r\n return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n hexString = str.toString(16);\r\n return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n let bin = 0;\r\n let rem, i = 1,\r\n step = 1;\r\n while (x != 0) {\r\n rem = x % 2;\r\n x = parseInt(x / 2);\r\n bin = bin + rem * i;\r\n i = i * 10;\r\n }\r\n return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n var hexa = parseInt(x, 2).toString(16);\r\n return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n const result = [];\r\n let len = string.length - 2;\r\n while (len >= 0) {\r\n result.push(string.substr(len, 2));\r\n len -= 2;\r\n }\r\n return result.join('');\r\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":true,"Order":3,"SendAttempts":4,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":5768,\"Name\":\"setEmergencySettings\",\"TemplateSMS\":\"<>\",\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"//updated for EV06\\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 msg = [];\\r\\nvar configs = [];\\r\\nvar configsSMS = [];\\r\\nvar messageBody = '02';\\r\\nvar key = '34';\\r\\nvar phone_number = '00000000000';\\r\\nvar numberHex = '';\\r\\nvar numberLength = '00';\\r\\nvar nameLength = '00';\\r\\nvar nameHex = '';\\r\\nvar sosKeyLength = '00';\\r\\n//var confFall = '1100'; // Enable, Dial\\r\\nvar confSOS = '10100000'; // Enable, no SMS, Toggle Call, No Sim Dialing, Contact Number 1\\r\\nvar dataSMS = '';\\r\\nif (params.AlertSettings.EmergencyNumber) {\\r\\n confSOS = ('00' + binaryToHex(confSOS)).slice(-2).toUpperCase();\\r\\n phone_number = params.AlertSettings.EmergencyNumber;\\r\\n numberHex = ascii_to_hexa(phone_number).toUpperCase();\\r\\n numberLength = ('00' + decimalToHex(phone_number.length)).slice(-2).toUpperCase();\\r\\n nameHex = ascii_to_hexa('SOS Info').toUpperCase(); // 53 4F 53 20 49 6E 66 6F\\r\\n nameLength = '08'; // lenght of 'SOS Info'\\r\\n sosKeyLength = ('00' + decimalToHex(5 + (numberHex.length / 2) + (nameHex.length / 2))).slice(-2).toUpperCase();\\r\\n messageBody += sosKeyLength + key + confSOS + numberLength + numberHex + nameLength + nameHex + '00';\\r\\n dataSMS = `A1,0,1,${phone_number}`;\\r\\n}\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\nvar totalLength = ('0000' + decimalToHex(messageBody.length / 2)).slice(-4).toUpperCase();\\r\\ntotalLength = changeEndianness(totalLength);\\r\\n//totalLength = '1000'; //better to calculate it\\r\\nvar checksum = byteStringToByteArray(messageBody);\\r\\nchecksum = crc16byte(checksum);\\r\\nchecksum = decimalToHex(checksum);\\r\\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\\r\\nchecksum = changeEndianness(checksum);\\r\\nvar prefix = 'AB10' + totalLength + checksum + sequenceID;\\r\\nvar data = prefix + messageBody;\\r\\nAddValue('data', data);\\r\\nAddValue('sequenceNumber', sequenceID);\\r\\n// For SMS command\\r\\nAddValueSMS('dataSMS', dataSMS);\\r\\nvar commandConfigs = {\\r\\n template: \\\"main\\\",\\r\\n configs: configs,\\r\\n configsSMS: configsSMS\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n// functions\\r\\nfunction AddValue(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n var arr1 = [];\\r\\n for (var n = 0, l = str.length; n < l; n++) {\\r\\n var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n arr1.push(hex);\\r\\n }\\r\\n return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n var crc = 0x0000;\\r\\n var j, i;\\r\\n for (i = 0; i < s.length; i++) {\\r\\n c = s[i];\\r\\n if (c > 255) {\\r\\n throw new RangeError();\\r\\n }\\r\\n j = (c ^ (crc >> 8)) & 0xFF;\\r\\n crc = crcTable[j] ^ (crc << 8);\\r\\n }\\r\\n return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n var splitStr = []\\r\\n var j = 0\\r\\n for (let i = 0; i < str.length; i += 2) {\\r\\n splitStr[j] = str.substring(i, i + 2)\\r\\n j++\\r\\n }\\r\\n var bytes = []\\r\\n var bytePos = 0\\r\\n for (let i = 0; i < splitStr.length; i++) {\\r\\n var byteStr = splitStr[i]\\r\\n var b = parseInt(byteStr, 16)\\r\\n if (b < 256) {\\r\\n bytes[bytePos] = b\\r\\n bytePos++\\r\\n }\\r\\n }\\r\\n return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n hexString = str.toString(16);\\r\\n return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n let bin = 0;\\r\\n let rem, i = 1,\\r\\n step = 1;\\r\\n while (x != 0) {\\r\\n rem = x % 2;\\r\\n x = parseInt(x / 2);\\r\\n bin = bin + rem * i;\\r\\n i = i * 10;\\r\\n }\\r\\n return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n var hexa = parseInt(x, 2).toString(16);\\r\\n return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n const result = [];\\r\\n let len = string.length - 2;\\r\\n while (len >= 0) {\\r\\n result.push(string.substr(len, 2));\\r\\n len -= 2;\\r\\n }\\r\\n return result.join('');\\r\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":true,\"Order\":3,\"SendAttempts\":4,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1748622805},{"Type":1,"NewValue":"{\"Id\":5768,\"Name\":\"setEmergencySettings\",\"TemplateSMS\":\"<>\",\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"//updated for EV06\\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 msg = [];\\r\\nvar configs = [];\\r\\nvar configsSMS = [];\\r\\nvar messageBody = '02';\\r\\nvar key = '34';\\r\\nvar phone_number = '00000000000';\\r\\nvar numberHex = '';\\r\\nvar numberLength = '00';\\r\\nvar nameLength = '00';\\r\\nvar nameHex = '';\\r\\nvar sosKeyLength = '00';\\r\\n//var confFall = '1100'; // Enable, Dial\\r\\nvar confSOS = '10100000'; // Enable, no SMS, Toggle Call, No Sim Dialing, Contact Number 1\\r\\nvar dataSMS = '';\\r\\nif (params.AlertSettings.EmergencyNumber) {\\r\\n confSOS = ('00' + binaryToHex(confSOS)).slice(-2).toUpperCase();\\r\\n phone_number = params.AlertSettings.EmergencyNumber;\\r\\n numberHex = ascii_to_hexa(phone_number).toUpperCase();\\r\\n numberLength = ('00' + decimalToHex(phone_number.length)).slice(-2).toUpperCase();\\r\\n nameHex = ascii_to_hexa('SOS').toUpperCase(); // 53 4F 53\\r\\n nameLength = '03'; // lenght of 'SOS'\\r\\n sosKeyLength = ('00' + decimalToHex(5 + (numberHex.length / 2) + (nameHex.length / 2))).slice(-2).toUpperCase();\\r\\n messageBody += sosKeyLength + key + confSOS + numberLength + numberHex + nameLength + nameHex + '00';\\r\\n dataSMS = `A1,0,1,${phone_number}`;\\r\\n}\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\nvar totalLength = ('0000' + decimalToHex(messageBody.length / 2)).slice(-4).toUpperCase();\\r\\ntotalLength = changeEndianness(totalLength);\\r\\n//totalLength = '1000'; //better to calculate it\\r\\nvar checksum = byteStringToByteArray(messageBody);\\r\\nchecksum = crc16byte(checksum);\\r\\nchecksum = decimalToHex(checksum);\\r\\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\\r\\nchecksum = changeEndianness(checksum);\\r\\nvar prefix = 'AB10' + totalLength + checksum + sequenceID;\\r\\nvar data = prefix + messageBody;\\r\\nAddValue('data', data);\\r\\nAddValue('sequenceNumber', sequenceID);\\r\\n// For SMS command\\r\\nAddValueSMS('dataSMS', dataSMS);\\r\\nvar commandConfigs = {\\r\\n template: \\\"main\\\",\\r\\n configs: configs,\\r\\n configsSMS: configsSMS\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n// functions\\r\\nfunction AddValue(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n var arr1 = [];\\r\\n for (var n = 0, l = str.length; n < l; n++) {\\r\\n var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n arr1.push(hex);\\r\\n }\\r\\n return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n var crc = 0x0000;\\r\\n var j, i;\\r\\n for (i = 0; i < s.length; i++) {\\r\\n c = s[i];\\r\\n if (c > 255) {\\r\\n throw new RangeError();\\r\\n }\\r\\n j = (c ^ (crc >> 8)) & 0xFF;\\r\\n crc = crcTable[j] ^ (crc << 8);\\r\\n }\\r\\n return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n var splitStr = []\\r\\n var j = 0\\r\\n for (let i = 0; i < str.length; i += 2) {\\r\\n splitStr[j] = str.substring(i, i + 2)\\r\\n j++\\r\\n }\\r\\n var bytes = []\\r\\n var bytePos = 0\\r\\n for (let i = 0; i < splitStr.length; i++) {\\r\\n var byteStr = splitStr[i]\\r\\n var b = parseInt(byteStr, 16)\\r\\n if (b < 256) {\\r\\n bytes[bytePos] = b\\r\\n bytePos++\\r\\n }\\r\\n }\\r\\n return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n hexString = str.toString(16);\\r\\n return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n let bin = 0;\\r\\n let rem, i = 1,\\r\\n step = 1;\\r\\n while (x != 0) {\\r\\n rem = x % 2;\\r\\n x = parseInt(x / 2);\\r\\n bin = bin + rem * i;\\r\\n i = i * 10;\\r\\n }\\r\\n return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n var hexa = parseInt(x, 2).toString(16);\\r\\n return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n const result = [];\\r\\n let len = string.length - 2;\\r\\n while (len >= 0) {\\r\\n result.push(string.substr(len, 2));\\r\\n len -= 2;\\r\\n }\\r\\n return result.join('');\\r\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":true,\"Order\":3,\"SendAttempts\":4,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1748938524},{"Type":1,"NewValue":"{\"Id\":5768,\"Name\":\"setEmergencySettings\",\"TemplateSMS\":\"<>\",\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"//updated for EV06\\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 msg = [];\\r\\nvar configs = [];\\r\\nvar configsSMS = [];\\r\\nvar messageBody = '02';\\r\\nvar key = '34';\\r\\nvar phone_number = '00000000000';\\r\\nvar numberHex = '';\\r\\nvar numberLength = '00';\\r\\nvar nameLength = '00';\\r\\nvar nameHex = '';\\r\\nvar sosKeyLength = '00';\\r\\n//var confFall = '1100'; // Enable, Dial\\r\\nvar confSOS = '10100000'; // Enable, no SMS, Toggle Call, No Sim Dialing, Contact Number 1\\r\\nvar dataSMS = '';\\r\\nif (params.AlertSettings.EmergencyNumber) {\\r\\n confSOS = ('00' + binaryToHex(confSOS)).slice(-2).toUpperCase();\\r\\n phone_number = params.AlertSettings.EmergencyNumber;\\r\\n if (phone_number.startsWith(\\\"+\\\")) {\\r\\n phone_number = \\\"00\\\" + phone_number.substring(1);\\r\\n }\\r\\n numberHex = ascii_to_hexa(phone_number).toUpperCase();\\r\\n numberLength = ('00' + decimalToHex(phone_number.length)).slice(-2).toUpperCase();\\r\\n nameHex = ascii_to_hexa('SOS').toUpperCase(); // 53 4F 53\\r\\n nameLength = '03'; // lenght of 'SOS'\\r\\n sosKeyLength = ('00' + decimalToHex(5 + (numberHex.length / 2) + (nameHex.length / 2))).slice(-2).toUpperCase();\\r\\n messageBody += sosKeyLength + key + confSOS + numberLength + numberHex + nameLength + nameHex + '00';\\r\\n dataSMS = `A1,0,1,${phone_number}`;\\r\\n}\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\nvar totalLength = ('0000' + decimalToHex(messageBody.length / 2)).slice(-4).toUpperCase();\\r\\ntotalLength = changeEndianness(totalLength);\\r\\n//totalLength = '1000'; //better to calculate it\\r\\nvar checksum = byteStringToByteArray(messageBody);\\r\\nchecksum = crc16byte(checksum);\\r\\nchecksum = decimalToHex(checksum);\\r\\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\\r\\nchecksum = changeEndianness(checksum);\\r\\nvar prefix = 'AB10' + totalLength + checksum + sequenceID;\\r\\nvar data = prefix + messageBody;\\r\\nAddValue('data', data);\\r\\nAddValue('sequenceNumber', sequenceID);\\r\\n// For SMS command\\r\\nAddValueSMS('dataSMS', dataSMS);\\r\\nvar commandConfigs = {\\r\\n template: \\\"main\\\",\\r\\n configs: configs,\\r\\n configsSMS: configsSMS\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n// functions\\r\\nfunction AddValue(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n var arr1 = [];\\r\\n for (var n = 0, l = str.length; n < l; n++) {\\r\\n var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n arr1.push(hex);\\r\\n }\\r\\n return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n var crc = 0x0000;\\r\\n var j, i;\\r\\n for (i = 0; i < s.length; i++) {\\r\\n c = s[i];\\r\\n if (c > 255) {\\r\\n throw new RangeError();\\r\\n }\\r\\n j = (c ^ (crc >> 8)) & 0xFF;\\r\\n crc = crcTable[j] ^ (crc << 8);\\r\\n }\\r\\n return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n var splitStr = []\\r\\n var j = 0\\r\\n for (let i = 0; i < str.length; i += 2) {\\r\\n splitStr[j] = str.substring(i, i + 2)\\r\\n j++\\r\\n }\\r\\n var bytes = []\\r\\n var bytePos = 0\\r\\n for (let i = 0; i < splitStr.length; i++) {\\r\\n var byteStr = splitStr[i]\\r\\n var b = parseInt(byteStr, 16)\\r\\n if (b < 256) {\\r\\n bytes[bytePos] = b\\r\\n bytePos++\\r\\n }\\r\\n }\\r\\n return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n hexString = str.toString(16);\\r\\n return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n let bin = 0;\\r\\n let rem, i = 1,\\r\\n step = 1;\\r\\n while (x != 0) {\\r\\n rem = x % 2;\\r\\n x = parseInt(x / 2);\\r\\n bin = bin + rem * i;\\r\\n i = i * 10;\\r\\n }\\r\\n return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n var hexa = parseInt(x, 2).toString(16);\\r\\n return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n const result = [];\\r\\n let len = string.length - 2;\\r\\n while (len >= 0) {\\r\\n result.push(string.substr(len, 2));\\r\\n len -= 2;\\r\\n }\\r\\n return result.join('');\\r\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":true,\"Order\":3,\"SendAttempts\":4,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1752596355}],"Tags":[]},{"Id":5770,"Name":"actionTrace","TemplateSMS":"<>","Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\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":[],"Tags":[]},{"Id":5771,"Name":"actionPowerOff","TemplateSMS":"<>","Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n 0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\nvar configs = [];\r\nvar configsSMS = [];\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar command = '04';\r\nvar keyLength = '01';\r\nvar key = '14';\r\nvar messageBody = command + keyLength + key;\r\nvar checksum = byteStringToByteArray(messageBody);\r\nchecksum = crc16byte(checksum);\r\nchecksum = decimalToHex(checksum).toUpperCase();\r\nchecksum = ('0000' + checksum).slice(-4);\r\nchecksum = checksum.toString().substring(2, 4) + checksum.toString().substring(0, 2);\r\nvar prefix = 'AB10' + '0300' + checksum + sequenceID;\r\nvar data = prefix + messageBody;\r\n// For GPRS command\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\n// For SMS command\r\nvar dataSMS = 'off';\r\nAddValueSMS('dataSMS', dataSMS);\r\nvar commandConfigs = {\r\n template: \"main\",\r\n configs: configs,\r\n configsSMS: configsSMS\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n\r\nfunction AddValue(p1, p2) {\r\n var cvpair = {\r\n code: p1,\r\n value: p2\r\n };\r\n configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n var cvpair = {\r\n code: p1,\r\n value: p2\r\n };\r\n configsSMS.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n var arr1 = [];\r\n for (var n = 0, l = str.length; n < l; n++) {\r\n var hex = Number(str.charCodeAt(n)).toString(16);\r\n arr1.push(hex);\r\n }\r\n return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n var crc = 0x0000;\r\n var j, i;\r\n for (i = 0; i < s.length; i++) {\r\n c = s[i];\r\n if (c > 255) {\r\n throw new RangeError();\r\n }\r\n j = (c ^ (crc >> 8)) & 0xFF;\r\n crc = crcTable[j] ^ (crc << 8);\r\n }\r\n return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n var splitStr = [];\r\n var j = 0;\r\n for (let i = 0; i < str.length; i += 2) {\r\n splitStr[j] = str.substring(i, i + 2);\r\n j++;\r\n }\r\n var bytes = [];\r\n var bytePos = 0;\r\n for (let i = 0; i < splitStr.length; i++) {\r\n var byteStr = splitStr[i];\r\n var b = parseInt(byteStr, 16);\r\n if (b < 256) {\r\n bytes[bytePos] = b;\r\n bytePos++;\r\n }\r\n }\r\n return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n hexString = str.toString(16);\r\n return hexString\r\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":2,"HasAck":true,"HexString":true,"Order":14,"SendAttempts":4,"ProtocolActionObjects":[],"Tags":[]},{"Id":5772,"Name":"actionDeleteRecords","TemplateSMS":"<>","Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\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":[],"Tags":[]},{"Id":5773,"Name":"actionFactoryReset","TemplateSMS":"<>","Template":"<>","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 = 'ineedtoresetEV06A!'; // ticket 604747\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":3,"HasAck":true,"HexString":true,"Order":15,"SendAttempts":4,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":5773,\"Name\":\"actionFactoryReset\",\"TemplateSMS\":\"\",\"Template\":\"<>\",\"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 = 'ineedtoresetEV06A!'; // ticket 604747\\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\":3,\"HasAck\":false,\"HexString\":true,\"Order\":15,\"SendAttempts\":4,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1748537885},{"Type":1,"NewValue":"{\"Id\":5773,\"Name\":\"actionFactoryReset\",\"TemplateSMS\":\"\",\"Template\":\"<>\",\"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 = 'ineedtoresetEV06A!'; // ticket 604747\\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\":3,\"HasAck\":false,\"HexString\":true,\"Order\":15,\"SendAttempts\":4,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1748537902},{"Type":1,"NewValue":"{\"Id\":5773,\"Name\":\"actionFactoryReset\",\"TemplateSMS\":\"\",\"Template\":\"<>\",\"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 = 'ineedtoresetEV06A!'; // ticket 604747\\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\":3,\"HasAck\":false,\"HexString\":true,\"Order\":15,\"SendAttempts\":4,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1748537937},{"Type":1,"NewValue":"{\"Id\":5773,\"Name\":\"actionFactoryReset\",\"TemplateSMS\":\"\",\"Template\":\"<>\",\"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 = 'ineedtoresetEV06A!'; // ticket 604747\\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\":3,\"HasAck\":true,\"HexString\":true,\"Order\":15,\"SendAttempts\":4,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1748538097},{"Type":1,"NewValue":"{\"Id\":5773,\"Name\":\"actionFactoryReset\",\"TemplateSMS\":\"<>\",\"Template\":\"<>\",\"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 = 'ineedtoresetEV06A!'; // ticket 604747\\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\":3,\"HasAck\":false,\"HexString\":true,\"Order\":15,\"SendAttempts\":4,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1748538116},{"Type":1,"NewValue":"{\"Id\":5773,\"Name\":\"actionFactoryReset\",\"TemplateSMS\":\"<>\",\"Template\":\"<>\",\"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 = 'ineedtoresetEV06A!'; // ticket 604747\\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\":3,\"HasAck\":false,\"HexString\":true,\"Order\":15,\"SendAttempts\":4,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1748547976},{"Type":1,"NewValue":"{\"Id\":5773,\"Name\":\"actionFactoryReset\",\"TemplateSMS\":\"\",\"Template\":\"<>\",\"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 = 'ineedtoresetEV06A!'; // ticket 604747\\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\":3,\"HasAck\":false,\"HexString\":true,\"Order\":15,\"SendAttempts\":4,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1748623419},{"Type":1,"NewValue":"{\"Id\":5773,\"Name\":\"actionFactoryReset\",\"TemplateSMS\":\"<>\",\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\n 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\\n 0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\\n 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\n];\\nvar configs = [];\\nvar configsSMS = [];\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\nvar command = '04';\\nvar keyLength = '01';\\nvar key = '11';\\nvar messageBody = command + keyLength + key;\\nvar checksum = byteStringToByteArray(messageBody);\\nchecksum = crc16byte(checksum);\\nchecksum = decimalToHex(checksum).toUpperCase();\\nchecksum = ('0000' + checksum).slice(-4);\\nchecksum = checksum.toString().substring(2, 4) + checksum.toString().substring(0, 2);\\nvar prefix = 'AB10' + '0300' + checksum + sequenceID;\\nvar data = prefix + messageBody;\\n// For GPRS command\\nAddValue('data', data);\\nAddValue('sequenceNumber', sequenceID);\\n// For SMS command\\nvar dataSMS = 'INEEDTORESETEV-06A!'; // ticket 604747\\nAddValueSMS('dataSMS', dataSMS);\\nvar commandConfigs = {\\n template: \\\"main\\\",\\n configs: configs,\\n configsSMS: configsSMS\\n};\\nmsg.push(JSON.stringify(commandConfigs));\\n\\nfunction AddValue(p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configs.push(cvpair);\\n}\\n\\nfunction AddValueSMS(p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configsSMS.push(cvpair);\\n}\\n\\nfunction ascii_to_hexa(str) {\\n var arr1 = [];\\n for (var n = 0, l = str.length; n < l; n++) {\\n var hex = Number(str.charCodeAt(n)).toString(16);\\n arr1.push(hex);\\n }\\n return arr1.join('');\\n}\\n\\nfunction crc16byte(s) {\\n var crc = 0x0000;\\n var j, i;\\n for (i = 0; i < s.length; i++) {\\n c = s[i];\\n if (c > 255) {\\n throw new RangeError();\\n }\\n j = (c ^ (crc >> 8)) & 0xFF;\\n crc = crcTable[j] ^ (crc << 8);\\n }\\n return ((crc ^ 0) & 0xFFFF);\\n}\\n\\nfunction byteStringToByteArray(str) {\\n var splitStr = []\\n var j = 0\\n for (let i = 0; i < str.length; i += 2) {\\n splitStr[j] = str.substring(i, i + 2)\\n j++\\n }\\n var bytes = []\\n var bytePos = 0\\n for (let i = 0; i < splitStr.length; i++) {\\n var byteStr = splitStr[i]\\n var b = parseInt(byteStr, 16)\\n if (b < 256) {\\n bytes[bytePos] = b\\n bytePos++\\n }\\n }\\n return bytes\\n}\\n\\nfunction decimalToHex(str) {\\n hexString = str.toString(16);\\n return hexString\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":false,\"HexString\":true,\"Order\":15,\"SendAttempts\":4,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1749193448},{"Type":1,"NewValue":"{\"Id\":5773,\"Name\":\"actionFactoryReset\",\"TemplateSMS\":\"<>\",\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\n 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\\n 0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\\n 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\n];\\nvar configs = [];\\nvar configsSMS = [];\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\nvar command = '04';\\nvar keyLength = '01';\\nvar key = '11';\\nvar messageBody = command + keyLength + key;\\nvar checksum = byteStringToByteArray(messageBody);\\nchecksum = crc16byte(checksum);\\nchecksum = decimalToHex(checksum).toUpperCase();\\nchecksum = ('0000' + checksum).slice(-4);\\nchecksum = checksum.toString().substring(2, 4) + checksum.toString().substring(0, 2);\\nvar prefix = 'AB10' + '0300' + checksum + sequenceID;\\nvar data = prefix + messageBody;\\n// For GPRS command\\nAddValue('data', data);\\nAddValue('sequenceNumber', sequenceID);\\n// For SMS command\\nvar dataSMS = 'INEEDTORESETEV-06A!'; // ticket 604747\\nAddValueSMS('dataSMS', dataSMS);\\nvar commandConfigs = {\\n template: \\\"main\\\",\\n configs: configs,\\n configsSMS: configsSMS\\n};\\nmsg.push(JSON.stringify(commandConfigs));\\n\\nfunction AddValue(p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configs.push(cvpair);\\n}\\n\\nfunction AddValueSMS(p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configsSMS.push(cvpair);\\n}\\n\\nfunction ascii_to_hexa(str) {\\n var arr1 = [];\\n for (var n = 0, l = str.length; n < l; n++) {\\n var hex = Number(str.charCodeAt(n)).toString(16);\\n arr1.push(hex);\\n }\\n return arr1.join('');\\n}\\n\\nfunction crc16byte(s) {\\n var crc = 0x0000;\\n var j, i;\\n for (i = 0; i < s.length; i++) {\\n c = s[i];\\n if (c > 255) {\\n throw new RangeError();\\n }\\n j = (c ^ (crc >> 8)) & 0xFF;\\n crc = crcTable[j] ^ (crc << 8);\\n }\\n return ((crc ^ 0) & 0xFFFF);\\n}\\n\\nfunction byteStringToByteArray(str) {\\n var splitStr = []\\n var j = 0\\n for (let i = 0; i < str.length; i += 2) {\\n splitStr[j] = str.substring(i, i + 2)\\n j++\\n }\\n var bytes = []\\n var bytePos = 0\\n for (let i = 0; i < splitStr.length; i++) {\\n var byteStr = splitStr[i]\\n var b = parseInt(byteStr, 16)\\n if (b < 256) {\\n bytes[bytePos] = b\\n bytePos++\\n }\\n }\\n return bytes\\n}\\n\\nfunction decimalToHex(str) {\\n hexString = str.toString(16);\\n return hexString\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":2,\"HasAck\":true,\"HexString\":true,\"Order\":15,\"SendAttempts\":4,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1749211988}],"Tags":[]},{"Id":5774,"Name":"setSMSPrefix","TemplateSMS":null,"Template":"<>","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":5775,"Name":"actionRequestLocation","TemplateSMS":null,"Template":"<>","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":5776,"Name":"setWelfareCheck","TemplateSMS":null,"Template":"<>","AckTemplate":null,"Operation":"var configs = [];\r\nvar crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n 0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\n//create the bit table to use with control\r\nvar value = '';\r\nvar value2 = '';\r\nif (params.WelfareCheck.EnableDisableWelfareCheck == 'true') {\r\n value += '1';\r\n var time = params.WelfareCheck.CheckTime * 60; //in minutes\r\n value += ('0000000000000000000000000000000' + decimalToBinary(parseInt(time))).slice(-31);\r\n} else {\r\n value += ('0000000000000000000000000000000' + decimalToBinary(parseInt(3600))).slice(-31); //default\r\n}\r\nvalue = ('00000000' + binaryToHex(value)).slice(-8).toUpperCase();\r\nvalue = changeEndianness(value);\r\nif (params.WelfareCheck.DialWarningTime == 'true') {\r\n value2 += '1';\r\n var time = params.WelfareCheck.WarningTime * 60; //in minutes\r\n value2 += ('0000000000000000000000000000000' + decimalToBinary(parseInt(time))).slice(-31);\r\n} else {\r\n value2 += ('0000000000000000000000000000000' + decimalToBinary(parseInt(300))).slice(-31); // default\r\n}\r\nvalue2 = ('00000000' + binaryToHex(value2)).slice(-8).toUpperCase();\r\nvalue2 = changeEndianness(value2);\r\n// join both msg\r\nvalue += value2;\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar command = '02';\r\nvar keyLength = '09';\r\nvar key = '57';\r\nvar totalLenght = '0B00';\r\nif (params.DeviceVersion.DeviceVersion == '2') { // command not for watch so mic to 10\r\n command = '02';\r\n keyLength = '02';\r\n key = '11';\r\n value = '10';\r\n totalLenght = '0400';\r\n}\r\nvar messageBody = command + keyLength + key + value;\r\nvar checksum = byteStringToByteArray(messageBody);\r\nchecksum = crc16byte(checksum);\r\nchecksum = decimalToHex(checksum);\r\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\r\nchecksum = checksum.toString().substring(2, 4) + checksum.toString().substring(0, 2);\r\nvar prefix = 'AB10' + totalLenght + checksum + sequenceID;\r\nvar data = prefix + messageBody;\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\nvar commandConfigs = {\r\n template: \"main\",\r\n configs: configs\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n\r\nfunction AddValue(p1, p2) {\r\n var cvpair = {\r\n code: p1,\r\n value: p2\r\n };\r\n configs.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n var arr1 = [];\r\n for (var n = 0, l = str.length; n < l; n++) {\r\n var hex = Number(str.charCodeAt(n)).toString(16);\r\n arr1.push(hex);\r\n }\r\n return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n var crc = 0x0000;\r\n var j, i;\r\n for (i = 0; i < s.length; i++) {\r\n c = s[i];\r\n if (c > 255) {\r\n throw new RangeError();\r\n }\r\n j = (c ^ (crc >> 8)) & 0xFF;\r\n crc = crcTable[j] ^ (crc << 8);\r\n }\r\n return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n var splitStr = [];\r\n var j = 0;\r\n for (let i = 0; i < str.length; i += 2) {\r\n splitStr[j] = str.substring(i, i + 2);\r\n j++;\r\n }\r\n var bytes = [];\r\n var bytePos = 0;\r\n for (let i = 0; i < splitStr.length; i++) {\r\n var byteStr = splitStr[i];\r\n var b = parseInt(byteStr, 16);\r\n if (b < 256) {\r\n bytes[bytePos] = b;\r\n bytePos++;\r\n }\r\n }\r\n return bytes;\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n hexString = str.toString(16);\r\n return hexString;\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n let bin = 0;\r\n let rem, i = 1,\r\n step = 1;\r\n while (x !== 0) {\r\n rem = x % 2;\r\n x = parseInt(x / 2);\r\n bin = bin + rem * i;\r\n i = i * 10;\r\n }\r\n return bin;\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n var hexa = parseInt(x, 2).toString(16);\r\n return hexa;\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n const result = [];\r\n let len = string.length - 2;\r\n while (len >= 0) {\r\n result.push(string.substr(len, 2));\r\n len -= 2;\r\n }\r\n return result.join('');\r\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":true,"Order":null,"SendAttempts":4,"ProtocolActionObjects":[],"Tags":[]},{"Id":5777,"Name":"setAPN","TemplateSMS":"<>","Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\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":[],"Tags":[]},{"Id":5778,"Name":"getAPN","TemplateSMS":null,"Template":"<>","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":5779,"Name":"actionRealTimeLocation","TemplateSMS":"<>","Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n 0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\nvar configs = [];\r\nvar configsSMS = [];\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar command = '01';\r\nvar key = '12';\r\nvar totalLenght = '0300';\r\nvar keyLength = '01';\r\nvar messageBody = command + keyLength + key;\r\nvar checksum = byteStringToByteArray(messageBody);\r\nchecksum = crc16byte(checksum);\r\nchecksum = decimalToHex(checksum);\r\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\r\nchecksum = changeEndianness(checksum);\r\nvar prefix = 'AB10' + totalLenght + checksum + sequenceID;\r\nvar data = prefix + messageBody;\r\n// For GPRS command\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\n// For SMS command\r\n/* Answer from the device\r\nGPS Loc!\r\nNow:\r\nLoc Time:07/04/2021 17:36:44\r\nSpeed:0km/h\r\nAltitude:97.0\r\nBattery:57%\r\nwww.google.com/maps?q=22.6537233,114.0006070\r\n*/\r\nvar dataSMS = 'loc';\r\nAddValueSMS('dataSMS', dataSMS);\r\nvar commandConfigs = {\r\n template: \"main\",\r\n configs: configs,\r\n configsSMS: configsSMS\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n\r\nfunction AddValue(p1, p2) {\r\n var cvpair = {\r\n code: p1,\r\n value: p2\r\n };\r\n configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n var cvpair = {\r\n code: p1,\r\n value: p2\r\n };\r\n configsSMS.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n var arr1 = [];\r\n for (var n = 0, l = str.length; n < l; n++) {\r\n var hex = Number(str.charCodeAt(n)).toString(16);\r\n arr1.push(hex);\r\n }\r\n return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n var crc = 0x0000;\r\n var j, i;\r\n for (i = 0; i < s.length; i++) {\r\n c = s[i];\r\n if (c > 255) {\r\n throw new RangeError();\r\n }\r\n j = (c ^ (crc >> 8)) & 0xFF;\r\n crc = crcTable[j] ^ (crc << 8);\r\n }\r\n return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n var splitStr = []\r\n var j = 0\r\n for (let i = 0; i < str.length; i += 2) {\r\n splitStr[j] = str.substring(i, i + 2)\r\n j++\r\n }\r\n var bytes = []\r\n var bytePos = 0\r\n for (let i = 0; i < splitStr.length; i++) {\r\n var byteStr = splitStr[i]\r\n var b = parseInt(byteStr, 16)\r\n if (b < 256) {\r\n bytes[bytePos] = b\r\n bytePos++\r\n }\r\n }\r\n return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n hexString = str.toString(16);\r\n return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n let bin = 0;\r\n let rem, i = 1,\r\n step = 1;\r\n while (x != 0) {\r\n rem = x % 2;\r\n x = parseInt(x / 2);\r\n bin = bin + rem * i;\r\n i = i * 10;\r\n }\r\n return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n var hexa = parseInt(x, 2).toString(16);\r\n return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n const result = [];\r\n let len = string.length - 2;\r\n while (len >= 0) {\r\n result.push(string.substr(len, 2));\r\n len -= 2;\r\n }\r\n return result.join('');\r\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":2,"HasAck":true,"HexString":true,"Order":10,"SendAttempts":4,"ProtocolActionObjects":[],"Tags":[]},{"Id":5780,"Name":"actionConfigurationMode","TemplateSMS":null,"Template":"<>","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":5781,"Name":"setSOSNumber","TemplateSMS":null,"Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\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":5782,"Name":"getServer","TemplateSMS":null,"Template":"<>","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":5783,"Name":"setMicVolume","TemplateSMS":null,"Template":"<>","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":5784,"Name":"setPowerAlert","TemplateSMS":null,"Template":"<>","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":[],"Tags":[]},{"Id":5785,"Name":"actionInitializeMileage","TemplateSMS":null,"Template":"<>","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":5786,"Name":"setAuthorisedNumbers","TemplateSMS":"","Template":"<>","AckTemplate":null,"Operation":"//updated v 3 for EV06\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//[Length]:10 [Key]:34 [Value]:E0 09 31 32 33 34 35 36 37 38 39 02 79 6F 00\r\n//{\"numberNamePhoto\":{\"call\":1,\"noCard\":0,\"number\":\"123456789\",\"enable\":1,\"sms\":1,\"name\":\"yo\",\"headURL\":\"\",\"index\":0}}\r\n// para pruebas en local Contact':\r\n//AB 10 12 00 94 ED 00 00 02 10 34 E0 09 31 32 33 34 35 36 37 38 39 02 79 6F 00\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 nameHex = '';\r\nvar value = '02';\r\nvar keyLength = '00';\r\nvar confTel = '';\r\nvar count = 1; // approved contact will be from A2 to A9 - index 1 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 += \"0534\" + 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 nameHex = ascii_to_hexa(params.ApprovedContacts[contact].Name).toUpperCase();\r\n nameLength = ('00' + decimalToHex(params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\r\n keyLength = ('00' + decimalToHex(5 + params.ApprovedContacts[contact].Contact.length + params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\r\n value += keyLength + \"34\" + confTel + numberLength + numberHex + nameLength + nameHex + '00'; //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 nameHex = ascii_to_hexa(params.ApprovedContacts[contact].Name).toUpperCase();\r\n nameLength = ('00' + decimalToHex(params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\r\n keyLength = ('00' + decimalToHex(5 + params.ApprovedContacts[contact].Contact.length + params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\r\n value += keyLength + \"34\" + confTel + numberLength + numberHex + nameLength + nameHex + '00'; //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 += \"0534\" + 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\":5786,\"Name\":\"setAuthorisedNumbers\",\"TemplateSMS\":\"\",\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"//updated v 3 for EV06\\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//[Length]:10 [Key]:34 [Value]:E0 09 31 32 33 34 35 36 37 38 39 02 79 6F 00\\r\\n//{\\\"numberNamePhoto\\\":{\\\"call\\\":1,\\\"noCard\\\":0,\\\"number\\\":\\\"123456789\\\",\\\"enable\\\":1,\\\"sms\\\":1,\\\"name\\\":\\\"yo\\\",\\\"headURL\\\":\\\"\\\",\\\"index\\\":0}}\\r\\n// para pruebas en local Contact':\\r\\n//AB 10 12 00 94 ED 00 00 02 10 34 E0 09 31 32 33 34 35 36 37 38 39 02 79 6F 00\\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 nameHex = '';\\r\\nvar value = '02';\\r\\nvar keyLength = '00';\\r\\nvar confTel = '';\\r\\nvar count = 1; // approved contact will be from A2 to A9 - index 1 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 += \\\"0534\\\" + 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 = params.ApprovedContacts[contact].Contact;\\r\\n if (numberHex.startsWith(\\\"+\\\")) {\\r\\n numberHex = \\\"00\\\" + numberHex.substring(1);\\r\\n }\\r\\n numberHex = ascii_to_hexa(numberHex).toUpperCase();\\r\\n numberLength = ('00' + decimalToHex(params.ApprovedContacts[contact].Contact.length)).slice(-2).toUpperCase();\\r\\n nameHex = ascii_to_hexa(params.ApprovedContacts[contact].Name).toUpperCase();\\r\\n nameLength = ('00' + decimalToHex(params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n keyLength = ('00' + decimalToHex(5 + params.ApprovedContacts[contact].Contact.length + params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n value += keyLength + \\\"34\\\" + confTel + numberLength + numberHex + nameLength + nameHex + '00'; //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 = params.ApprovedContacts[contact].Contact;\\r\\n if (numberHex.startsWith(\\\"+\\\")) {\\r\\n numberHex = \\\"00\\\" + numberHex.substring(1);\\r\\n }\\r\\n numberHex = ascii_to_hexa(numberHex).toUpperCase();\\r\\n numberLength = ('00' + decimalToHex(params.ApprovedContacts[contact].Contact.length)).slice(-2).toUpperCase();\\r\\n nameHex = ascii_to_hexa(params.ApprovedContacts[contact].Name).toUpperCase();\\r\\n nameLength = ('00' + decimalToHex(params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n keyLength = ('00' + decimalToHex(5 + params.ApprovedContacts[contact].Contact.length + params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n value += keyLength + \\\"34\\\" + confTel + numberLength + numberHex + nameLength + nameHex + '00'; //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 += \\\"0534\\\" + 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\":[],\"Tags\":[]}","Timestamp":1752596927},{"Type":1,"NewValue":"{\"Id\":5786,\"Name\":\"setAuthorisedNumbers\",\"TemplateSMS\":\"\",\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"//updated v 3 for EV06\\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//[Length]:10 [Key]:34 [Value]:E0 09 31 32 33 34 35 36 37 38 39 02 79 6F 00\\r\\n//{\\\"numberNamePhoto\\\":{\\\"call\\\":1,\\\"noCard\\\":0,\\\"number\\\":\\\"123456789\\\",\\\"enable\\\":1,\\\"sms\\\":1,\\\"name\\\":\\\"yo\\\",\\\"headURL\\\":\\\"\\\",\\\"index\\\":0}}\\r\\n// para pruebas en local Contact':\\r\\n//AB 10 12 00 94 ED 00 00 02 10 34 E0 09 31 32 33 34 35 36 37 38 39 02 79 6F 00\\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 phoneNumber = '';\\r\\nvar numberLength = '00';\\r\\nvar numberHex = '';\\r\\nvar nameLength = '00';\\r\\nvar nameHex = '';\\r\\nvar value = '02';\\r\\nvar keyLength = '00';\\r\\nvar confTel = '';\\r\\nvar count = 1; // approved contact will be from A2 to A9 - index 1 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 += \\\"0534\\\" + 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 phoneNumber = params.ApprovedContacts[contact].Contact;\\r\\n if (phoneNumber.startsWith(\\\"+\\\")) {\\r\\n phoneNumber = \\\"00\\\" + phoneNumber.substring(1);\\r\\n }\\r\\n numberHex = ascii_to_hexa(phoneNumber).toUpperCase();\\r\\n numberLength = ('00' + decimalToHex(phoneNumber.length)).slice(-2).toUpperCase();\\r\\n nameHex = ascii_to_hexa(params.ApprovedContacts[contact].Name).toUpperCase();\\r\\n nameLength = ('00' + decimalToHex(params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n keyLength = ('00' + decimalToHex(5 + phoneNumber.length + params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n value += keyLength + \\\"34\\\" + confTel + numberLength + numberHex + nameLength + nameHex + '00'; //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 phoneNumber = params.ApprovedContacts[contact].Contact;\\r\\n if (phoneNumber.startsWith(\\\"+\\\")) {\\r\\n phoneNumber = \\\"00\\\" + phoneNumber.substring(1);\\r\\n }\\r\\n numberHex = ascii_to_hexa(phoneNumber).toUpperCase();\\r\\n numberLength = ('00' + decimalToHex(phoneNumber.length)).slice(-2).toUpperCase();\\r\\n nameHex = ascii_to_hexa(params.ApprovedContacts[contact].Name).toUpperCase();\\r\\n nameLength = ('00' + decimalToHex(params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n keyLength = ('00' + decimalToHex(5 + phoneNumber.length + params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n value += keyLength + \\\"34\\\" + confTel + numberLength + numberHex + nameLength + nameHex + '00'; //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 += \\\"0534\\\" + 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\":[],\"Tags\":[]}","Timestamp":1752597287}],"Tags":[]},{"Id":5787,"Name":"actionFindDevice","TemplateSMS":"<>","Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\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":[],"Tags":[]},{"Id":5788,"Name":"setWifiSettings","TemplateSMS":"<>","Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\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":5789,"Name":"getSystemSettings","TemplateSMS":"<>","Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\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":5790,"Name":"setSpeedDialNumber","TemplateSMS":null,"Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\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":5791,"Name":"getVolume","TemplateSMS":null,"Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\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":[],"Tags":[]},{"Id":5792,"Name":"getFallDownAlert","TemplateSMS":"","Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\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":[],"Tags":[]},{"Id":5793,"Name":"getNoMotionAlert","TemplateSMS":"","Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\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":[],"Tags":[]},{"Id":5794,"Name":"getCustomId","TemplateSMS":"","Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\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":[],"Tags":[]},{"Id":5795,"Name":"getPerformanceMode","TemplateSMS":"","Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\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":[],"Tags":[]},{"Id":5796,"Name":"getFirmwareVersion","TemplateSMS":"<>","Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\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":[],"Tags":[]},{"Id":5797,"Name":"setWifiList","TemplateSMS":null,"Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\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":5798,"Name":"getSystemLanguage","TemplateSMS":"<>","Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\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":[],"Tags":[]},{"Id":5730,"Name":"setVoicePromptVolume","TemplateSMS":null,"Template":"<>","AckTemplate":null,"Operation":"var configs = [];\nvar crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\n 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\n 0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\n 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\n];\nif (params.SystemSettings.Volume) {\n var volume = parseInt(params.SystemSettings.Volume)\n volume = decimalToHex(volume)\n volume = ('00' + volume).slice(-2).toUpperCase()\n}\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase()\nvar command = '02'\nvar keyLength = '02'\nvar key = '1C'\nvar messageBody = command + keyLength + key + volume\nvar checksum = byteStringToByteArray(messageBody)\nchecksum = crc16byte(checksum)\nchecksum = decimalToHex(checksum).toUpperCase()\nchecksum = ('0000' + checksum).slice(-4)\nchecksum = changeEndianness(checksum)\n//Hpw to calculate sequenceID\nvar prefix = 'AB10' + '0400' + checksum + sequenceID\nvar data = prefix + messageBody\nAddValue('data', data);\nAddValue('sequenceNumber', sequenceID); //add 20/07\nvar commandConfigs = {\n template: \"main\",\n configs: configs\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValue(p1, p2) {\n var cvpair = {\n code: p1,\n value: p2\n };\n configs.push(cvpair);\n}\n\nfunction ascii_to_hexa(str) {\n var arr1 = [];\n for (var n = 0, l = str.length; n < l; n++) {\n var hex = Number(str.charCodeAt(n)).toString(16);\n arr1.push(hex);\n }\n return arr1.join('');\n}\n\nfunction crc16byte(s) {\n var crc = 0x0000;\n var j, i;\n for (i = 0; i < s.length; i++) {\n c = s[i];\n if (c > 255) {\n throw new RangeError();\n }\n j = (c ^ (crc >> 8)) & 0xFF;\n crc = crcTable[j] ^ (crc << 8);\n }\n return ((crc ^ 0) & 0xFFFF);\n}\n\nfunction byteStringToByteArray(str) {\n var splitStr = []\n var j = 0\n for (let i = 0; i < str.length; i += 2) {\n splitStr[j] = str.substring(i, i + 2)\n j++\n }\n var bytes = []\n var bytePos = 0\n for (let i = 0; i < splitStr.length; i++) {\n var byteStr = splitStr[i]\n var b = parseInt(byteStr, 16)\n if (b < 256) {\n bytes[bytePos] = b\n bytePos++\n }\n }\n return bytes\n}\n\nfunction decimalToHex(str) {\n hexString = str.toString(16);\n return hexString\n}\n\nfunction changeEndianness(string) {\n const result = [];\n let len = string.length - 2;\n while (len >= 0) {\n result.push(string.substr(len, 2));\n len -= 2;\n }\n return result.join('');\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":true,"Order":null,"SendAttempts":2,"ProtocolActionObjects":[],"Tags":[]},{"Id":5765,"Name":"getCurrentSettings","TemplateSMS":"<>","Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\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 = '1A73344041424356101F44534733'; //1A73\r\n// Firmware Long, Contacts, APNusername, APNpass, server details, fall sensitivity and Beacon List, Fall down alert, Ring tome vol,System language, time interval, No motion alert,custom id, allow list\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar command = '02';\r\n//var keyLength = '10'; // previous\r\nvar keyLength = '0F'; //+1 qnt of commands\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' + '1100' + 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\":5765,\"Name\":\"getCurrentSettings\",\"TemplateSMS\":\"<>\",\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\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 = '1A73344041424356101F445347330F46'; //1A73\\r\\n// Firmware Long, Contacts, APNusername, APNpass, server details, fall sensitivity and Beacon List, Fall down alert, Ring tome vol,System language, time interval, No motion alert,custom id, allow list, Step settings, HRate Setting\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\nvar command = '02';\\r\\n//var keyLength = '10'; // previous\\r\\nvar keyLength = '11'; //+1 qnt of commands\\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' + '1300' + checksum + sequenceID; // add 2 to keylenght\\r\\nvar data = prefix + messageBody;\\r\\n// For GPRS command\\r\\nAddValue('data', data);\\r\\nAddValue('sequenceNumber', sequenceID);\\r\\n// For SMS command\\r\\nAddValueSMS('dataSMS', dataSMS);\\r\\nvar commandConfigs = {\\r\\n template: \\\"main\\\",\\r\\n configs: configs,\\r\\n configsSMS: configsSMS\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n// functions\\r\\nfunction AddValue(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n var arr1 = [];\\r\\n for (var n = 0, l = str.length; n < l; n++) {\\r\\n var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n arr1.push(hex);\\r\\n }\\r\\n return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n var crc = 0x0000;\\r\\n var j, i;\\r\\n for (i = 0; i < s.length; i++) {\\r\\n c = s[i];\\r\\n if (c > 255) {\\r\\n throw new RangeError();\\r\\n }\\r\\n j = (c ^ (crc >> 8)) & 0xFF;\\r\\n crc = crcTable[j] ^ (crc << 8);\\r\\n }\\r\\n return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n var splitStr = []\\r\\n var j = 0\\r\\n for (let i = 0; i < str.length; i += 2) {\\r\\n splitStr[j] = str.substring(i, i + 2)\\r\\n j++\\r\\n }\\r\\n var bytes = []\\r\\n var bytePos = 0\\r\\n for (let i = 0; i < splitStr.length; i++) {\\r\\n var byteStr = splitStr[i]\\r\\n var b = parseInt(byteStr, 16)\\r\\n if (b < 256) {\\r\\n bytes[bytePos] = b\\r\\n bytePos++\\r\\n }\\r\\n }\\r\\n return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n hexString = str.toString(16);\\r\\n return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n let bin = 0;\\r\\n let rem, i = 1,\\r\\n step = 1;\\r\\n while (x != 0) {\\r\\n rem = x % 2;\\r\\n x = parseInt(x / 2);\\r\\n bin = bin + rem * i;\\r\\n i = i * 10;\\r\\n }\\r\\n return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n var hexa = parseInt(x, 2).toString(16);\\r\\n return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n const result = [];\\r\\n let len = string.length - 2;\\r\\n while (len >= 0) {\\r\\n result.push(string.substr(len, 2));\\r\\n len -= 2;\\r\\n }\\r\\n return result.join('');\\r\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":true,\"Order\":17,\"SendAttempts\":4,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1749577720},{"Type":1,"NewValue":"{\"Id\":5765,\"Name\":\"getCurrentSettings\",\"TemplateSMS\":\"<>\",\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\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 = '1A73344041424356101F445347330F467A'; //1A73\\r\\n// Firmware Long, Contacts, APNusername, APNpass, server details, fall sensitivity and Beacon List, Fall down alert, Ring tome vol,System language, time interval, No motion alert,custom id, allow list, Step settings, HRate Setting\\r\\n// SPO2 interval\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\nvar command = '02';\\r\\n//var keyLength = '10'; // previous\\r\\nvar keyLength = '12'; //+1 qnt of commands\\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' + '1400' + checksum + sequenceID; // add 2 to keylenght\\r\\nvar data = prefix + messageBody;\\r\\n// For GPRS command\\r\\nAddValue('data', data);\\r\\nAddValue('sequenceNumber', sequenceID);\\r\\n// For SMS command\\r\\nAddValueSMS('dataSMS', dataSMS);\\r\\nvar commandConfigs = {\\r\\n template: \\\"main\\\",\\r\\n configs: configs,\\r\\n configsSMS: configsSMS\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n// functions\\r\\nfunction AddValue(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n var arr1 = [];\\r\\n for (var n = 0, l = str.length; n < l; n++) {\\r\\n var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n arr1.push(hex);\\r\\n }\\r\\n return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n var crc = 0x0000;\\r\\n var j, i;\\r\\n for (i = 0; i < s.length; i++) {\\r\\n c = s[i];\\r\\n if (c > 255) {\\r\\n throw new RangeError();\\r\\n }\\r\\n j = (c ^ (crc >> 8)) & 0xFF;\\r\\n crc = crcTable[j] ^ (crc << 8);\\r\\n }\\r\\n return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n var splitStr = []\\r\\n var j = 0\\r\\n for (let i = 0; i < str.length; i += 2) {\\r\\n splitStr[j] = str.substring(i, i + 2)\\r\\n j++\\r\\n }\\r\\n var bytes = []\\r\\n var bytePos = 0\\r\\n for (let i = 0; i < splitStr.length; i++) {\\r\\n var byteStr = splitStr[i]\\r\\n var b = parseInt(byteStr, 16)\\r\\n if (b < 256) {\\r\\n bytes[bytePos] = b\\r\\n bytePos++\\r\\n }\\r\\n }\\r\\n return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n hexString = str.toString(16);\\r\\n return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n let bin = 0;\\r\\n let rem, i = 1,\\r\\n step = 1;\\r\\n while (x != 0) {\\r\\n rem = x % 2;\\r\\n x = parseInt(x / 2);\\r\\n bin = bin + rem * i;\\r\\n i = i * 10;\\r\\n }\\r\\n return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n var hexa = parseInt(x, 2).toString(16);\\r\\n return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n const result = [];\\r\\n let len = string.length - 2;\\r\\n while (len >= 0) {\\r\\n result.push(string.substr(len, 2));\\r\\n len -= 2;\\r\\n }\\r\\n return result.join('');\\r\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":true,\"Order\":17,\"SendAttempts\":4,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1763495958}],"Tags":[]},{"Id":5769,"Name":"setFallSettings","TemplateSMS":"<>","Template":"<>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n 0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\nvar msg = [];\r\nvar configs = [];\r\nvar configsSMS = [];\r\n// configuration command (0X02) Fall sensitivity\r\nvar messageBody = '02';\r\nvar sensitivity = '';\r\nvar dataSMS = '';\r\nvar value = ''\r\nif (params.FallSettings.EnableDisableFallSettings == 'true') {\r\n value += '1'\r\n value += '100' //Dial\r\n //}\r\n if (params.FallSettings.Sensitivity) {\r\n var sensiString = params.FallSettings.Sensitivity.split(',');\r\n var level = sensiString[1];\r\n sensitivity = parseInt(sensiString[0]);\r\n // For SMS\r\n dataSMS = `FL1,${sensitivity},1`;\r\n //numberHex = ascii_to_hexa(sensitivity).toUpperCase();\r\n sensitivity = ('0000' + decimalToBinary(sensitivity)).slice(-4).toUpperCase()\r\n value += sensitivity\r\n }\r\n} else {\r\n value = '01100001'\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":[],"Tags":[]},{"Id":5806,"Name":"setWatchSettings","TemplateSMS":null,"Template":"<>","AckTemplate":null,"Operation":"// Watch Settings\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 Watch Settings' Only enable y disable:\r\n// params.StepCounting.EnableDisableStepCounting == 'true'\r\n// params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true'\r\n//var params = {StepCounting:{'EnableDisableStepCounting':'true'},HeartRateMonitor:{'EnableDisableHeartRateMonitor':'true'}, DeviceVersion:{'DeviceVersion':2}}\r\n// Test enabled both\r\n// AB 10 13 00 40 6F 00 00 02 11 36 00 08 1A 00 00 3E 00 00 00 14 00 00 00 00 00 00\r\n// test step on HRT off\r\n// 02 11 36 00 08 0A 00 00 3C 00 00 00 14 00 00 00 00 00 00\r\n// test step off HRT on\r\n// 02 11 36 00 08 12 00 00 3A 00 00 00 14 00 00 00 00 00 00\r\n// test both off \r\n// 02 11 36 00 08 02 00 00 38 00 00 00 14 00 00 00 00 00 00 \r\nvar msg = [];\r\nvar configs = [];\r\n// configuration command (0X02) , lenght and key\r\nvar messageBody = '021136';\r\n// step count/heart value display\r\n// Watch setting related FACE ID\r\nmessageBody += '00'; // Default FACE ID 0 \r\n// Future\r\n//if (params.WatchFace.SetWatchFace) {\r\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \r\n//} else {\r\n// messageBody += '00'; // Analog Face Default FACE ID 0 \r\n//}\r\n// Watch Display setting related to Step and heart rate settings\r\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true')) {\r\n messageBody += '081A0000'; //both displays\r\n messageBody += '06000000'; //menu 1 and 2\r\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'false')) {\r\n messageBody += '080A0000'; // step display\r\n messageBody += '04000000'; //menu 2\r\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true')) {\r\n messageBody += '08120000'; // heart display\r\n messageBody += '02000000'; //menu 1\r\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'false')) {\r\n messageBody += '08020000'; // no displays\r\n messageBody += '00000000'; // no menu\r\n} else {\r\n messageBody += '08020000'; //no displays\r\n messageBody += '00000000'; // no menu\r\n}\r\n//menu items for the future\r\n/*if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'true')) {\r\n messageBody += '06000000'; //menu 1 and 2\r\n} else if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'false')) {\r\n messageBody += '04000000'; //menu 2\r\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'true')) {\r\n messageBody += '02000000'; //menu 1\r\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'false')) {\r\n messageBody += '00000000'; // no menu\r\n} else {\r\n messageBody += '00000000'; // no menu\r\n}*/\r\n// from autohome page to the end\r\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\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":4,"ProtocolActionObjects":[{"Type":0,"NewValue":"{\"Id\":5806,\"Name\":\"setWatchSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"// Watch Settings\\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 Watch Settings' Only enable y disable:\\r\\n// params.StepCounting.EnableDisableStepCounting == 'true'\\r\\n// params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true'\\r\\n//var params = {StepCounting:{'EnableDisableStepCounting':'true'},HeartRateMonitor:{'EnableDisableHeartRateMonitor':'true'}, DeviceVersion:{'DeviceVersion':2}}\\r\\n// Test enabled both\\r\\n// AB 10 13 00 40 6F 00 00 02 11 36 00 08 1A 00 00 3E 00 00 00 14 00 00 00 00 00 00\\r\\n// test step on HRT off\\r\\n// 02 11 36 00 08 0A 00 00 3C 00 00 00 14 00 00 00 00 00 00\\r\\n// test step off HRT on\\r\\n// 02 11 36 00 08 12 00 00 3A 00 00 00 14 00 00 00 00 00 00\\r\\n// test both off \\r\\n// 02 11 36 00 08 02 00 00 38 00 00 00 14 00 00 00 00 00 00 \\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\n// configuration command (0X02) , lenght and key\\r\\nvar messageBody = '021136';\\r\\n// step count/heart value display\\r\\n// Watch setting related FACE ID\\r\\nmessageBody += '00'; // Default FACE ID 0 \\r\\n// Future\\r\\n//if (params.WatchFace.SetWatchFace) {\\r\\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \\r\\n//} else {\\r\\n// messageBody += '00'; // Analog Face Default FACE ID 0 \\r\\n//}\\r\\n// Watch Display setting related to Step and heart rate settings\\r\\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true')) {\\r\\n messageBody += '081A0000'; //both displays\\r\\n messageBody += '06000000'; //menu 1 and 2\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'false')) {\\r\\n messageBody += '080A0000'; // step display\\r\\n messageBody += '04000000'; //menu 2\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true')) {\\r\\n messageBody += '08120000'; // heart display\\r\\n messageBody += '02000000'; //menu 1\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'false')) {\\r\\n messageBody += '08020000'; // no displays\\r\\n messageBody += '00000000'; // no menu\\r\\n} else {\\r\\n messageBody += '08020000'; //no displays\\r\\n messageBody += '00000000'; // no menu\\r\\n}\\r\\n//menu items for the future\\r\\n/*if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '06000000'; //menu 1 and 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '04000000'; //menu 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '02000000'; //menu 1\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '00000000'; // no menu\\r\\n} else {\\r\\n messageBody += '00000000'; // no menu\\r\\n}*/\\r\\n// from autohome page to the end\\r\\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\\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\":4,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1748973730},{"Type":1,"NewValue":"{\"Id\":5806,\"Name\":\"setWatchSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"// Watch Settings\\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 Watch Settings' Only enable y disable:\\r\\n// params.StepCounting.EnableDisableStepCounting == 'true'\\r\\n// params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true'\\r\\n//var params = {StepCounting:{'EnableDisableStepCounting':'true'},HeartRateMonitor:{'EnableDisableHeartRateMonitor':'true'}, DeviceVersion:{'DeviceVersion':2}}\\r\\n// Test enabled both\\r\\n// AB 10 13 00 40 6F 00 00 02 11 36 00 08 1A 00 00 3E 00 00 00 14 00 00 00 00 00 00\\r\\n// test step on HRT off\\r\\n// 02 11 36 00 08 0A 00 00 3C 00 00 00 14 00 00 00 00 00 00\\r\\n// test step off HRT on\\r\\n// 02 11 36 00 08 12 00 00 3A 00 00 00 14 00 00 00 00 00 00\\r\\n// test both off \\r\\n// 02 11 36 00 08 02 00 00 38 00 00 00 14 00 00 00 00 00 00 \\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\n// configuration command (0X02) , lenght and key\\r\\nvar messageBody = '021136';\\r\\n// step count/heart value display\\r\\n// Watch setting related FACE ID\\r\\nmessageBody += '00'; // Default FACE ID 0 \\r\\n// Future\\r\\n//if (params.WatchFace.SetWatchFace) {\\r\\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \\r\\n//} else {\\r\\n// messageBody += '00'; // Analog Face Default FACE ID 0 \\r\\n//}\\r\\n// Watch Display setting related to Step and heart rate settings\\r\\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '081A0000'; //both displays\\r\\n messageBody += '06000000'; //menu 1 and 2\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '080A0000'; // step display\\r\\n messageBody += '04000000'; //menu 2\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '08120000'; // heart display\\r\\n messageBody += '02000000'; //menu 1\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '08020000'; // no displays\\r\\n messageBody += '00000000'; // no menu\\r\\n} else {\\r\\n messageBody += '08020000'; //no displays\\r\\n messageBody += '00000000'; // no menu\\r\\n}\\r\\n//menu items for the future\\r\\n/*if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '06000000'; //menu 1 and 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '04000000'; //menu 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '02000000'; //menu 1\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '00000000'; // no menu\\r\\n} else {\\r\\n messageBody += '00000000'; // no menu\\r\\n}*/\\r\\n// from autohome page to the end\\r\\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\\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\":4,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1749574591},{"Type":1,"NewValue":"{\"Id\":5806,\"Name\":\"setWatchSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"// Watch Settings\\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 Watch Settings' Only enable y disable:\\r\\n// params.StepCounting.EnableDisableStepCounting == 'true'\\r\\n// params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true'\\r\\n//var params = {StepCounting:{'EnableDisableStepCounting':'true'},HeartRateMonitor:{'EnableDisableHeartRateMonitor':'true'}, DeviceVersion:{'DeviceVersion':2}}\\r\\n// Test enabled both\\r\\n// AB 10 13 00 40 6F 00 00 02 11 36 00 08 1A 00 00 3E 00 00 00 14 00 00 00 00 00 00\\r\\n// test step on HRT off\\r\\n// 02 11 36 00 08 0A 00 00 3C 00 00 00 14 00 00 00 00 00 00\\r\\n// test step off HRT on\\r\\n// 02 11 36 00 08 12 00 00 3A 00 00 00 14 00 00 00 00 00 00\\r\\n// test both off \\r\\n// 02 11 36 00 08 02 00 00 38 00 00 00 14 00 00 00 00 00 00 \\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\n// configuration command (0X02) , lenght and key\\r\\nvar messageBody = '021136';\\r\\n// step count/heart value display\\r\\n// Watch setting related FACE ID\\r\\nmessageBody += '00'; // Default FACE ID 0 \\r\\n// Future\\r\\n//if (params.WatchFace.SetWatchFace) {\\r\\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \\r\\n//} else {\\r\\n// messageBody += '00'; // Analog Face Default FACE ID 0 \\r\\n//}\\r\\n// Watch Display setting related to Step and heart rate settings\\r\\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '081A0000'; //both displays\\r\\n messageBody += '06000000'; //menu 1 and 2\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '080A0000'; // step display\\r\\n messageBody += '04000000'; //menu 2\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '08120000'; // heart display\\r\\n messageBody += '02000000'; //menu 1\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '08020000'; // no displays\\r\\n messageBody += '00000000'; // no menu\\r\\n} else {\\r\\n messageBody += '08020000'; //no displays\\r\\n messageBody += '00000000'; // no menu\\r\\n}\\r\\n//menu items for the future\\r\\n/*if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '06000000'; //menu 1 and 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '04000000'; //menu 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '02000000'; //menu 1\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '00000000'; // no menu\\r\\n} else {\\r\\n messageBody += '00000000'; // no menu\\r\\n}*/\\r\\n// from autohome page to the end\\r\\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\\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\\n//AddValueSMS('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":1749575829},{"Type":1,"NewValue":"{\"Id\":5806,\"Name\":\"setWatchSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"// Watch Settings\\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 Watch Settings' Only enable y disable:\\r\\n// params.StepCounting.EnableDisableStepCounting == 'true'\\r\\n// params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true'\\r\\n//var params = {StepCounting:{'EnableDisableStepCounting':'true'},HeartRateMonitor:{'EnableDisableHeartRateMonitor':'true'}, DeviceVersion:{'DeviceVersion':2}}\\r\\n// Test enabled both\\r\\n// AB 10 13 00 99 6A 0A 00 02 11 36 00 08 1B 00 00 0E 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step on HRT off\\r\\n// AB 10 13 00 DD 0C 0B 00 02 11 36 00 08 0B 00 00 0C 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step off HRT on\\r\\n// AB 10 13 00 B5 D0 09 00 02 11 36 00 08 13 00 00 0A 00 00 00 14 00 00 00 03 0A 01\\r\\n// test both off \\r\\n// AB 10 13 00 F1 B6 0C 00 02 11 36 00 08 03 00 00 08 00 00 00 14 00 00 00 03 0A 01 \\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\n// configuration command (0X02) , lenght and key\\r\\nvar messageBody = '021136';\\r\\n// step count/heart value display\\r\\n// Watch setting related FACE ID\\r\\nmessageBody += '00'; // Default FACE ID 0 \\r\\n// Future\\r\\n//if (params.WatchFace.SetWatchFace) {\\r\\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \\r\\n//} else {\\r\\n// messageBody += '00'; // Analog Face Default FACE ID 0 \\r\\n//}\\r\\n// Watch Display setting related to Step and heart rate settings\\r\\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '081B0000'; //both displays\\r\\n messageBody += '0E000000'; //menu 1 and 2\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '080B0000'; // step display\\r\\n messageBody += '0C000000'; //menu 2\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '08130000'; // heart display\\r\\n messageBody += '0A000000'; //menu 1\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '08030000'; // no displays\\r\\n messageBody += '08000000'; // no menu , only contact\\r\\n} else {\\r\\n messageBody += '08030000'; //no displays\\r\\n messageBody += '08000000'; // no menu.. only contact\\r\\n}\\r\\n//menu items for the future\\r\\n/*if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '06000000'; //menu 1 and 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '04000000'; //menu 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '02000000'; //menu 1\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '00000000'; // no menu\\r\\n} else {\\r\\n messageBody += '00000000'; // no menu\\r\\n}*/\\r\\n// from autohome page to the end\\r\\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\\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\\n//AddValueSMS('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":1749576611},{"Type":1,"NewValue":"{\"Id\":5806,\"Name\":\"setWatchSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"// Watch Settings\\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 Watch Settings' Only enable y disable:\\r\\n// params.StepCounting.EnableDisableStepCounting == 'true'\\r\\n// params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true'\\r\\n//var params = {StepCounting:{'EnableDisableStepCounting':'true'},HeartRateMonitor:{'EnableDisableHeartRateMonitor':'true'}, DeviceVersion:{'DeviceVersion':2}}\\r\\n// Test enabled both\\r\\n// AB 10 13 00 99 6A 0A 00 02 11 36 00 08 1B 00 00 0E 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step on HRT off\\r\\n// AB 10 13 00 DD 0C 0B 00 02 11 36 00 08 0B 00 00 0C 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step off HRT on\\r\\n// AB 10 13 00 B5 D0 09 00 02 11 36 00 08 13 00 00 0A 00 00 00 14 00 00 00 03 0A 01\\r\\n// test both off \\r\\n// AB 10 13 00 F1 B6 0C 00 02 11 36 00 08 03 00 00 08 00 00 00 14 00 00 00 03 0A 01 \\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\n// configuration command (0X02) , lenght and key\\r\\nvar messageBody = '021136';\\r\\n// step count/heart value display\\r\\n// Watch setting related FACE ID\\r\\nmessageBody += '00'; // Default FACE ID 0 \\r\\n// Future\\r\\n//if (params.WatchFace.SetWatchFace) {\\r\\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \\r\\n//} else {\\r\\n// messageBody += '00'; // Analog Face Default FACE ID 0 \\r\\n//}\\r\\n// Watch Display setting related to Step and heart rate settings\\r\\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '081B0000'; //both displays\\r\\n messageBody += '06000000'; //menu 1 and 2 no contact (menu 3) // 0E with contact menu\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '080B0000'; // step display\\r\\n messageBody += '04000000'; //menu 2 no contact (menu 3) //0C with contact menu\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '08130000'; // heart display\\r\\n messageBody += '02000000'; //menu 1 no contact (menu 3) // 0A with contact menu\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '08030000'; // no displays\\r\\n messageBody += '00000000'; // no menu , //08 only contact\\r\\n} else {\\r\\n messageBody += '08030000'; //no displays\\r\\n messageBody += '00000000'; // no menu.. only contact\\r\\n}\\r\\n//menu items for the future\\r\\n/*if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '06000000'; //menu 1 and 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '04000000'; //menu 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '02000000'; //menu 1\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '00000000'; // no menu\\r\\n} else {\\r\\n messageBody += '00000000'; // no menu\\r\\n}*/\\r\\n// from autohome page to the end\\r\\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\\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\\n//AddValueSMS('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":1751040656},{"Type":1,"NewValue":"{\"Id\":5806,\"Name\":\"setWatchSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"// Watch Settings\\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 Watch Settings' Only enable y disable:\\r\\n// params.StepCounting.EnableDisableStepCounting == 'true'\\r\\n// params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true'\\r\\n//var params = {StepCounting:{'EnableDisableStepCounting':'true'},HeartRateMonitor:{'EnableDisableHeartRateMonitor':'true'}, DeviceVersion:{'DeviceVersion':2}}\\r\\n// Test enabled both\\r\\n// AB 10 13 00 99 6A 0A 00 02 11 36 00 08 1B 00 00 0E 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step on HRT off\\r\\n// AB 10 13 00 DD 0C 0B 00 02 11 36 00 08 0B 00 00 0C 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step off HRT on\\r\\n// AB 10 13 00 B5 D0 09 00 02 11 36 00 08 13 00 00 0A 00 00 00 14 00 00 00 03 0A 01\\r\\n// test both off \\r\\n// AB 10 13 00 F1 B6 0C 00 02 11 36 00 08 03 00 00 08 00 00 00 14 00 00 00 03 0A 01 \\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\n// configuration command (0X02) , lenght and key\\r\\nvar messageBody = '021136';\\r\\n// step count/heart value display\\r\\n// Watch setting related FACE ID\\r\\nmessageBody += '00'; // Default FACE ID 0 \\r\\n// Future\\r\\n//if (params.WatchFace.SetWatchFace) {\\r\\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \\r\\n//} else {\\r\\n// messageBody += '00'; // Analog Face Default FACE ID 0 \\r\\n//}\\r\\n// Watch Display setting related to Step and heart rate settings\\r\\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '081B0000'; //both displays\\r\\n messageBody += (params.StepsSettings.EnableDisableSP02Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '6000000'; //menu 1 and 2 no contact (menu 3) // 0E with contact menu\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '080B0000'; // step display\\r\\n messageBody += (params.StepsSettings.EnableDisableSP02Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '4000000'; //menu 2 no contact (menu 3) //0C with contact menu\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '08130000'; // heart display\\r\\n messageBody += (params.StepsSettings.EnableDisableSP02Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '2000000'; //menu 1 no contact (menu 3) // 0A with contact menu\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '08030000'; // no displays\\r\\n messageBody += (params.StepsSettings.EnableDisableSP02Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '0000000'; // no menu , //08 only contact\\r\\n} else {\\r\\n messageBody += '08030000'; //no displays\\r\\n messageBody += (params.StepsSettings.EnableDisableSP02Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '0000000'; // no menu.. only contact\\r\\n}\\r\\n//menu items for the future\\r\\n/*if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '06000000'; //menu 1 and 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '04000000'; //menu 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '02000000'; //menu 1\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '00000000'; // no menu\\r\\n} else {\\r\\n messageBody += '00000000'; // no menu\\r\\n}*/\\r\\n// from autohome page to the end\\r\\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\\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\\n//AddValueSMS('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":1763060987},{"Type":1,"NewValue":"{\"Id\":5806,\"Name\":\"setWatchSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"// Watch Settings\\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 Watch Settings' Only enable y disable:\\r\\n// params.StepCounting.EnableDisableStepCounting == 'true'\\r\\n// params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true'\\r\\n//var params = {StepCounting:{'EnableDisableStepCounting':'true'},HeartRateMonitor:{'EnableDisableHeartRateMonitor':'true'}, DeviceVersion:{'DeviceVersion':2}}\\r\\n// Test enabled both\\r\\n// AB 10 13 00 99 6A 0A 00 02 11 36 00 08 1B 00 00 0E 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step on HRT off\\r\\n// AB 10 13 00 DD 0C 0B 00 02 11 36 00 08 0B 00 00 0C 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step off HRT on\\r\\n// AB 10 13 00 B5 D0 09 00 02 11 36 00 08 13 00 00 0A 00 00 00 14 00 00 00 03 0A 01\\r\\n// test both off \\r\\n// AB 10 13 00 F1 B6 0C 00 02 11 36 00 08 03 00 00 08 00 00 00 14 00 00 00 03 0A 01 \\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\n// configuration command (0X02) , lenght and key\\r\\nvar messageBody = '021136';\\r\\n// step count/heart value display\\r\\n// Watch setting related FACE ID\\r\\nmessageBody += '00'; // Default FACE ID 0 \\r\\n// Future\\r\\n//if (params.WatchFace.SetWatchFace) {\\r\\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \\r\\n//} else {\\r\\n// messageBody += '00'; // Analog Face Default FACE ID 0 \\r\\n//}\\r\\n// Watch Display setting related to Step and heart rate settings\\r\\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '081B0000'; //both displays\\r\\n messageBody += (params.StepsSettings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '6000000'; //menu 1 and 2 no contact (menu 3) // 0E with contact menu\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '080B0000'; // step display\\r\\n messageBody += (params.StepsSettings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '4000000'; //menu 2 no contact (menu 3) //0C with contact menu\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '08130000'; // heart display\\r\\n messageBody += (params.StepsSettings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '2000000'; //menu 1 no contact (menu 3) // 0A with contact menu\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '08030000'; // no displays\\r\\n messageBody += (params.StepsSettings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '0000000'; // no menu , //08 only contact\\r\\n} else {\\r\\n messageBody += '08030000'; //no displays\\r\\n messageBody += (params.StepsSettings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '0000000'; // no menu.. only contact\\r\\n}\\r\\n//menu items for the future\\r\\n/*if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '06000000'; //menu 1 and 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '04000000'; //menu 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '02000000'; //menu 1\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '00000000'; // no menu\\r\\n} else {\\r\\n messageBody += '00000000'; // no menu\\r\\n}*/\\r\\n// from autohome page to the end\\r\\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\\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\\n//AddValueSMS('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":1763107860},{"Type":1,"NewValue":"{\"Id\":5806,\"Name\":\"setWatchSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"// Watch Settings\\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 Watch Settings' Only enable y disable:\\r\\n// params.StepCounting.EnableDisableStepCounting == 'true'\\r\\n// params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true'\\r\\n//var params = {StepCounting:{'EnableDisableStepCounting':'true'},HeartRateMonitor:{'EnableDisableHeartRateMonitor':'true'}, DeviceVersion:{'DeviceVersion':2}}\\r\\n// Test enabled both\\r\\n// AB 10 13 00 99 6A 0A 00 02 11 36 00 08 1B 00 00 0E 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step on HRT off\\r\\n// AB 10 13 00 DD 0C 0B 00 02 11 36 00 08 0B 00 00 0C 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step off HRT on\\r\\n// AB 10 13 00 B5 D0 09 00 02 11 36 00 08 13 00 00 0A 00 00 00 14 00 00 00 03 0A 01\\r\\n// test both off \\r\\n// AB 10 13 00 F1 B6 0C 00 02 11 36 00 08 03 00 00 08 00 00 00 14 00 00 00 03 0A 01 \\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\n// configuration command (0X02) , lenght and key\\r\\nvar messageBody = '021136';\\r\\n// step count/heart value display\\r\\n// Watch setting related FACE ID\\r\\nmessageBody += '00'; // Default FACE ID 0 \\r\\n// Future\\r\\n//if (params.WatchFace.SetWatchFace) {\\r\\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \\r\\n//} else {\\r\\n// messageBody += '00'; // Analog Face Default FACE ID 0 \\r\\n//}\\r\\n// Watch Display setting related to Step and heart rate settings\\r\\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '081B0000'; //both displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '6000000'; //menu 1 and 2 no contact (menu 3) // 0E with contact menu\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '080B0000'; // step display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '4000000'; //menu 2 no contact (menu 3) //0C with contact menu\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '08130000'; // heart display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '2000000'; //menu 1 no contact (menu 3) // 0A with contact menu\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '08030000'; // no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '0000000'; // no menu , //08 only contact\\r\\n} else {\\r\\n messageBody += '08030000'; //no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '0000000'; // no menu.. only contact\\r\\n}\\r\\n//menu items for the future\\r\\n/*if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '06000000'; //menu 1 and 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '04000000'; //menu 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '02000000'; //menu 1\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '00000000'; // no menu\\r\\n} else {\\r\\n messageBody += '00000000'; // no menu\\r\\n}*/\\r\\n// from autohome page to the end\\r\\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\\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\\n//AddValueSMS('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":1763108274},{"Type":1,"NewValue":"{\"Id\":5806,\"Name\":\"setWatchSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"// Watch Settings\\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 Watch Settings' Only enable y disable:\\r\\n// params.StepCounting.EnableDisableStepCounting == 'true'\\r\\n// params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true'\\r\\n//var params = {StepCounting:{'EnableDisableStepCounting':'true'},HeartRateMonitor:{'EnableDisableHeartRateMonitor':'true'}, DeviceVersion:{'DeviceVersion':2}}\\r\\n// Test enabled both\\r\\n// AB 10 13 00 99 6A 0A 00 02 11 36 00 08 1B 00 00 0E 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step on HRT off\\r\\n// AB 10 13 00 DD 0C 0B 00 02 11 36 00 08 0B 00 00 0C 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step off HRT on\\r\\n// AB 10 13 00 B5 D0 09 00 02 11 36 00 08 13 00 00 0A 00 00 00 14 00 00 00 03 0A 01\\r\\n// test both off \\r\\n// AB 10 13 00 F1 B6 0C 00 02 11 36 00 08 03 00 00 08 00 00 00 14 00 00 00 03 0A 01 \\r\\n// comando para Contact on ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 4C 2E 03 00 02 11 36 00 08 1B 00 00 4E 00 00 00 14 00 00 00 03 0A 01\\r\\n// comando para contact off ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 C2 8C 04 00 02 11 36 00 08 1B 00 00 46 00 00 00 14 00 00 00 03 0A 01\\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\n// configuration command (0X02) , lenght and key\\r\\nvar messageBody = '021136';\\r\\n// step count/heart value display\\r\\n// Watch setting related FACE ID\\r\\nmessageBody += '00'; // Default FACE ID 0 \\r\\n// Future\\r\\n//if (params.WatchFace.SetWatchFace) {\\r\\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \\r\\n//} else {\\r\\n// messageBody += '00'; // Analog Face Default FACE ID 0 \\r\\n//}\\r\\n// Watch Display setting related to Step and heart rate settings\\r\\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '081B0000'; //both displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '6'; //menu 1 and 2 \\r\\n messageBody += 'E'; //menu 1 and 2 and contact (menu 3) \\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '080B0000'; // step display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '4'; //menu 2 \\r\\n messageBody += 'C'; // menu 2 and contact (menu 3) \\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '08130000'; // heart display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '2'; //menu 1 no contact (menu 3) \\r\\n messageBody += 'A'; //menu 1 and contact (menu 3) \\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '08030000'; // no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '0000000'; // no menu , //08 only contact\\r\\n messageBody += '8'; // //08 only contact\\r\\n messageBody += '000000'; // other settings\\r\\n} else {\\r\\n messageBody += '08030000'; //no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '0000000'; // no menu..\\r\\n}\\r\\n//menu items for the future\\r\\n/*if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '06000000'; //menu 1 and 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '04000000'; //menu 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '02000000'; //menu 1\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '00000000'; // no menu\\r\\n} else {\\r\\n messageBody += '00000000'; // no menu\\r\\n}*/\\r\\n// from autohome page to the end\\r\\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\\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\\n//AddValueSMS('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":1764099175},{"Type":1,"NewValue":"{\"Id\":5806,\"Name\":\"setWatchSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"// Watch Settings\\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 Watch Settings' Only enable y disable:\\r\\n// params.StepCounting.EnableDisableStepCounting == 'true'\\r\\n// params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true'\\r\\n//var params = {StepCounting:{'EnableDisableStepCounting':'true'},HeartRateMonitor:{'EnableDisableHeartRateMonitor':'true'}, DeviceVersion:{'DeviceVersion':2}}\\r\\n// Test enabled both\\r\\n// AB 10 13 00 99 6A 0A 00 02 11 36 00 08 1B 00 00 0E 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step on HRT off\\r\\n// AB 10 13 00 DD 0C 0B 00 02 11 36 00 08 0B 00 00 0C 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step off HRT on\\r\\n// AB 10 13 00 B5 D0 09 00 02 11 36 00 08 13 00 00 0A 00 00 00 14 00 00 00 03 0A 01\\r\\n// test both off \\r\\n// AB 10 13 00 F1 B6 0C 00 02 11 36 00 08 03 00 00 08 00 00 00 14 00 00 00 03 0A 01 \\r\\n// comando para Contact on ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 4C 2E 03 00 02 11 36 00 08 1B 00 00 4E 00 00 00 14 00 00 00 03 0A 01\\r\\n// comando para contact off ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 C2 8C 04 00 02 11 36 00 08 1B 00 00 46 00 00 00 14 00 00 00 03 0A 01\\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\n// To store the quantity of contacts in the whitelist to enable disable the contact menu\\r\\nvar contactos = params.ApprovedContacts && params.ApprovedContacts.Contact;\\r\\nvar numDuplas = Array.isArray(contactos) ? contactos.length : 0;\\r\\n// configuration command (0X02) , lenght and key\\r\\nvar messageBody = '021136';\\r\\n// step count/heart value display\\r\\n// Watch setting related FACE ID\\r\\nmessageBody += '00'; // Default FACE ID 0 \\r\\n// Future\\r\\n//if (params.WatchFace.SetWatchFace) {\\r\\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \\r\\n//} else {\\r\\n// messageBody += '00'; // Analog Face Default FACE ID 0 \\r\\n//}\\r\\n// Watch Display setting related to Step and heart rate settings\\r\\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '081B0000'; //both displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += (numDuplas > 2) ? 'E' : '6';\\r\\n //messageBody += '6'; //menu 1 and 2 \\r\\n //messageBody += 'E'; //menu 1 and 2 and contact (menu 3) \\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '080B0000'; // step display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '4'; //menu 2 \\r\\n //messageBody += 'C'; // menu 2 and contact (menu 3) \\r\\n messageBody += (numDuplas > 2) ? 'C' : '4';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '08130000'; // heart display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '2'; //menu 1 no contact (menu 3) \\r\\n //messageBody += 'A'; //menu 1 and contact (menu 3) \\r\\n messageBody += (numDuplas > 2) ? 'A' : '2';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '08030000'; // no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '0000000'; // no menu , //08 only contact\\r\\n //messageBody += '8'; // //08 only contact\\r\\n messageBody += (numDuplas > 2) ? '8' : '0';\\r\\n messageBody += '000000'; // other settings\\r\\n} else {\\r\\n messageBody += '08030000'; //no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '0000000'; // no menu..\\r\\n}\\r\\n//menu items for the future\\r\\n/*if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '06000000'; //menu 1 and 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '04000000'; //menu 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '02000000'; //menu 1\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '00000000'; // no menu\\r\\n} else {\\r\\n messageBody += '00000000'; // no menu\\r\\n}*/\\r\\n// from autohome page to the end\\r\\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\\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\\n//AddValueSMS('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":1764100032},{"Type":1,"NewValue":"{\"Id\":5806,\"Name\":\"setWatchSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"// Watch Settings\\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 Watch Settings' Only enable y disable:\\r\\n// params.StepCounting.EnableDisableStepCounting == 'true'\\r\\n// params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true'\\r\\n//var params = {StepCounting:{'EnableDisableStepCounting':'true'},HeartRateMonitor:{'EnableDisableHeartRateMonitor':'true'}, DeviceVersion:{'DeviceVersion':2}}\\r\\n// Test enabled both\\r\\n// AB 10 13 00 99 6A 0A 00 02 11 36 00 08 1B 00 00 0E 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step on HRT off\\r\\n// AB 10 13 00 DD 0C 0B 00 02 11 36 00 08 0B 00 00 0C 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step off HRT on\\r\\n// AB 10 13 00 B5 D0 09 00 02 11 36 00 08 13 00 00 0A 00 00 00 14 00 00 00 03 0A 01\\r\\n// test both off \\r\\n// AB 10 13 00 F1 B6 0C 00 02 11 36 00 08 03 00 00 08 00 00 00 14 00 00 00 03 0A 01 \\r\\n// comando para Contact on ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 4C 2E 03 00 02 11 36 00 08 1B 00 00 4E 00 00 00 14 00 00 00 03 0A 01\\r\\n// comando para contact off ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 C2 8C 04 00 02 11 36 00 08 1B 00 00 46 00 00 00 14 00 00 00 03 0A 01\\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\n// To store the quantity of contacts in the whitelist to enable disable the contact menu\\r\\n//var contactos = params.ApprovedContacts && params.ApprovedContacts.Contact;\\r\\nvar numDuplas = Array.isArray(params.ApprovedContacts) ? params.ApprovedContacts.length : 0;\\r\\n// configuration command (0X02) , lenght and key\\r\\nvar messageBody = '021136';\\r\\n// step count/heart value display\\r\\n// Watch setting related FACE ID\\r\\nmessageBody += '00'; // Default FACE ID 0 \\r\\n// Future\\r\\n//if (params.WatchFace.SetWatchFace) {\\r\\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \\r\\n//} else {\\r\\n// messageBody += '00'; // Analog Face Default FACE ID 0 \\r\\n//}\\r\\n// Watch Display setting related to Step and heart rate settings\\r\\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '081B0000'; //both displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += (numDuplas > 2) ? 'E' : '6';\\r\\n //messageBody += '6'; //menu 1 and 2 \\r\\n //messageBody += 'E'; //menu 1 and 2 and contact (menu 3) \\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '080B0000'; // step display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '4'; //menu 2 \\r\\n //messageBody += 'C'; // menu 2 and contact (menu 3) \\r\\n messageBody += (numDuplas > 2) ? 'C' : '4';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '08130000'; // heart display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '2'; //menu 1 no contact (menu 3) \\r\\n //messageBody += 'A'; //menu 1 and contact (menu 3) \\r\\n messageBody += (numDuplas > 2) ? 'A' : '2';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '08030000'; // no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '0000000'; // no menu , //08 only contact\\r\\n //messageBody += '8'; // //08 only contact\\r\\n messageBody += (numDuplas > 2) ? '8' : '0';\\r\\n messageBody += '000000'; // other settings\\r\\n} else {\\r\\n messageBody += '08030000'; //no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '0000000'; // no menu..\\r\\n}\\r\\n//menu items for the future\\r\\n/*if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '06000000'; //menu 1 and 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '04000000'; //menu 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '02000000'; //menu 1\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '00000000'; // no menu\\r\\n} else {\\r\\n messageBody += '00000000'; // no menu\\r\\n}*/\\r\\n// from autohome page to the end\\r\\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\\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\\n//AddValueSMS('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":1764100744},{"Type":1,"NewValue":"{\"Id\":5806,\"Name\":\"setWatchSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"// Watch Settings\\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 Watch Settings' Only enable y disable:\\r\\n// params.StepCounting.EnableDisableStepCounting == 'true'\\r\\n// params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true'\\r\\n//var params = {StepCounting:{'EnableDisableStepCounting':'true'},HeartRateMonitor:{'EnableDisableHeartRateMonitor':'true'}, DeviceVersion:{'DeviceVersion':2}}\\r\\n// Test enabled both\\r\\n// AB 10 13 00 99 6A 0A 00 02 11 36 00 08 1B 00 00 0E 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step on HRT off\\r\\n// AB 10 13 00 DD 0C 0B 00 02 11 36 00 08 0B 00 00 0C 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step off HRT on\\r\\n// AB 10 13 00 B5 D0 09 00 02 11 36 00 08 13 00 00 0A 00 00 00 14 00 00 00 03 0A 01\\r\\n// test both off \\r\\n// AB 10 13 00 F1 B6 0C 00 02 11 36 00 08 03 00 00 08 00 00 00 14 00 00 00 03 0A 01 \\r\\n// comando para Contact on ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 4C 2E 03 00 02 11 36 00 08 1B 00 00 4E 00 00 00 14 00 00 00 03 0A 01\\r\\n// comando para contact off ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 C2 8C 04 00 02 11 36 00 08 1B 00 00 46 00 00 00 14 00 00 00 03 0A 01\\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\n// To store the quantity of contacts in the whitelist to enable disable the contact menu\\r\\n//var contactos = params.ApprovedContacts && params.ApprovedContacts.Contact;\\r\\nvar numDuplas = Array.isArray(params.ApprovedContacts) ? params.ApprovedContacts.length : 0;\\r\\n// configuration command (0X02) , lenght and key\\r\\nvar messageBody = '021136';\\r\\n// step count/heart value display\\r\\n// Watch setting related FACE ID\\r\\nmessageBody += '00'; // Default FACE ID 0 \\r\\n// Future\\r\\n//if (params.WatchFace.SetWatchFace) {\\r\\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \\r\\n//} else {\\r\\n// messageBody += '00'; // Analog Face Default FACE ID 0 \\r\\n//}\\r\\n// Watch Display setting related to Step and heart rate settings\\r\\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '081B0000'; //both displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += (numDuplas > 0) ? 'E' : '6';\\r\\n //messageBody += '6'; //menu 1 and 2 \\r\\n //messageBody += 'E'; //menu 1 and 2 and contact (menu 3) \\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '080B0000'; // step display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '4'; //menu 2 \\r\\n //messageBody += 'C'; // menu 2 and contact (menu 3) \\r\\n messageBody += (numDuplas > 0) ? 'C' : '4';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '08130000'; // heart display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '2'; //menu 1 no contact (menu 3) \\r\\n //messageBody += 'A'; //menu 1 and contact (menu 3) \\r\\n messageBody += (numDuplas > 0) ? 'A' : '2';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '08030000'; // no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '0000000'; // no menu , //08 only contact\\r\\n //messageBody += '8'; // //08 only contact\\r\\n messageBody += (numDuplas > 0) ? '8' : '0';\\r\\n messageBody += '000000'; // other settings\\r\\n} else {\\r\\n messageBody += '08030000'; //no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '0000000'; // no menu..\\r\\n}\\r\\n//menu items for the future\\r\\n/*if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '06000000'; //menu 1 and 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '04000000'; //menu 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '02000000'; //menu 1\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '00000000'; // no menu\\r\\n} else {\\r\\n messageBody += '00000000'; // no menu\\r\\n}*/\\r\\n// from autohome page to the end\\r\\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\\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\\n//AddValueSMS('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":1764101454},{"Type":1,"NewValue":"{\"Id\":5806,\"Name\":\"setWatchSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"// Watch Settings\\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 Watch Settings' Only enable y disable:\\r\\n// params.StepCounting.EnableDisableStepCounting == 'true'\\r\\n// params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true'\\r\\n//var params = {StepCounting:{'EnableDisableStepCounting':'true'},HeartRateMonitor:{'EnableDisableHeartRateMonitor':'true'}, DeviceVersion:{'DeviceVersion':2}}\\r\\n// Test enabled both\\r\\n// AB 10 13 00 99 6A 0A 00 02 11 36 00 08 1B 00 00 0E 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step on HRT off\\r\\n// AB 10 13 00 DD 0C 0B 00 02 11 36 00 08 0B 00 00 0C 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step off HRT on\\r\\n// AB 10 13 00 B5 D0 09 00 02 11 36 00 08 13 00 00 0A 00 00 00 14 00 00 00 03 0A 01\\r\\n// test both off \\r\\n// AB 10 13 00 F1 B6 0C 00 02 11 36 00 08 03 00 00 08 00 00 00 14 00 00 00 03 0A 01 \\r\\n// comando para Contact on ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 4C 2E 03 00 02 11 36 00 08 1B 00 00 4E 00 00 00 14 00 00 00 03 0A 01\\r\\n// comando para contact off ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 C2 8C 04 00 02 11 36 00 08 1B 00 00 46 00 00 00 14 00 00 00 03 0A 01\\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\nvar idsToUpdate = [];\\r\\n// To store the quantity of contacts in the whitelist to enable disable the contact menu\\r\\n//var contactos = params.ApprovedContacts && params.ApprovedContacts.Contact;\\r\\nvar numDuplas = Array.isArray(params.ApprovedContacts) ? params.ApprovedContacts.length : 0;\\r\\n// configuration command (0X02) , lenght and key\\r\\nvar messageBody = '021136';\\r\\n// step count/heart value display\\r\\n// Watch setting related FACE ID\\r\\nmessageBody += '00'; // Default FACE ID 0 \\r\\n// Future\\r\\n//if (params.WatchFace.SetWatchFace) {\\r\\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \\r\\n//} else {\\r\\n// messageBody += '00'; // Analog Face Default FACE ID 0 \\r\\n//}\\r\\n// Watch Display setting related to Step and heart rate settings\\r\\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '081B0000'; //both displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += (numDuplas > 0) ? 'E' : '6';\\r\\n //messageBody += '6'; //menu 1 and 2 \\r\\n //messageBody += 'E'; //menu 1 and 2 and contact (menu 3) \\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '080B0000'; // step display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '4'; //menu 2 \\r\\n //messageBody += 'C'; // menu 2 and contact (menu 3) \\r\\n messageBody += (numDuplas > 0) ? 'C' : '4';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '08130000'; // heart display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '2'; //menu 1 no contact (menu 3) \\r\\n //messageBody += 'A'; //menu 1 and contact (menu 3) \\r\\n messageBody += (numDuplas > 0) ? 'A' : '2';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '08030000'; // no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '0000000'; // no menu , //08 only contact\\r\\n //messageBody += '8'; // //08 only contact\\r\\n messageBody += (numDuplas > 0) ? '8' : '0';\\r\\n messageBody += '000000'; // other settings\\r\\n} else {\\r\\n messageBody += '08030000'; //no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '0000000'; // no menu..\\r\\n}\\r\\n//menu items for the future\\r\\n/*if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '06000000'; //menu 1 and 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '04000000'; //menu 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '02000000'; //menu 1\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '00000000'; // no menu\\r\\n} else {\\r\\n messageBody += '00000000'; // no menu\\r\\n}*/\\r\\n// from autohome page to the end\\r\\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\\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\\n//AddValueSMS('dataSMS', dataSMS);\\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// 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":1764837636},{"Type":1,"NewValue":"{\"Id\":5806,\"Name\":\"setWatchSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"// Watch Settings\\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 Watch Settings' Only enable y disable:\\r\\n// params.StepCounting.EnableDisableStepCounting == 'true'\\r\\n// params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true'\\r\\n//var params = {StepCounting:{'EnableDisableStepCounting':'true'},HeartRateMonitor:{'EnableDisableHeartRateMonitor':'true'}, DeviceVersion:{'DeviceVersion':2}}\\r\\n// Test enabled both\\r\\n// AB 10 13 00 99 6A 0A 00 02 11 36 00 08 1B 00 00 0E 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step on HRT off\\r\\n// AB 10 13 00 DD 0C 0B 00 02 11 36 00 08 0B 00 00 0C 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step off HRT on\\r\\n// AB 10 13 00 B5 D0 09 00 02 11 36 00 08 13 00 00 0A 00 00 00 14 00 00 00 03 0A 01\\r\\n// test both off \\r\\n// AB 10 13 00 F1 B6 0C 00 02 11 36 00 08 03 00 00 08 00 00 00 14 00 00 00 03 0A 01 \\r\\n// comando para Contact on ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 4C 2E 03 00 02 11 36 00 08 1B 00 00 4E 00 00 00 14 00 00 00 03 0A 01\\r\\n// comando para contact off ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 C2 8C 04 00 02 11 36 00 08 1B 00 00 46 00 00 00 14 00 00 00 03 0A 01\\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\nvar idsToUpdate = [];\\r\\nvar notSend = false;\\r\\n// To store the quantity of contacts in the whitelist to enable disable the contact menu\\r\\n//var contactos = params.ApprovedContacts && params.ApprovedContacts.Contact;\\r\\nvar numDuplas = Array.isArray(params.ApprovedContacts) ? params.ApprovedContacts.length : 0;\\r\\n// configuration command (0X02) , lenght and key\\r\\nvar messageBody = '021136';\\r\\n// step count/heart value display\\r\\n// Watch setting related FACE ID\\r\\nmessageBody += '00'; // Default FACE ID 0 \\r\\n// Future\\r\\n//if (params.WatchFace.SetWatchFace) {\\r\\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \\r\\n//} else {\\r\\n// messageBody += '00'; // Analog Face Default FACE ID 0 \\r\\n//}\\r\\n// Watch Display setting related to Step and heart rate settings\\r\\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '081B0000'; //both displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += (numDuplas > 0) ? 'E' : '6';\\r\\n //messageBody += '6'; //menu 1 and 2 \\r\\n //messageBody += 'E'; //menu 1 and 2 and contact (menu 3) \\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '080B0000'; // step display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '4'; //menu 2 \\r\\n //messageBody += 'C'; // menu 2 and contact (menu 3) \\r\\n messageBody += (numDuplas > 0) ? 'C' : '4';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '08130000'; // heart display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '2'; //menu 1 no contact (menu 3) \\r\\n //messageBody += 'A'; //menu 1 and contact (menu 3) \\r\\n messageBody += (numDuplas > 0) ? 'A' : '2';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '08030000'; // no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '0000000'; // no menu , //08 only contact\\r\\n //messageBody += '8'; // //08 only contact\\r\\n messageBody += (numDuplas > 0) ? '8' : '0';\\r\\n messageBody += '000000'; // other settings\\r\\n} else {\\r\\n messageBody += '08030000'; //no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '0000000'; // no menu..\\r\\n}\\r\\n//menu items for the future\\r\\n/*if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '06000000'; //menu 1 and 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '04000000'; //menu 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '02000000'; //menu 1\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '00000000'; // no menu\\r\\n} else {\\r\\n messageBody += '00000000'; // no menu\\r\\n}*/\\r\\n// from autohome page to the end\\r\\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\\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\\n//AddValueSMS('dataSMS', dataSMS);\\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// 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":1764837717},{"Type":1,"NewValue":"{\"Id\":5806,\"Name\":\"setWatchSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"// Watch Settings\\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 Watch Settings' Only enable y disable:\\r\\n// params.StepCounting.EnableDisableStepCounting == 'true'\\r\\n// params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true'\\r\\n//var params = {StepCounting:{'EnableDisableStepCounting':'true'},HeartRateMonitor:{'EnableDisableHeartRateMonitor':'true'}, DeviceVersion:{'DeviceVersion':2}}\\r\\n// Test enabled both\\r\\n// AB 10 13 00 99 6A 0A 00 02 11 36 00 08 1B 00 00 0E 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step on HRT off\\r\\n// AB 10 13 00 DD 0C 0B 00 02 11 36 00 08 0B 00 00 0C 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step off HRT on\\r\\n// AB 10 13 00 B5 D0 09 00 02 11 36 00 08 13 00 00 0A 00 00 00 14 00 00 00 03 0A 01\\r\\n// test both off \\r\\n// AB 10 13 00 F1 B6 0C 00 02 11 36 00 08 03 00 00 08 00 00 00 14 00 00 00 03 0A 01 \\r\\n// comando para Contact on ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 4C 2E 03 00 02 11 36 00 08 1B 00 00 4E 00 00 00 14 00 00 00 03 0A 01\\r\\n// comando para contact off ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 C2 8C 04 00 02 11 36 00 08 1B 00 00 46 00 00 00 14 00 00 00 03 0A 01\\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\nvar idsToUpdate = [];\\r\\nvar notSend = false;\\r\\n// To store the quantity of contacts in the whitelist to enable disable the contact menu\\r\\n//var contactos = params.ApprovedContacts && params.ApprovedContacts.Contact;\\r\\nvar numDuplas = Array.isArray(params.ApprovedContacts) ? params.ApprovedContacts.length : 0;\\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// configuration command (0X02) , lenght and key\\r\\nvar messageBody = '021136';\\r\\n// step count/heart value display\\r\\n// Watch setting related FACE ID\\r\\nmessageBody += '00'; // Default FACE ID 0 \\r\\n// Future\\r\\n//if (params.WatchFace.SetWatchFace) {\\r\\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \\r\\n//} else {\\r\\n// messageBody += '00'; // Analog Face Default FACE ID 0 \\r\\n//}\\r\\n// Watch Display setting related to Step and heart rate settings\\r\\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '081B0000'; //both displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += (numDuplas > 0) ? 'E' : '6';\\r\\n //messageBody += '6'; //menu 1 and 2 \\r\\n //messageBody += 'E'; //menu 1 and 2 and contact (menu 3) \\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '080B0000'; // step display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '4'; //menu 2 \\r\\n //messageBody += 'C'; // menu 2 and contact (menu 3) \\r\\n messageBody += (numDuplas > 0) ? 'C' : '4';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '08130000'; // heart display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '2'; //menu 1 no contact (menu 3) \\r\\n //messageBody += 'A'; //menu 1 and contact (menu 3) \\r\\n messageBody += (numDuplas > 0) ? 'A' : '2';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '08030000'; // no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '0000000'; // no menu , //08 only contact\\r\\n //messageBody += '8'; // //08 only contact\\r\\n messageBody += (numDuplas > 0) ? '8' : '0';\\r\\n messageBody += '000000'; // other settings\\r\\n} else {\\r\\n messageBody += '08030000'; //no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '0000000'; // no menu..\\r\\n}\\r\\n//menu items for the future\\r\\n/*if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '06000000'; //menu 1 and 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '04000000'; //menu 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '02000000'; //menu 1\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '00000000'; // no menu\\r\\n} else {\\r\\n messageBody += '00000000'; // no menu\\r\\n}*/\\r\\n// from autohome page to the end\\r\\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\\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\\n//AddValueSMS('dataSMS', dataSMS);\\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// 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":1764838121},{"Type":1,"NewValue":"{\"Id\":5806,\"Name\":\"setWatchSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"// Watch Settings\\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 Watch Settings' Only enable y disable:\\r\\n// params.StepCounting.EnableDisableStepCounting == 'true'\\r\\n// params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true'\\r\\n//var params = {StepCounting:{'EnableDisableStepCounting':'true'},HeartRateMonitor:{'EnableDisableHeartRateMonitor':'true'}, DeviceVersion:{'DeviceVersion':2}}\\r\\n// Test enabled both\\r\\n// AB 10 13 00 99 6A 0A 00 02 11 36 00 08 1B 00 00 0E 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step on HRT off\\r\\n// AB 10 13 00 DD 0C 0B 00 02 11 36 00 08 0B 00 00 0C 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step off HRT on\\r\\n// AB 10 13 00 B5 D0 09 00 02 11 36 00 08 13 00 00 0A 00 00 00 14 00 00 00 03 0A 01\\r\\n// test both off \\r\\n// AB 10 13 00 F1 B6 0C 00 02 11 36 00 08 03 00 00 08 00 00 00 14 00 00 00 03 0A 01 \\r\\n// comando para Contact on ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 4C 2E 03 00 02 11 36 00 08 1B 00 00 4E 00 00 00 14 00 00 00 03 0A 01\\r\\n// comando para contact off ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 C2 8C 04 00 02 11 36 00 08 1B 00 00 46 00 00 00 14 00 00 00 03 0A 01\\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\n// To store the quantity of contacts in the whitelist to enable disable the contact menu\\r\\n//var contactos = params.ApprovedContacts && params.ApprovedContacts.Contact;\\r\\nvar numDuplas = Array.isArray(params.ApprovedContacts) ? params.ApprovedContacts.length : 0;\\r\\n// configuration command (0X02) , lenght and key\\r\\nvar messageBody = '021136';\\r\\n// step count/heart value display\\r\\n// Watch setting related FACE ID\\r\\nmessageBody += '00'; // Default FACE ID 0 \\r\\n// Future\\r\\n//if (params.WatchFace.SetWatchFace) {\\r\\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \\r\\n//} else {\\r\\n// messageBody += '00'; // Analog Face Default FACE ID 0 \\r\\n//}\\r\\n// Watch Display setting related to Step and heart rate settings\\r\\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '081B0000'; //both displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += (numDuplas > 0) ? 'E' : '6';\\r\\n //messageBody += '6'; //menu 1 and 2 \\r\\n //messageBody += 'E'; //menu 1 and 2 and contact (menu 3) \\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '080B0000'; // step display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '4'; //menu 2 \\r\\n //messageBody += 'C'; // menu 2 and contact (menu 3) \\r\\n messageBody += (numDuplas > 0) ? 'C' : '4';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '08130000'; // heart display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '2'; //menu 1 no contact (menu 3) \\r\\n //messageBody += 'A'; //menu 1 and contact (menu 3) \\r\\n messageBody += (numDuplas > 0) ? 'A' : '2';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '08030000'; // no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '0000000'; // no menu , //08 only contact\\r\\n //messageBody += '8'; // //08 only contact\\r\\n messageBody += (numDuplas > 0) ? '8' : '0';\\r\\n messageBody += '000000'; // other settings\\r\\n} else {\\r\\n messageBody += '08030000'; //no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '0000000'; // no menu..\\r\\n}\\r\\n//menu items for the future\\r\\n/*if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '06000000'; //menu 1 and 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '04000000'; //menu 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '02000000'; //menu 1\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '00000000'; // no menu\\r\\n} else {\\r\\n messageBody += '00000000'; // no menu\\r\\n}*/\\r\\n// from autohome page to the end\\r\\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\\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\\n//AddValueSMS('dataSMS', dataSMS);\\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// 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":1764838305},{"Type":1,"NewValue":"{\"Id\":5806,\"Name\":\"setWatchSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"// Watch Settings\\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 Watch Settings' Only enable y disable:\\r\\n// params.StepCounting.EnableDisableStepCounting == 'true'\\r\\n// params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true'\\r\\n//var params = {StepCounting:{'EnableDisableStepCounting':'true'},HeartRateMonitor:{'EnableDisableHeartRateMonitor':'true'}, DeviceVersion:{'DeviceVersion':2}}\\r\\n// Test enabled both\\r\\n// AB 10 13 00 99 6A 0A 00 02 11 36 00 08 1B 00 00 0E 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step on HRT off\\r\\n// AB 10 13 00 DD 0C 0B 00 02 11 36 00 08 0B 00 00 0C 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step off HRT on\\r\\n// AB 10 13 00 B5 D0 09 00 02 11 36 00 08 13 00 00 0A 00 00 00 14 00 00 00 03 0A 01\\r\\n// test both off \\r\\n// AB 10 13 00 F1 B6 0C 00 02 11 36 00 08 03 00 00 08 00 00 00 14 00 00 00 03 0A 01 \\r\\n// comando para Contact on ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 4C 2E 03 00 02 11 36 00 08 1B 00 00 4E 00 00 00 14 00 00 00 03 0A 01\\r\\n// comando para contact off ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 C2 8C 04 00 02 11 36 00 08 1B 00 00 46 00 00 00 14 00 00 00 03 0A 01\\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\n// To store the quantity of contacts in the whitelist to enable disable the contact menu\\r\\n//var contactos = params.ApprovedContacts && params.ApprovedContacts.Contact;\\r\\n//var numDuplas = Array.isArray(params.ApprovedContacts) ? params.ApprovedContacts.length : 0;\\r\\nvar numDuplas = params.ApprovedContacts.length;\\r\\n// configuration command (0X02) , lenght and key\\r\\nvar messageBody = '021136';\\r\\n// step count/heart value display\\r\\n// Watch setting related FACE ID\\r\\nmessageBody += '00'; // Default FACE ID 0 \\r\\n// Future\\r\\n//if (params.WatchFace.SetWatchFace) {\\r\\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \\r\\n//} else {\\r\\n// messageBody += '00'; // Analog Face Default FACE ID 0 \\r\\n//}\\r\\n// Watch Display setting related to Step and heart rate settings\\r\\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '081B0000'; //both displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += (numDuplas > 0) ? 'E' : '6';\\r\\n //messageBody += '6'; //menu 1 and 2 \\r\\n //messageBody += 'E'; //menu 1 and 2 and contact (menu 3) \\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '080B0000'; // step display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '4'; //menu 2 \\r\\n //messageBody += 'C'; // menu 2 and contact (menu 3) \\r\\n messageBody += (numDuplas > 0) ? 'C' : '4';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '08130000'; // heart display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '2'; //menu 1 no contact (menu 3) \\r\\n //messageBody += 'A'; //menu 1 and contact (menu 3) \\r\\n messageBody += (numDuplas > 0) ? 'A' : '2';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '08030000'; // no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '0000000'; // no menu , //08 only contact\\r\\n //messageBody += '8'; // //08 only contact\\r\\n messageBody += (numDuplas > 0) ? '8' : '0';\\r\\n messageBody += '000000'; // other settings\\r\\n} else {\\r\\n messageBody += '08030000'; //no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '0000000'; // no menu..\\r\\n}\\r\\n//menu items for the future\\r\\n/*if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '06000000'; //menu 1 and 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '04000000'; //menu 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '02000000'; //menu 1\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '00000000'; // no menu\\r\\n} else {\\r\\n messageBody += '00000000'; // no menu\\r\\n}*/\\r\\n// from autohome page to the end\\r\\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\\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\\n//AddValueSMS('dataSMS', dataSMS);\\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// 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":1764839274},{"Type":1,"NewValue":"{\"Id\":5806,\"Name\":\"setWatchSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"// Watch Settings\\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 Watch Settings' Only enable y disable:\\r\\n// params.StepCounting.EnableDisableStepCounting == 'true'\\r\\n// params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true'\\r\\n//var params = {StepCounting:{'EnableDisableStepCounting':'true'},HeartRateMonitor:{'EnableDisableHeartRateMonitor':'true'}, DeviceVersion:{'DeviceVersion':2}}\\r\\n// Test enabled both\\r\\n// AB 10 13 00 99 6A 0A 00 02 11 36 00 08 1B 00 00 0E 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step on HRT off\\r\\n// AB 10 13 00 DD 0C 0B 00 02 11 36 00 08 0B 00 00 0C 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step off HRT on\\r\\n// AB 10 13 00 B5 D0 09 00 02 11 36 00 08 13 00 00 0A 00 00 00 14 00 00 00 03 0A 01\\r\\n// test both off \\r\\n// AB 10 13 00 F1 B6 0C 00 02 11 36 00 08 03 00 00 08 00 00 00 14 00 00 00 03 0A 01 \\r\\n// comando para Contact on ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 4C 2E 03 00 02 11 36 00 08 1B 00 00 4E 00 00 00 14 00 00 00 03 0A 01\\r\\n// comando para contact off ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 C2 8C 04 00 02 11 36 00 08 1B 00 00 46 00 00 00 14 00 00 00 03 0A 01\\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\n// To store the quantity of contacts in the whitelist to enable disable the contact menu\\r\\n//var contactos = params.ApprovedContacts && params.ApprovedContacts.Contact;\\r\\n//var numDuplas = Array.isArray(params.ApprovedContacts) ? params.ApprovedContacts.length : 0;\\r\\nvar numDuplas = params.ApprovedContacts.Contact.length;\\r\\n// configuration command (0X02) , lenght and key\\r\\nvar messageBody = '021136';\\r\\n// step count/heart value display\\r\\n// Watch setting related FACE ID\\r\\nmessageBody += '00'; // Default FACE ID 0 \\r\\n// Future\\r\\n//if (params.WatchFace.SetWatchFace) {\\r\\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \\r\\n//} else {\\r\\n// messageBody += '00'; // Analog Face Default FACE ID 0 \\r\\n//}\\r\\n// Watch Display setting related to Step and heart rate settings\\r\\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '081B0000'; //both displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += (numDuplas > 0) ? 'E' : '6';\\r\\n //messageBody += '6'; //menu 1 and 2 \\r\\n //messageBody += 'E'; //menu 1 and 2 and contact (menu 3) \\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '080B0000'; // step display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '4'; //menu 2 \\r\\n //messageBody += 'C'; // menu 2 and contact (menu 3) \\r\\n messageBody += (numDuplas > 0) ? 'C' : '4';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '08130000'; // heart display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '2'; //menu 1 no contact (menu 3) \\r\\n //messageBody += 'A'; //menu 1 and contact (menu 3) \\r\\n messageBody += (numDuplas > 0) ? 'A' : '2';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '08030000'; // no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '0000000'; // no menu , //08 only contact\\r\\n //messageBody += '8'; // //08 only contact\\r\\n messageBody += (numDuplas > 0) ? '8' : '0';\\r\\n messageBody += '000000'; // other settings\\r\\n} else {\\r\\n messageBody += '08030000'; //no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '0000000'; // no menu..\\r\\n}\\r\\n//menu items for the future\\r\\n/*if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '06000000'; //menu 1 and 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '04000000'; //menu 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '02000000'; //menu 1\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '00000000'; // no menu\\r\\n} else {\\r\\n messageBody += '00000000'; // no menu\\r\\n}*/\\r\\n// from autohome page to the end\\r\\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\\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\\n//AddValueSMS('dataSMS', dataSMS);\\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// 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":1764840000},{"Type":1,"NewValue":"{\"Id\":5806,\"Name\":\"setWatchSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"// Watch Settings\\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 Watch Settings' Only enable y disable:\\r\\n// params.StepCounting.EnableDisableStepCounting == 'true'\\r\\n// params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true'\\r\\n//var params = {StepCounting:{'EnableDisableStepCounting':'true'},HeartRateMonitor:{'EnableDisableHeartRateMonitor':'true'}, DeviceVersion:{'DeviceVersion':2}}\\r\\n// Test enabled both\\r\\n// AB 10 13 00 99 6A 0A 00 02 11 36 00 08 1B 00 00 0E 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step on HRT off\\r\\n// AB 10 13 00 DD 0C 0B 00 02 11 36 00 08 0B 00 00 0C 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step off HRT on\\r\\n// AB 10 13 00 B5 D0 09 00 02 11 36 00 08 13 00 00 0A 00 00 00 14 00 00 00 03 0A 01\\r\\n// test both off \\r\\n// AB 10 13 00 F1 B6 0C 00 02 11 36 00 08 03 00 00 08 00 00 00 14 00 00 00 03 0A 01 \\r\\n// comando para Contact on ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 4C 2E 03 00 02 11 36 00 08 1B 00 00 4E 00 00 00 14 00 00 00 03 0A 01\\r\\n// comando para contact off ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 C2 8C 04 00 02 11 36 00 08 1B 00 00 46 00 00 00 14 00 00 00 03 0A 01\\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\n// To store the quantity of contacts in the whitelist to enable disable the contact menu\\r\\n//var contactos = params.ApprovedContacts && params.ApprovedContacts.Contact;\\r\\n//var numDuplas = Array.isArray(params.ApprovedContacts) ? params.ApprovedContacts.length : 0;\\r\\nvar numDuplas = paramsChanged.ApprovedContacts.lenght;\\r\\n// configuration command (0X02) , lenght and key\\r\\nvar messageBody = '021136';\\r\\n// step count/heart value display\\r\\n// Watch setting related FACE ID\\r\\nmessageBody += '00'; // Default FACE ID 0 \\r\\n// Future\\r\\n//if (params.WatchFace.SetWatchFace) {\\r\\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \\r\\n//} else {\\r\\n// messageBody += '00'; // Analog Face Default FACE ID 0 \\r\\n//}\\r\\n// Watch Display setting related to Step and heart rate settings\\r\\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '081B0000'; //both displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += (numDuplas > 0) ? 'E' : '6';\\r\\n //messageBody += '6'; //menu 1 and 2 \\r\\n //messageBody += 'E'; //menu 1 and 2 and contact (menu 3) \\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '080B0000'; // step display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '4'; //menu 2 \\r\\n //messageBody += 'C'; // menu 2 and contact (menu 3) \\r\\n messageBody += (numDuplas > 0) ? 'C' : '4';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '08130000'; // heart display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '2'; //menu 1 no contact (menu 3) \\r\\n //messageBody += 'A'; //menu 1 and contact (menu 3) \\r\\n messageBody += (numDuplas > 0) ? 'A' : '2';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '08030000'; // no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '0000000'; // no menu , //08 only contact\\r\\n //messageBody += '8'; // //08 only contact\\r\\n messageBody += (numDuplas > 0) ? '8' : '0';\\r\\n messageBody += '000000'; // other settings\\r\\n} else {\\r\\n messageBody += '08030000'; //no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '0000000'; // no menu..\\r\\n}\\r\\n//menu items for the future\\r\\n/*if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '06000000'; //menu 1 and 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '04000000'; //menu 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '02000000'; //menu 1\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '00000000'; // no menu\\r\\n} else {\\r\\n messageBody += '00000000'; // no menu\\r\\n}*/\\r\\n// from autohome page to the end\\r\\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\\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\\n//AddValueSMS('dataSMS', dataSMS);\\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// 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":1764840561},{"Type":1,"NewValue":"{\"Id\":5806,\"Name\":\"setWatchSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"// Watch Settings\\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 Watch Settings' Only enable y disable:\\r\\n// params.StepCounting.EnableDisableStepCounting == 'true'\\r\\n// params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true'\\r\\n//var params = {StepCounting:{'EnableDisableStepCounting':'true'},HeartRateMonitor:{'EnableDisableHeartRateMonitor':'true'}, DeviceVersion:{'DeviceVersion':2}}\\r\\n// Test enabled both\\r\\n// AB 10 13 00 99 6A 0A 00 02 11 36 00 08 1B 00 00 0E 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step on HRT off\\r\\n// AB 10 13 00 DD 0C 0B 00 02 11 36 00 08 0B 00 00 0C 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step off HRT on\\r\\n// AB 10 13 00 B5 D0 09 00 02 11 36 00 08 13 00 00 0A 00 00 00 14 00 00 00 03 0A 01\\r\\n// test both off \\r\\n// AB 10 13 00 F1 B6 0C 00 02 11 36 00 08 03 00 00 08 00 00 00 14 00 00 00 03 0A 01 \\r\\n// comando para Contact on ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 4C 2E 03 00 02 11 36 00 08 1B 00 00 4E 00 00 00 14 00 00 00 03 0A 01\\r\\n// comando para contact off ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 C2 8C 04 00 02 11 36 00 08 1B 00 00 46 00 00 00 14 00 00 00 03 0A 01\\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\n// To store the quantity of contacts in the whitelist to enable disable the contact menu\\r\\n//var contactos = params.ApprovedContacts && params.ApprovedContacts.Contact;\\r\\n//var numDuplas = Array.isArray(params.ApprovedContacts) ? params.ApprovedContacts.length : 0;\\r\\nvar numDuplas = params.ApprovedContacts[0].Contact.length;\\r\\n// configuration command (0X02) , lenght and key\\r\\nvar messageBody = '021136';\\r\\n// step count/heart value display\\r\\n// Watch setting related FACE ID\\r\\nmessageBody += '00'; // Default FACE ID 0 \\r\\n// Future\\r\\n//if (params.WatchFace.SetWatchFace) {\\r\\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \\r\\n//} else {\\r\\n// messageBody += '00'; // Analog Face Default FACE ID 0 \\r\\n//}\\r\\n// Watch Display setting related to Step and heart rate settings\\r\\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '081B0000'; //both displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += (numDuplas > 0) ? 'E' : '6';\\r\\n //messageBody += '6'; //menu 1 and 2 \\r\\n //messageBody += 'E'; //menu 1 and 2 and contact (menu 3) \\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '080B0000'; // step display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '4'; //menu 2 \\r\\n //messageBody += 'C'; // menu 2 and contact (menu 3) \\r\\n messageBody += (numDuplas > 0) ? 'C' : '4';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '08130000'; // heart display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '2'; //menu 1 no contact (menu 3) \\r\\n //messageBody += 'A'; //menu 1 and contact (menu 3) \\r\\n messageBody += (numDuplas > 0) ? 'A' : '2';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '08030000'; // no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '0000000'; // no menu , //08 only contact\\r\\n //messageBody += '8'; // //08 only contact\\r\\n messageBody += (numDuplas > 0) ? '8' : '0';\\r\\n messageBody += '000000'; // other settings\\r\\n} else {\\r\\n messageBody += '08030000'; //no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '0000000'; // no menu..\\r\\n}\\r\\n//menu items for the future\\r\\n/*if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '06000000'; //menu 1 and 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '04000000'; //menu 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '02000000'; //menu 1\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '00000000'; // no menu\\r\\n} else {\\r\\n messageBody += '00000000'; // no menu\\r\\n}*/\\r\\n// from autohome page to the end\\r\\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\\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\\n//AddValueSMS('dataSMS', dataSMS);\\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// 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":1764840793},{"Type":1,"NewValue":"{\"Id\":5806,\"Name\":\"setWatchSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"// Watch Settings\\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 Watch Settings' Only enable y disable:\\r\\n// params.StepCounting.EnableDisableStepCounting == 'true'\\r\\n// params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true'\\r\\n//var params = {StepCounting:{'EnableDisableStepCounting':'true'},HeartRateMonitor:{'EnableDisableHeartRateMonitor':'true'}, DeviceVersion:{'DeviceVersion':2}}\\r\\n// Test enabled both\\r\\n// AB 10 13 00 99 6A 0A 00 02 11 36 00 08 1B 00 00 0E 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step on HRT off\\r\\n// AB 10 13 00 DD 0C 0B 00 02 11 36 00 08 0B 00 00 0C 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step off HRT on\\r\\n// AB 10 13 00 B5 D0 09 00 02 11 36 00 08 13 00 00 0A 00 00 00 14 00 00 00 03 0A 01\\r\\n// test both off \\r\\n// AB 10 13 00 F1 B6 0C 00 02 11 36 00 08 03 00 00 08 00 00 00 14 00 00 00 03 0A 01 \\r\\n// comando para Contact on ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 4C 2E 03 00 02 11 36 00 08 1B 00 00 4E 00 00 00 14 00 00 00 03 0A 01\\r\\n// comando para contact off ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 C2 8C 04 00 02 11 36 00 08 1B 00 00 46 00 00 00 14 00 00 00 03 0A 01\\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\n// To store the quantity of contacts in the whitelist to enable disable the contact menu\\r\\n//var contactos = params.ApprovedContacts && params.ApprovedContacts.Contact;\\r\\n//var numDuplas = Array.isArray(params.ApprovedContacts) ? params.ApprovedContacts.length : 0;\\r\\nvar numDuplas = params.ApprovedContacts;\\r\\n// configuration command (0X02) , lenght and key\\r\\nvar messageBody = '021136';\\r\\n// step count/heart value display\\r\\n// Watch setting related FACE ID\\r\\nmessageBody += '00'; // Default FACE ID 0 \\r\\n// Future\\r\\n//if (params.WatchFace.SetWatchFace) {\\r\\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \\r\\n//} else {\\r\\n// messageBody += '00'; // Analog Face Default FACE ID 0 \\r\\n//}\\r\\n// Watch Display setting related to Step and heart rate settings\\r\\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '081B0000'; //both displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += (numDuplas > 0) ? 'E' : '6';\\r\\n //messageBody += '6'; //menu 1 and 2 \\r\\n //messageBody += 'E'; //menu 1 and 2 and contact (menu 3) \\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '080B0000'; // step display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '4'; //menu 2 \\r\\n //messageBody += 'C'; // menu 2 and contact (menu 3) \\r\\n messageBody += (numDuplas > 0) ? 'C' : '4';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '08130000'; // heart display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '2'; //menu 1 no contact (menu 3) \\r\\n //messageBody += 'A'; //menu 1 and contact (menu 3) \\r\\n messageBody += (numDuplas > 0) ? 'A' : '2';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '08030000'; // no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '0000000'; // no menu , //08 only contact\\r\\n //messageBody += '8'; // //08 only contact\\r\\n messageBody += (numDuplas > 0) ? '8' : '0';\\r\\n messageBody += '000000'; // other settings\\r\\n} else {\\r\\n messageBody += '08030000'; //no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '0000000'; // no menu..\\r\\n}\\r\\n//menu items for the future\\r\\n/*if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '06000000'; //menu 1 and 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '04000000'; //menu 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '02000000'; //menu 1\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '00000000'; // no menu\\r\\n} else {\\r\\n messageBody += '00000000'; // no menu\\r\\n}*/\\r\\n// from autohome page to the end\\r\\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\\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\\n//AddValueSMS('dataSMS', dataSMS);\\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// 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":1764841065},{"Type":1,"NewValue":"{\"Id\":5806,\"Name\":\"setWatchSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"// Watch Settings\\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 Watch Settings' Only enable y disable:\\r\\n// params.StepCounting.EnableDisableStepCounting == 'true'\\r\\n// params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true'\\r\\n//var params = {StepCounting:{'EnableDisableStepCounting':'true'},HeartRateMonitor:{'EnableDisableHeartRateMonitor':'true'}, DeviceVersion:{'DeviceVersion':2}}\\r\\n// Test enabled both\\r\\n// AB 10 13 00 99 6A 0A 00 02 11 36 00 08 1B 00 00 0E 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step on HRT off\\r\\n// AB 10 13 00 DD 0C 0B 00 02 11 36 00 08 0B 00 00 0C 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step off HRT on\\r\\n// AB 10 13 00 B5 D0 09 00 02 11 36 00 08 13 00 00 0A 00 00 00 14 00 00 00 03 0A 01\\r\\n// test both off \\r\\n// AB 10 13 00 F1 B6 0C 00 02 11 36 00 08 03 00 00 08 00 00 00 14 00 00 00 03 0A 01 \\r\\n// comando para Contact on ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 4C 2E 03 00 02 11 36 00 08 1B 00 00 4E 00 00 00 14 00 00 00 03 0A 01\\r\\n// comando para contact off ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 C2 8C 04 00 02 11 36 00 08 1B 00 00 46 00 00 00 14 00 00 00 03 0A 01\\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\n// To store the quantity of contacts in the whitelist to enable disable the contact menu\\r\\n//var contactos = params.ApprovedContacts && params.ApprovedContacts.Contact;\\r\\n//var numDuplas = Array.isArray(params.ApprovedContacts) ? params.ApprovedContacts.length : 0;\\r\\n//var numDuplas = params.ApprovedContacts;\\r\\nlet numDuplas = 0;\\r\\nfor (const key in params.ApprovedContacts) {\\r\\n if (params.ApprovedContacts[key] && params.ApprovedContacts[key].Contact && params.ApprovedContacts[key].Contact !== \\\"\\\") {\\r\\n numDuplas++;\\r\\n }\\r\\n}\\r\\n// configuration command (0X02) , lenght and key\\r\\nvar messageBody = '021136';\\r\\n// step count/heart value display\\r\\n// Watch setting related FACE ID\\r\\nmessageBody += '00'; // Default FACE ID 0 \\r\\n// Future\\r\\n//if (params.WatchFace.SetWatchFace) {\\r\\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \\r\\n//} else {\\r\\n// messageBody += '00'; // Analog Face Default FACE ID 0 \\r\\n//}\\r\\n// Watch Display setting related to Step and heart rate settings\\r\\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '081B0000'; //both displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += (numDuplas > 0) ? 'E' : '6';\\r\\n //messageBody += '6'; //menu 1 and 2 \\r\\n //messageBody += 'E'; //menu 1 and 2 and contact (menu 3) \\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '080B0000'; // step display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '4'; //menu 2 \\r\\n //messageBody += 'C'; // menu 2 and contact (menu 3) \\r\\n messageBody += (numDuplas > 0) ? 'C' : '4';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '08130000'; // heart display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '2'; //menu 1 no contact (menu 3) \\r\\n //messageBody += 'A'; //menu 1 and contact (menu 3) \\r\\n messageBody += (numDuplas > 0) ? 'A' : '2';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '08030000'; // no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '0000000'; // no menu , //08 only contact\\r\\n //messageBody += '8'; // //08 only contact\\r\\n messageBody += (numDuplas > 0) ? '8' : '0';\\r\\n messageBody += '000000'; // other settings\\r\\n} else {\\r\\n messageBody += '08030000'; //no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '0000000'; // no menu..\\r\\n}\\r\\n//menu items for the future\\r\\n/*if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '06000000'; //menu 1 and 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '04000000'; //menu 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '02000000'; //menu 1\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '00000000'; // no menu\\r\\n} else {\\r\\n messageBody += '00000000'; // no menu\\r\\n}*/\\r\\n// from autohome page to the end\\r\\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\\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\\n//AddValueSMS('dataSMS', dataSMS);\\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// 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":1764842271},{"Type":1,"NewValue":"{\"Id\":5806,\"Name\":\"setWatchSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"// Watch Settings\\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 Watch Settings' Only enable y disable:\\r\\n// params.StepCounting.EnableDisableStepCounting == 'true'\\r\\n// params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true'\\r\\n//var params = {StepCounting:{'EnableDisableStepCounting':'true'},HeartRateMonitor:{'EnableDisableHeartRateMonitor':'true'}, DeviceVersion:{'DeviceVersion':2}}\\r\\n// Test enabled both\\r\\n// AB 10 13 00 99 6A 0A 00 02 11 36 00 08 1B 00 00 0E 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step on HRT off\\r\\n// AB 10 13 00 DD 0C 0B 00 02 11 36 00 08 0B 00 00 0C 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step off HRT on\\r\\n// AB 10 13 00 B5 D0 09 00 02 11 36 00 08 13 00 00 0A 00 00 00 14 00 00 00 03 0A 01\\r\\n// test both off \\r\\n// AB 10 13 00 F1 B6 0C 00 02 11 36 00 08 03 00 00 08 00 00 00 14 00 00 00 03 0A 01 \\r\\n// comando para Contact on ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 4C 2E 03 00 02 11 36 00 08 1B 00 00 4E 00 00 00 14 00 00 00 03 0A 01\\r\\n// comando para contact off ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 C2 8C 04 00 02 11 36 00 08 1B 00 00 46 00 00 00 14 00 00 00 03 0A 01\\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\n// To store the quantity of contacts in the whitelist to enable disable the contact menu\\r\\n//var contactos = params.ApprovedContacts && params.ApprovedContacts.Contact;\\r\\n//var numDuplas = Array.isArray(params.ApprovedContacts) ? params.ApprovedContacts.length : 0;\\r\\n//var numDuplas = params.ApprovedContacts;\\r\\nlet numDuplas = 0;\\r\\n//for (const key in params.ApprovedContacts) {\\r\\n// if (params.ApprovedContacts[key] && params.ApprovedContacts[key].Contact && params.ApprovedContacts[key].Contact !== \\\"\\\") {\\r\\n// numDuplas++;\\r\\n// }\\r\\n//}\\r\\nfor (const key in params.ApprovedContacts) {\\r\\n // if (params.ApprovedContacts[key] && params.ApprovedContacts[key].Contact && params.ApprovedContacts[key].Contact !== \\\"\\\") {\\r\\n numDuplas++;\\r\\n // }\\r\\n}\\r\\n// configuration command (0X02) , lenght and key\\r\\nvar messageBody = '021136';\\r\\n// step count/heart value display\\r\\n// Watch setting related FACE ID\\r\\nmessageBody += '00'; // Default FACE ID 0 \\r\\n// Future\\r\\n//if (params.WatchFace.SetWatchFace) {\\r\\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \\r\\n//} else {\\r\\n// messageBody += '00'; // Analog Face Default FACE ID 0 \\r\\n//}\\r\\n// Watch Display setting related to Step and heart rate settings\\r\\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '081B0000'; //both displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += (numDuplas > 0) ? 'E' : '6';\\r\\n //messageBody += '6'; //menu 1 and 2 \\r\\n //messageBody += 'E'; //menu 1 and 2 and contact (menu 3) \\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '080B0000'; // step display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '4'; //menu 2 \\r\\n //messageBody += 'C'; // menu 2 and contact (menu 3) \\r\\n messageBody += (numDuplas > 0) ? 'C' : '4';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '08130000'; // heart display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '2'; //menu 1 no contact (menu 3) \\r\\n //messageBody += 'A'; //menu 1 and contact (menu 3) \\r\\n messageBody += (numDuplas > 0) ? 'A' : '2';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '08030000'; // no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '0000000'; // no menu , //08 only contact\\r\\n //messageBody += '8'; // //08 only contact\\r\\n messageBody += (numDuplas > 0) ? '8' : '0';\\r\\n messageBody += '000000'; // other settings\\r\\n} else {\\r\\n messageBody += '08030000'; //no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '0000000'; // no menu..\\r\\n}\\r\\n//menu items for the future\\r\\n/*if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '06000000'; //menu 1 and 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '04000000'; //menu 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '02000000'; //menu 1\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '00000000'; // no menu\\r\\n} else {\\r\\n messageBody += '00000000'; // no menu\\r\\n}*/\\r\\n// from autohome page to the end\\r\\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\\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\\n//AddValueSMS('dataSMS', dataSMS);\\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// 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":1764842718},{"Type":1,"NewValue":"{\"Id\":5806,\"Name\":\"setWatchSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"// Watch Settings\\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 Watch Settings' Only enable y disable:\\r\\n// params.StepCounting.EnableDisableStepCounting == 'true'\\r\\n// params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true'\\r\\n//var params = {StepCounting:{'EnableDisableStepCounting':'true'},HeartRateMonitor:{'EnableDisableHeartRateMonitor':'true'}, DeviceVersion:{'DeviceVersion':2}}\\r\\n// Test enabled both\\r\\n// AB 10 13 00 99 6A 0A 00 02 11 36 00 08 1B 00 00 0E 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step on HRT off\\r\\n// AB 10 13 00 DD 0C 0B 00 02 11 36 00 08 0B 00 00 0C 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step off HRT on\\r\\n// AB 10 13 00 B5 D0 09 00 02 11 36 00 08 13 00 00 0A 00 00 00 14 00 00 00 03 0A 01\\r\\n// test both off \\r\\n// AB 10 13 00 F1 B6 0C 00 02 11 36 00 08 03 00 00 08 00 00 00 14 00 00 00 03 0A 01 \\r\\n// comando para Contact on ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 4C 2E 03 00 02 11 36 00 08 1B 00 00 4E 00 00 00 14 00 00 00 03 0A 01\\r\\n// comando para contact off ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 C2 8C 04 00 02 11 36 00 08 1B 00 00 46 00 00 00 14 00 00 00 03 0A 01\\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\n// To store the quantity of contacts in the whitelist to enable disable the contact menu\\r\\n//var contactos = params.ApprovedContacts && params.ApprovedContacts.Contact;\\r\\n//var numDuplas = Array.isArray(params.ApprovedContacts) ? params.ApprovedContacts.length : 0;\\r\\n//var numDuplas = params.ApprovedContacts;\\r\\nlet numDuplas = 2;\\r\\n//for (const key in params.ApprovedContacts) {\\r\\n// if (params.ApprovedContacts[key] && params.ApprovedContacts[key].Contact && params.ApprovedContacts[key].Contact !== \\\"\\\") {\\r\\n// numDuplas++;\\r\\n// }\\r\\n//}\\r\\n//for (const key in params.ApprovedContacts) {\\r\\n// if (params.ApprovedContacts[key] && params.ApprovedContacts[key].Contact && params.ApprovedContacts[key].Contact !== \\\"\\\") {\\r\\n// numDuplas++;\\r\\n// }\\r\\n//}\\r\\n// configuration command (0X02) , lenght and key\\r\\nvar messageBody = '021136';\\r\\n// step count/heart value display\\r\\n// Watch setting related FACE ID\\r\\nmessageBody += '00'; // Default FACE ID 0 \\r\\n// Future\\r\\n//if (params.WatchFace.SetWatchFace) {\\r\\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \\r\\n//} else {\\r\\n// messageBody += '00'; // Analog Face Default FACE ID 0 \\r\\n//}\\r\\n// Watch Display setting related to Step and heart rate settings\\r\\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '081B0000'; //both displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += (numDuplas > 0) ? 'E' : '6';\\r\\n //messageBody += '6'; //menu 1 and 2 \\r\\n //messageBody += 'E'; //menu 1 and 2 and contact (menu 3) \\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '080B0000'; // step display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '4'; //menu 2 \\r\\n //messageBody += 'C'; // menu 2 and contact (menu 3) \\r\\n messageBody += (numDuplas > 0) ? 'C' : '4';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '08130000'; // heart display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '2'; //menu 1 no contact (menu 3) \\r\\n //messageBody += 'A'; //menu 1 and contact (menu 3) \\r\\n messageBody += (numDuplas > 0) ? 'A' : '2';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '08030000'; // no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '0000000'; // no menu , //08 only contact\\r\\n //messageBody += '8'; // //08 only contact\\r\\n messageBody += (numDuplas > 0) ? '8' : '0';\\r\\n messageBody += '000000'; // other settings\\r\\n} else {\\r\\n messageBody += '08030000'; //no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '0000000'; // no menu..\\r\\n}\\r\\n//menu items for the future\\r\\n/*if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '06000000'; //menu 1 and 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '04000000'; //menu 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '02000000'; //menu 1\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '00000000'; // no menu\\r\\n} else {\\r\\n messageBody += '00000000'; // no menu\\r\\n}*/\\r\\n// from autohome page to the end\\r\\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\\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\\n//AddValueSMS('dataSMS', dataSMS);\\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// 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":1765218047}],"Tags":[]},{"Id":5807,"Name":"setEnableStep","TemplateSMS":null,"Template":"<>","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 true\nvalue += '1';\n// Voice true\nvalue += '1';\n// Vibration true\nvalue += '1';\n// Cell Tower True\nvalue += '1';\n// Wifi true\nvalue += '1';\n// SOS speaker true\nvalue += '1';\n// Side call Speaker true\nvalue += '1';\n// BLE stay connected true\nvalue += '1';\n// BLE locating true\nvalue += '1';\n// SOS Call Voice true\nvalue += '1';\n// BLE always on true\nvalue += '1';\n// GPS location true\nvalue += '1';\n// TCP fast true\nvalue += '1';\n// Rotate screen to iluminate true\nvalue += '1'; //watch only girar muñeca para iluminar pantalla\n// Beacon true\nvalue += '1';\n// activity fuction true\nvalue += '1'; // activity fuction, \n//step counting, \nif (params.StepsSettings.EnableDisableStepsSettings == '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';\n// stop call sequence true\nvalue += '1';\n// other no use\nvalue += '00000000';\n// auto update false\nvalue += '0';\n// AGPS true\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":[{"Type":0,"NewValue":"{\"Id\":5807,\"Name\":\"setEnableStep\",\"TemplateSMS\":null,\"Template\":\"<>\",\"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 true\\nvalue += '1';\\n// Voice true\\nvalue += '1';\\n// Vibration true\\nvalue += '1';\\n// Cell Tower True\\nvalue += '1';\\n// Wifi true\\nvalue += '1';\\n// SOS speaker true\\nvalue += '1';\\n// Side call Speaker true\\nvalue += '1';\\n// BLE stay connected true\\nvalue += '1';\\n// BLE locating true\\nvalue += '1';\\n// SOS Call Voice true\\nvalue += '1';\\n// BLE always on true\\nvalue += '1';\\n// GPS location true\\nvalue += '1';\\n// TCP fast true\\nvalue += '1';\\n// Rotate screen to iluminate true\\nvalue += '1'; //watch only girar muñeca para iluminar pantalla\\n// Beacon true\\nvalue += '1';\\n// activity fuction true\\nvalue += '1'; // activity fuction, \\n//step counting, \\nif (params.StepsSettings.EnableDisableStepsSettings == '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';\\n// stop call sequence true\\nvalue += '1';\\n// other no use\\nvalue += '00000000';\\n// auto update false\\nvalue += '0';\\n// AGPS true\\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":1749059198},{"Type":1,"NewValue":"{\"Id\":5807,\"Name\":\"setEnableStep\",\"TemplateSMS\":null,\"Template\":\"<>\",\"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 true\\nvalue += '1';\\n// Voice true\\nvalue += '1';\\n// Vibration true\\nvalue += '1';\\n// Cell Tower True\\nvalue += '1';\\n// Wifi true\\nvalue += '1';\\n// SOS speaker true\\nvalue += '1';\\n// Side call Speaker true\\nvalue += '1';\\n// BLE stay connected true\\nvalue += '1';\\n// BLE locating true\\nvalue += '1';\\n// SOS Call Voice true\\nvalue += '1';\\n// BLE always on true\\nvalue += '1';\\n// GPS location true\\nvalue += '1';\\n// TCP fast false to force send location on Alarm msgs\\nvalue += '0';\\n// Rotate screen to iluminate true\\nvalue += '1'; //watch only girar muñeca para iluminar pantalla\\n// Beacon true\\nvalue += '1';\\n// activity fuction true\\nvalue += '1'; // activity fuction, \\n//step counting, \\nif (params.StepsSettings.EnableDisableStepsSettings == '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';\\n// stop call sequence true\\nvalue += '1';\\n// other no use\\nvalue += '00000000';\\n// auto update false\\nvalue += '0';\\n// AGPS true\\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":1763456936}],"Tags":[]},{"Id":5818,"Name":"setSPOInterval","TemplateSMS":null,"Template":"<>","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.HeartrateSettings.ReportingFrequency) {\n var heartBeat = parseInt(params.HeartrateSettings.ReportingFrequency) * 60; //in seconds\n heartBeat = decimalToHex(heartBeat);\n heartBeat = ('000000' + heartBeat).slice(-6).toUpperCase();\n if (params.HeartrateSettings.EnableDisableHeartrateSettings == '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 = '58020000'\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":2,"ProtocolActionObjects":[{"Type":0,"NewValue":"{\"Id\":5818,\"Name\":\"setSPOInterval\",\"TemplateSMS\":null,\"Template\":\"<>\",\"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.HeartrateSettings.ReportingFrequency) {\\n var heartBeat = parseInt(params.HeartrateSettings.ReportingFrequency) * 60; //in seconds\\n heartBeat = decimalToHex(heartBeat);\\n heartBeat = ('000000' + heartBeat).slice(-6).toUpperCase();\\n if (params.HeartrateSettings.EnableDisableHeartrateSettings == '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 = '58020000'\\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\":2,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1762892227},{"Type":1,"NewValue":"{\"Id\":5818,\"Name\":\"setSPOInterval\",\"TemplateSMS\":null,\"Template\":\"<>\",\"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.SPO2Settings.ReportingFrequency) {\\n var heartBeat = parseInt(params.SPO2Settings.ReportingFrequency) * 60; //in seconds\\n heartBeat = decimalToHex(heartBeat);\\n heartBeat = ('000000' + heartBeat).slice(-6).toUpperCase();\\n if (params.SPO2Settings.EnableDisableSPO2Settings == '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 = '58020000'\\n} // disable and 600 seconds\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\nvar command = '02';\\nvar keyLength = '05';\\nvar key = '7A';\\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\":2,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1762893497}],"Tags":[]},{"Id":5819,"Name":"setAuthorisedNumbersAndWatchSettings","TemplateSMS":null,"Template":"<>","AckTemplate":null,"Operation":"//updated v 3 for EV06\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//[Length]:10 [Key]:34 [Value]:E0 09 31 32 33 34 35 36 37 38 39 02 79 6F 00\r\n//{\"numberNamePhoto\":{\"call\":1,\"noCard\":0,\"number\":\"123456789\",\"enable\":1,\"sms\":1,\"name\":\"yo\",\"headURL\":\"\",\"index\":0}}\r\n// para pruebas en local Contact':\r\n//AB 10 12 00 94 ED 00 00 02 10 34 E0 09 31 32 33 34 35 36 37 38 39 02 79 6F 00\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 phoneNumber = '';\r\nvar numberLength = '00';\r\nvar numberHex = '';\r\nvar nameLength = '00';\r\nvar nameHex = '';\r\nvar value = '02';\r\nvar keyLength = '00';\r\nvar confTel = '';\r\nvar count = 1; // approved contact will be from A2 to A9 - index 1 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 += \"0534\" + 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 phoneNumber = params.ApprovedContacts[contact].Contact;\r\n if (phoneNumber.startsWith(\"+\")) {\r\n phoneNumber = \"00\" + phoneNumber.substring(1);\r\n }\r\n numberHex = ascii_to_hexa(phoneNumber).toUpperCase();\r\n numberLength = ('00' + decimalToHex(phoneNumber.length)).slice(-2).toUpperCase();\r\n nameHex = ascii_to_hexa(params.ApprovedContacts[contact].Name).toUpperCase();\r\n nameLength = ('00' + decimalToHex(params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\r\n keyLength = ('00' + decimalToHex(5 + phoneNumber.length + params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\r\n value += keyLength + \"34\" + confTel + numberLength + numberHex + nameLength + nameHex + '00'; //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 phoneNumber = params.ApprovedContacts[contact].Contact;\r\n if (phoneNumber.startsWith(\"+\")) {\r\n phoneNumber = \"00\" + phoneNumber.substring(1);\r\n }\r\n numberHex = ascii_to_hexa(phoneNumber).toUpperCase();\r\n numberLength = ('00' + decimalToHex(phoneNumber.length)).slice(-2).toUpperCase();\r\n nameHex = ascii_to_hexa(params.ApprovedContacts[contact].Name).toUpperCase();\r\n nameLength = ('00' + decimalToHex(params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\r\n keyLength = ('00' + decimalToHex(5 + phoneNumber.length + params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\r\n value += keyLength + \"34\" + confTel + numberLength + numberHex + nameLength + nameHex + '00'; //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 += \"0534\" + 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":2,"ProtocolActionObjects":[{"Type":0,"NewValue":"{\"Id\":5819,\"Name\":\"setAuthorisedNumbersAndWatchSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"//updated v 3 for EV06\\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//[Length]:10 [Key]:34 [Value]:E0 09 31 32 33 34 35 36 37 38 39 02 79 6F 00\\r\\n//{\\\"numberNamePhoto\\\":{\\\"call\\\":1,\\\"noCard\\\":0,\\\"number\\\":\\\"123456789\\\",\\\"enable\\\":1,\\\"sms\\\":1,\\\"name\\\":\\\"yo\\\",\\\"headURL\\\":\\\"\\\",\\\"index\\\":0}}\\r\\n// para pruebas en local Contact':\\r\\n//AB 10 12 00 94 ED 00 00 02 10 34 E0 09 31 32 33 34 35 36 37 38 39 02 79 6F 00\\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 phoneNumber = '';\\r\\nvar numberLength = '00';\\r\\nvar numberHex = '';\\r\\nvar nameLength = '00';\\r\\nvar nameHex = '';\\r\\nvar value = '02';\\r\\nvar keyLength = '00';\\r\\nvar confTel = '';\\r\\nvar count = 1; // approved contact will be from A2 to A9 - index 1 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 += \\\"0534\\\" + 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 phoneNumber = params.ApprovedContacts[contact].Contact;\\r\\n if (phoneNumber.startsWith(\\\"+\\\")) {\\r\\n phoneNumber = \\\"00\\\" + phoneNumber.substring(1);\\r\\n }\\r\\n numberHex = ascii_to_hexa(phoneNumber).toUpperCase();\\r\\n numberLength = ('00' + decimalToHex(phoneNumber.length)).slice(-2).toUpperCase();\\r\\n nameHex = ascii_to_hexa(params.ApprovedContacts[contact].Name).toUpperCase();\\r\\n nameLength = ('00' + decimalToHex(params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n keyLength = ('00' + decimalToHex(5 + phoneNumber.length + params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n value += keyLength + \\\"34\\\" + confTel + numberLength + numberHex + nameLength + nameHex + '00'; //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 phoneNumber = params.ApprovedContacts[contact].Contact;\\r\\n if (phoneNumber.startsWith(\\\"+\\\")) {\\r\\n phoneNumber = \\\"00\\\" + phoneNumber.substring(1);\\r\\n }\\r\\n numberHex = ascii_to_hexa(phoneNumber).toUpperCase();\\r\\n numberLength = ('00' + decimalToHex(phoneNumber.length)).slice(-2).toUpperCase();\\r\\n nameHex = ascii_to_hexa(params.ApprovedContacts[contact].Name).toUpperCase();\\r\\n nameLength = ('00' + decimalToHex(params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n keyLength = ('00' + decimalToHex(5 + phoneNumber.length + params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n value += keyLength + \\\"34\\\" + confTel + numberLength + numberHex + nameLength + nameHex + '00'; //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 += \\\"0534\\\" + 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\":2,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1765217764},{"Type":1,"NewValue":"{\"Id\":5819,\"Name\":\"setAuthorisedNumbersAndWatchSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"// Combinated version setAuthorisedNumber with Watch Settings for EV06\\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// AB 10 22 00 32 FA 00 00 02 11 36 00 00 00 00 00 00 00 00 00 14 00 00 00 00 0A 00 0E 34 80 09 31 32 33 34 35 36 37 38 39 00 00\\r\\n// [Length]:11 [Key]:36 [Value]:00 00 00 00 00 00 00 00 00 14 00 00 00 00 0A 00\\r\\n//{\\\"watch\\\":{\\\"status18\\\":0,\\\"status17\\\":0,\\\"status19\\\":0,\\\"status10\\\":0,\\\"flagValue\\\":0,\\\"status12\\\":0,\\\"faceId\\\":0,\\\"status11\\\":0,\\\"status14\\\":0,\\\"status13\\\":0,\\\"status16\\\":0,\\\"status15\\\":0,\\\"status0\\\":0,\\\"status1\\\":0,\\\"menu8\\\":0,\\\"menu7\\\":0,\\\"menu6\\\":0,\\\"menu5\\\":0,\\\"menu4\\\":0,\\\"menu3\\\":0,\\\"menu2\\\":0,\\\"menu1\\\":0,\\\"autoTime\\\":20,\\\"brightNess\\\":0,\\\"logoIndex\\\":0,\\\"status20\\\":0,\\\"status8\\\":0,\\\"status9\\\":0,\\\"status2\\\":0,\\\"status3\\\":0,\\\"brightTime\\\":10}}\\r\\n//[Length]:0E [Key]:34 [Value]:80 09 31 32 33 34 35 36 37 38 39 00 00\\r\\n//{\\\"numberNamePhoto\\\":{\\\"call\\\":0,\\\"noCard\\\":0,\\\"number\\\":\\\"123456789\\\",\\\"enable\\\":1,\\\"sms\\\":0,\\\"name\\\":\\\"\\\",\\\"headURL\\\":\\\"\\\",\\\"index\\\":0}}\\r\\n// para pruebas en local Contact':\\r\\n//AB 10 12 00 94 ED 00 00 02 10 34 E0 09 31 32 33 34 35 36 37 38 39 02 79 6F 00\\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 phoneNumber = '';\\r\\nvar numberLength = '00';\\r\\nvar numberHex = '';\\r\\nvar nameLength = '00';\\r\\nvar nameHex = '';\\r\\nvar value = '02';\\r\\nvar keyLength = '00';\\r\\nvar confTel = '';\\r\\nvar count = 1; // approved contact will be from A2 to A9 - index 1 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 += \\\"0534\\\" + 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 phoneNumber = params.ApprovedContacts[contact].Contact;\\r\\n if (phoneNumber.startsWith(\\\"+\\\")) {\\r\\n phoneNumber = \\\"00\\\" + phoneNumber.substring(1);\\r\\n }\\r\\n numberHex = ascii_to_hexa(phoneNumber).toUpperCase();\\r\\n numberLength = ('00' + decimalToHex(phoneNumber.length)).slice(-2).toUpperCase();\\r\\n nameHex = ascii_to_hexa(params.ApprovedContacts[contact].Name).toUpperCase();\\r\\n nameLength = ('00' + decimalToHex(params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n keyLength = ('00' + decimalToHex(5 + phoneNumber.length + params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n value += keyLength + \\\"34\\\" + confTel + numberLength + numberHex + nameLength + nameHex + '00'; //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 phoneNumber = params.ApprovedContacts[contact].Contact;\\r\\n if (phoneNumber.startsWith(\\\"+\\\")) {\\r\\n phoneNumber = \\\"00\\\" + phoneNumber.substring(1);\\r\\n }\\r\\n numberHex = ascii_to_hexa(phoneNumber).toUpperCase();\\r\\n numberLength = ('00' + decimalToHex(phoneNumber.length)).slice(-2).toUpperCase();\\r\\n nameHex = ascii_to_hexa(params.ApprovedContacts[contact].Name).toUpperCase();\\r\\n nameLength = ('00' + decimalToHex(params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n keyLength = ('00' + decimalToHex(5 + phoneNumber.length + params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n value += keyLength + \\\"34\\\" + confTel + numberLength + numberHex + nameLength + nameHex + '00'; //no photo\\r\\n //value += keyLength + \\\"30\\\" + confTel + numberHex; //no photo \\r\\n }\\r\\n count++;\\r\\n}\\r\\ncounter = count; // to check how many contacts are in the lists\\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 += \\\"0534\\\" + confTel + '000000'; //no number, no name, no photo\\r\\n}\\r\\n// watch settings section\\r\\n// lenght and key\\r\\nvar messageBody = '1136';\\r\\n// step count/heart value display\\r\\n// Watch setting related FACE ID\\r\\nmessageBody += '00'; // Default FACE ID 0 \\r\\n// Future\\r\\n//if (params.WatchFace.SetWatchFace) {\\r\\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \\r\\n//} else {\\r\\n// messageBody += '00'; // Analog Face Default FACE ID 0 \\r\\n//}\\r\\n// Watch Display setting related to Step and heart rate settings\\r\\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '081B0000'; //both displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += (counter > 1) ? 'E' : '6';\\r\\n //messageBody += '6'; //menu 1 and 2 \\r\\n //messageBody += 'E'; //menu 1 and 2 and contact (menu 3) \\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '080B0000'; // step display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '4'; //menu 2 \\r\\n //messageBody += 'C'; // menu 2 and contact (menu 3) \\r\\n messageBody += (counter > 1) ? 'C' : '4';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '08130000'; // heart display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '2'; //menu 1 no contact (menu 3) \\r\\n //messageBody += 'A'; //menu 1 and contact (menu 3) \\r\\n messageBody += (counter > 1) ? 'A' : '2';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '08030000'; // no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '0000000'; // no menu , //08 only contact\\r\\n //messageBody += '8'; // //08 only contact\\r\\n messageBody += (counter > 1) ? '8' : '0';\\r\\n messageBody += '000000'; // other settings\\r\\n} else {\\r\\n messageBody += '08030000'; //no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '0000000'; // no menu..\\r\\n}\\r\\n// from autohome page to the end\\r\\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\\r\\nvalue += messageBody; //add watchsetting hex to contact hex in value var \\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\":2,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1765219303},{"Type":1,"NewValue":"{\"Id\":5819,\"Name\":\"setAuthorisedNumbersAndWatchSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"// Combinated version setAuthorisedNumber with Watch Settings for EV06\\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// AB 10 22 00 32 FA 00 00 02 11 36 00 00 00 00 00 00 00 00 00 14 00 00 00 00 0A 00 0E 34 80 09 31 32 33 34 35 36 37 38 39 00 00\\r\\n// [Length]:11 [Key]:36 [Value]:00 00 00 00 00 00 00 00 00 14 00 00 00 00 0A 00\\r\\n//{\\\"watch\\\":{\\\"status18\\\":0,\\\"status17\\\":0,\\\"status19\\\":0,\\\"status10\\\":0,\\\"flagValue\\\":0,\\\"status12\\\":0,\\\"faceId\\\":0,\\\"status11\\\":0,\\\"status14\\\":0,\\\"status13\\\":0,\\\"status16\\\":0,\\\"status15\\\":0,\\\"status0\\\":0,\\\"status1\\\":0,\\\"menu8\\\":0,\\\"menu7\\\":0,\\\"menu6\\\":0,\\\"menu5\\\":0,\\\"menu4\\\":0,\\\"menu3\\\":0,\\\"menu2\\\":0,\\\"menu1\\\":0,\\\"autoTime\\\":20,\\\"brightNess\\\":0,\\\"logoIndex\\\":0,\\\"status20\\\":0,\\\"status8\\\":0,\\\"status9\\\":0,\\\"status2\\\":0,\\\"status3\\\":0,\\\"brightTime\\\":10}}\\r\\n//[Length]:0E [Key]:34 [Value]:80 09 31 32 33 34 35 36 37 38 39 00 00\\r\\n//{\\\"numberNamePhoto\\\":{\\\"call\\\":0,\\\"noCard\\\":0,\\\"number\\\":\\\"123456789\\\",\\\"enable\\\":1,\\\"sms\\\":0,\\\"name\\\":\\\"\\\",\\\"headURL\\\":\\\"\\\",\\\"index\\\":0}}\\r\\n// para pruebas en local Contact':\\r\\n//AB 10 12 00 94 ED 00 00 02 10 34 E0 09 31 32 33 34 35 36 37 38 39 02 79 6F 00\\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 phoneNumber = '';\\r\\nvar numberLength = '00';\\r\\nvar numberHex = '';\\r\\nvar nameLength = '00';\\r\\nvar nameHex = '';\\r\\nvar value = '02';\\r\\nvar keyLength = '00';\\r\\nvar confTel = '';\\r\\nvar count = 1; // approved contact will be from A2 to A9 - index 1 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 += \\\"0534\\\" + 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 phoneNumber = params.ApprovedContacts[contact].Contact;\\r\\n if (phoneNumber.startsWith(\\\"+\\\")) {\\r\\n phoneNumber = \\\"00\\\" + phoneNumber.substring(1);\\r\\n }\\r\\n numberHex = ascii_to_hexa(phoneNumber).toUpperCase();\\r\\n numberLength = ('00' + decimalToHex(phoneNumber.length)).slice(-2).toUpperCase();\\r\\n nameHex = ascii_to_hexa(params.ApprovedContacts[contact].Name).toUpperCase();\\r\\n nameLength = ('00' + decimalToHex(params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n keyLength = ('00' + decimalToHex(5 + phoneNumber.length + params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n value += keyLength + \\\"34\\\" + confTel + numberLength + numberHex + nameLength + nameHex + '00'; //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 phoneNumber = params.ApprovedContacts[contact].Contact;\\r\\n if (phoneNumber.startsWith(\\\"+\\\")) {\\r\\n phoneNumber = \\\"00\\\" + phoneNumber.substring(1);\\r\\n }\\r\\n numberHex = ascii_to_hexa(phoneNumber).toUpperCase();\\r\\n numberLength = ('00' + decimalToHex(phoneNumber.length)).slice(-2).toUpperCase();\\r\\n nameHex = ascii_to_hexa(params.ApprovedContacts[contact].Name).toUpperCase();\\r\\n nameLength = ('00' + decimalToHex(params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n keyLength = ('00' + decimalToHex(5 + phoneNumber.length + params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n value += keyLength + \\\"34\\\" + confTel + numberLength + numberHex + nameLength + nameHex + '00'; //no photo\\r\\n //value += keyLength + \\\"30\\\" + confTel + numberHex; //no photo \\r\\n }\\r\\n count++;\\r\\n}\\r\\ncounter = count; // to check how many contacts are in the lists\\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 += \\\"0534\\\" + confTel + '000000'; //no number, no name, no photo\\r\\n}\\r\\n// watch settings section\\r\\n// lenght and key\\r\\nvar messageBody = '1136';\\r\\n// step count/heart value display\\r\\n// Watch setting related FACE ID\\r\\nmessageBody += '00'; // Default FACE ID 0 \\r\\n// Future\\r\\n//if (params.WatchFace.SetWatchFace) {\\r\\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \\r\\n//} else {\\r\\n// messageBody += '00'; // Analog Face Default FACE ID 0 \\r\\n//}\\r\\n// Watch Display setting related to Step and heart rate settings\\r\\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '081B0000'; //both displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += (counter > 2) ? 'E' : '6';\\r\\n //messageBody += '6'; //menu 1 and 2 \\r\\n //messageBody += 'E'; //menu 1 and 2 and contact (menu 3) \\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '080B0000'; // step display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '4'; //menu 2 \\r\\n //messageBody += 'C'; // menu 2 and contact (menu 3) \\r\\n messageBody += (counter > 2) ? 'C' : '4';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '08130000'; // heart display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '2'; //menu 1 no contact (menu 3) \\r\\n //messageBody += 'A'; //menu 1 and contact (menu 3) \\r\\n messageBody += (counter > 2) ? 'A' : '2';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '08030000'; // no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '0000000'; // no menu , //08 only contact\\r\\n //messageBody += '8'; // //08 only contact\\r\\n messageBody += (counter > 2) ? '8' : '0';\\r\\n messageBody += '000000'; // other settings\\r\\n} else {\\r\\n messageBody += '08030000'; //no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '0000000'; // no menu..\\r\\n}\\r\\n// from autohome page to the end\\r\\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\\r\\nvalue += messageBody; //add watchsetting hex to contact hex in value var \\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\":2,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1765219826},{"Type":1,"NewValue":"{\"Id\":5819,\"Name\":\"setAuthorisedNumbersAndWatchSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"// Combinated version setAuthorisedNumber with Watch Settings for EV06\\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// AB 10 22 00 32 FA 00 00 02 11 36 00 00 00 00 00 00 00 00 00 14 00 00 00 00 0A 00 0E 34 80 09 31 32 33 34 35 36 37 38 39 00 00\\r\\n// [Length]:11 [Key]:36 [Value]:00 00 00 00 00 00 00 00 00 14 00 00 00 00 0A 00\\r\\n//{\\\"watch\\\":{\\\"status18\\\":0,\\\"status17\\\":0,\\\"status19\\\":0,\\\"status10\\\":0,\\\"flagValue\\\":0,\\\"status12\\\":0,\\\"faceId\\\":0,\\\"status11\\\":0,\\\"status14\\\":0,\\\"status13\\\":0,\\\"status16\\\":0,\\\"status15\\\":0,\\\"status0\\\":0,\\\"status1\\\":0,\\\"menu8\\\":0,\\\"menu7\\\":0,\\\"menu6\\\":0,\\\"menu5\\\":0,\\\"menu4\\\":0,\\\"menu3\\\":0,\\\"menu2\\\":0,\\\"menu1\\\":0,\\\"autoTime\\\":20,\\\"brightNess\\\":0,\\\"logoIndex\\\":0,\\\"status20\\\":0,\\\"status8\\\":0,\\\"status9\\\":0,\\\"status2\\\":0,\\\"status3\\\":0,\\\"brightTime\\\":10}}\\r\\n//[Length]:0E [Key]:34 [Value]:80 09 31 32 33 34 35 36 37 38 39 00 00\\r\\n//{\\\"numberNamePhoto\\\":{\\\"call\\\":0,\\\"noCard\\\":0,\\\"number\\\":\\\"123456789\\\",\\\"enable\\\":1,\\\"sms\\\":0,\\\"name\\\":\\\"\\\",\\\"headURL\\\":\\\"\\\",\\\"index\\\":0}}\\r\\n// para pruebas en local Contact':\\r\\n//AB 10 12 00 94 ED 00 00 02 10 34 E0 09 31 32 33 34 35 36 37 38 39 02 79 6F 00\\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 phoneNumber = '';\\r\\nvar numberLength = '00';\\r\\nvar numberHex = '';\\r\\nvar nameLength = '00';\\r\\nvar nameHex = '';\\r\\nvar value = '02';\\r\\nvar keyLength = '00';\\r\\nvar confTel = '';\\r\\nvar count = 1; // approved contact will be from A2 to A9 - index 1 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\\ncounter = 0; // to check how many contacts are in the lists\\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 += \\\"0534\\\" + 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 phoneNumber = params.ApprovedContacts[contact].Contact;\\r\\n if (phoneNumber.startsWith(\\\"+\\\")) {\\r\\n phoneNumber = \\\"00\\\" + phoneNumber.substring(1);\\r\\n }\\r\\n numberHex = ascii_to_hexa(phoneNumber).toUpperCase();\\r\\n numberLength = ('00' + decimalToHex(phoneNumber.length)).slice(-2).toUpperCase();\\r\\n nameHex = ascii_to_hexa(params.ApprovedContacts[contact].Name).toUpperCase();\\r\\n nameLength = ('00' + decimalToHex(params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n keyLength = ('00' + decimalToHex(5 + phoneNumber.length + params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n value += keyLength + \\\"34\\\" + confTel + numberLength + numberHex + nameLength + nameHex + '00'; //no photo\\r\\n //value += keyLength + \\\"30\\\" + confTel + numberHex; //no photo \\r\\n counter++;\\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 phoneNumber = params.ApprovedContacts[contact].Contact;\\r\\n if (phoneNumber.startsWith(\\\"+\\\")) {\\r\\n phoneNumber = \\\"00\\\" + phoneNumber.substring(1);\\r\\n }\\r\\n numberHex = ascii_to_hexa(phoneNumber).toUpperCase();\\r\\n numberLength = ('00' + decimalToHex(phoneNumber.length)).slice(-2).toUpperCase();\\r\\n nameHex = ascii_to_hexa(params.ApprovedContacts[contact].Name).toUpperCase();\\r\\n nameLength = ('00' + decimalToHex(params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n keyLength = ('00' + decimalToHex(5 + phoneNumber.length + params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n value += keyLength + \\\"34\\\" + confTel + numberLength + numberHex + nameLength + nameHex + '00'; //no photo\\r\\n //value += keyLength + \\\"30\\\" + confTel + numberHex; //no photo \\r\\n counter++;\\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 += \\\"0534\\\" + confTel + '000000'; //no number, no name, no photo\\r\\n}\\r\\n// watch settings section\\r\\n// lenght and key\\r\\nvar messageBody = '1136';\\r\\n// step count/heart value display\\r\\n// Watch setting related FACE ID\\r\\nmessageBody += '00'; // Default FACE ID 0 \\r\\n// Future\\r\\n//if (params.WatchFace.SetWatchFace) {\\r\\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \\r\\n//} else {\\r\\n// messageBody += '00'; // Analog Face Default FACE ID 0 \\r\\n//}\\r\\n// Watch Display setting related to Step and heart rate settings\\r\\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '081B0000'; //both displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += (counter > 0) ? 'E' : '6';\\r\\n //messageBody += '6'; //menu 1 and 2 \\r\\n //messageBody += 'E'; //menu 1 and 2 and contact (menu 3) \\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '080B0000'; // step display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '4'; //menu 2 \\r\\n //messageBody += 'C'; // menu 2 and contact (menu 3) \\r\\n messageBody += (counter > 0) ? 'C' : '4';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '08130000'; // heart display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '2'; //menu 1 no contact (menu 3) \\r\\n //messageBody += 'A'; //menu 1 and contact (menu 3) \\r\\n messageBody += (counter > 0) ? 'A' : '2';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '08030000'; // no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '0000000'; // no menu , //08 only contact\\r\\n //messageBody += '8'; // //08 only contact\\r\\n messageBody += (counter > 0) ? '8' : '0';\\r\\n messageBody += '000000'; // other settings\\r\\n} else {\\r\\n messageBody += '08030000'; //no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '0000000'; // no menu..\\r\\n}\\r\\n// from autohome page to the end\\r\\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\\r\\nvalue += messageBody; //add watchsetting hex to contact hex in value var \\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\":2,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1765220298}],"Tags":[]}],"Operations":[{"Id":437,"Name":"Access TEC Care Watch","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 // Watch protocol - please see variables and typical values in order below\n // Watch-CYC;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;SIGNAL=<>;WM=<>;GENERAL=<>\n // Watch-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\",\n //\n // Author: Juanmi Navarro\n // Created: 01/01/0000\n // Last modified: 20/05/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', 'Watch');\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 = (`Watch-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 //<>,<>,<> \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 //<>,<>,<> \n if (mac2) {\n AddValue(codeValues, 'beacon_mac', mac2);\n var simpleQuery2 = [{\n 'code': 'Mac',\n 'value': mac2,\n }];\n var simpleQueryLabel2 = {\n 'table': 'beacons',\n 'select': 'Name',\n 'query': simpleQuery2\n };\n var labels2 = [];\n labels2.push(JSON.stringify(simpleQueryLabel2));\n AddValue(codeValues, 'oysta_labels', JSON.stringify(labels2));\n }\n if (params.beacon_major) {\n AddValue(codeValues, 'beacon_major', params.beacon_major);\n } else {\n AddValue(codeValues, 'beacon_major', 0);\n }\n if (params.beacon_minor) {\n AddValue(codeValues, 'beacon_minor', params.beacon_minor);\n } else {\n AddValue(codeValues, 'beacon_minor', 0);\n }\n //AddValue(codeValues,'oysta_labels', label);\n //AddValue(codeValues,'oysta_value', mac);\n if (location_time) {\n AddValue(codeValues, 'location_time', location_time);\n }\n }\n /* meter mas tarde... \n if (params.smart_data !== 'undefined') {\n var gen_location = params.smart_data.split(',')\n var latitude = gen_location[0]\n var longitude = gen_location[1]\n var location_accuracy = gen_location[2]\n var altitude = gen_location[3]\n AddValue(codeValues,'latitude', latitude);\n AddValue(codeValues,'longitude', longitude);\n AddValue(codeValues,'altitude', altitude);\n AddValue(codeValues,'location_accuracy', location_accuracy);\n }\n */\n /*else if ((params.event_time) && (params.event_time == '')) {\n var event_time = moment.utc().unix();\n AddValue(codeValues,'event_time', event_time);\n } revisar mas adelante*/\n // to parse SMS info from the device\n switch (messageTypeLocalCode) {\n case 'COMM-SMS': // SMS message sent in\n if (params.data.startsWith('Device location request')) {\n configsToAck.push(configIds.Controls.RealTimeLocate);\n } else if (params.data.startsWith('Set IP ok')) {\n configsToAck.push(configIds.Controls.GetCurrentConfig);\n } else if (params.data.startsWith('IMEI:')) {\n configsToAck.push(configIds.Controls.GetFirmwareVersion);\n } else if (params.data.startsWith('Set IP ok')) {\n configsToAck.push(configIds.Controls.ClearBufferedMessages);\n } else if (params.data.startsWith('flush ok')) {\n configsToAck.push(configIds.Controls.GetCurrentConfig);\n } else if (params.data.startsWith('Set Watch-')) {\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 = (`Watch-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 = (`Watch;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 = (`Watch;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 = (`Watch-RTL;${params.imei};${location_time};${location_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\n sendMessageToLocalhostNoWait(messageForReceiver);\n break;\n }\n if (!params.event_time && !event_time) { // if params.event_time undefined - set it to now. \n var event_time = moment.utc().unix();\n AddValue(codeValues, 'event_time', event_time);\n }\n // if (!params.location_time && !location_time) { // if params.location_time undefined - set it to now. \n // var location_time = moment.utc().unix();\n // AddValue(codeValues, 'location_time', location_time);\n //}\n }\n // send data msg to kibana\n const data = buildDataToReceiver(codeValues, configsToAck, configsToUpdate, configsToSend);\n console.log(data);\n return data\n // end of main operation\n // define functions used in operation\n // decode global msg\n function decoder(str) { // decode rawdata\n // CARE Decoder\n AddValue(codeValues, 'Message : ', str);\n var message = str;\n // need to check if checksum is correct for possible msg corruption 10/03/23\n var checksum = message.substring(8, 12);\n var messageBody = message.substring(16, message.length);\n debug('message =' + message);\n debug('checksum =' + checksum);\n debug('calculateCheckSum =' + calculateCheckSum(messageBody));\n if (calculateCheckSum(messageBody) == checksum) { // payload is valid\n debug(\"message has valid checksum\");\n var messageBody = command; // update value for the ACK\n debug('command =' + command);\n if (command == '01') {\n while (index < total_length + 16) {\n // gen_location = '0'; //cambiado 30/09\n var keyLengthHex = message.substring(index, index = index + 2);\n var keyLength = 2 * hexToDecimal(keyLengthHex);\n var key = message.substring(index, index = index + 2);\n var value = message.substring(index, index = index + keyLength - 2);\n debug('key = ' + key);\n debug('value = ' + value);\n switch (key) {\n //Device ID\n case '01':\n var imei = hexToAscii(value);\n break;\n //Alarm code\n case '02':\n var alarm = 'CYC';\n var alarmCode = value.substring(0, 8);\n alarmCode = changeEndianness(alarmCode);\n var timestampHex = value.substring(8, 16);\n timestampHex = changeEndianness(timestampHex);\n timestamp = hexToDecimal(timestampHex);\n event_time = timestamp;\n var alarmCodeInt = hexToDecimal(alarmCode);\n var alarmCodeExt = value.substring(16, 24);\n alarmCodeExt = changeEndianness(alarmCodeExt);\n var alarmCodeExtInt = hexToDecimal(alarmCodeExt);\n //Extended Alerts\n // Fall off\n if ((alarmCodeExtInt & 1) == 1) {\n var alarm = 'ALF-C';\n }\n // Welfare Check-out\n else if ((alarmCodeExtInt & 2) == 2) {\n var alarm = 'ALA-C';\n }\n // Standard Alerts\n //Battery low\n else if ((alarmCodeInt & 1) == 1) {\n var alarm = 'BATL';\n }\n //Overspeed\n else if ((alarmCodeInt & 2) == 2) {\n var alarm = 'ALSP';\n }\n //Fall\n else if ((alarmCodeInt & 4) == 4) {\n var alarm = 'ALF';\n }\n //Tilt\n else if ((alarmCodeInt & 8) == 8) {\n var alarm = 'Tilt';\n } else if ((alarmCodeInt & 16) == 16) {\n if ((alarmCodeInt & 16777216) == 16777216) {\n var alarm = 'Geo1-IN';\n } else {\n var alarm = 'Geo1-OUT';\n }\n } else if ((alarmCodeInt & 32) == 32) {\n if ((alarmCodeInt & 33554432) == 33554432) {\n var alarm = 'Geo2-IN';\n } else {\n var alarm = 'Geo2-OUT';\n }\n } else if ((alarmCodeInt & 64) == 64) {\n if ((alarmCodeInt & 67108864) == 67108864) {\n var alarm = 'Geo3-IN';\n } else {\n var alarm = 'Geo3-OUT';\n }\n } else if ((alarmCodeInt & 128) == 128) {\n if ((alarmCodeInt & 134217728) == 134217728) {\n var alarm = 'Geo4-IN';\n } else {\n var alarm = 'Geo4-OUT';\n }\n }\n //Power Off\n else if ((alarmCodeInt & 256) == 256) {\n var alarm = 'PWRF';\n }\n //Power On\n else if ((alarmCodeInt & 512) == 512) {\n var alarm = 'PWRN';\n }\n //Motion\n else if ((alarmCodeInt & 1024) == 1024) {\n var alarm = 'ALMOV';\n }\n //No Motion\n else if ((alarmCodeInt & 2048) == 2048) {\n var alarm = 'ALNM';\n }\n //SOS\n else if ((alarmCodeInt & 4096) == 4096) {\n var alarm = 'ALSOS';\n } else if ((alarmCodeInt & 8192) == 8192) {\n var alarm = 'Side1';\n } else if ((alarmCodeInt & 16384) == 16384) {\n var alarm = 'Side2';\n }\n //Battery charging\n else if ((alarmCodeInt & 32768) == 32768) {\n var alarm = 'BATCN';\n }\n //Battery no charging\n else if ((alarmCodeInt & 65536) == 65536) {\n var alarm = 'BATCF';\n }\n //SOS Ending\n // Temporary Commented until we know exactly how it works. 22/09/2022\n else if ((alarmCodeInt & 131072) == 131072) {\n var alarm = 'SOSEnding';\n info = 'Alarm Finished';\n }\n //Amber Alert EC03 only\n else if ((alarmCodeInt & 262144) == 262144) {\n var alarm = 'ALAO';\n }\n // welfare Alert check-in ALA-O\n else if ((alarmCodeInt & 524288) == 524288) {\n var alarm = 'ALA-O';\n }\n // Amber alert Ending ALA-C\n else if ((alarmCodeInt & 1048576) == 1048576) {\n var alarm = 'ALA-C';\n }\n // Amber alert Ending ALA-C\n //else if ((alarmCodeInt & 1048576) == 1048576) {\n // var alarm = 'ALA-C';\n //}\n // Fall-Down Alert ending\n else if ((alarmCodeInt & 2097152) == 2097152) {\n var alarm = 'ALF-C';\n }\n // welfare Alert Ending ALA\n else if ((alarmCodeInt & 4194304) == 4194304) {\n var alarm = 'ALA';\n }\n // Beacon absent Alert 11/10/22. Need to be added in msg types\n //else if ((alarmCodeInt & 16777216) == 16777216) {\n // var alarm = 'BEA';\n //}\n general += 'alarm:' + alarm + ',';\n break;\n //Custom ID\n case '03':\n // in value is customID.... '06' for Watch Care\n // if ((imei != '860470063029395') && (imei != '860470063035947')) {\n //update customID to check if belongs to this type of device\n //value = hexToAscii(value);\n customID = value;\n if (value != '3036') {\n AddValue(codeValues, \"error\", \"customID not belongs to this protocol\");\n //AddValue(codeValues, \"rawFromBytes\", rawFromBytes);\n AddValue(codeValues, \"customID\", value);\n // exit decoder\n // const data = buildDataToReceiver(codeValues, configsToAck, configsToUpdate, configsToSend);\n // console.log(data);\n return // data\n } else {\n if (serverParams.Imei === undefined || serverParams.Imei === null) {\n sendMessageToLocalhostNoWait(\"Eview-ASSOCIATE;\" + imei + \";\" + serverParams.Guid + \";\");\n //return;\n }\n AddValue(codeValues, \"customID\", value);\n general += 'customID:' + value + ',';\n break;\n }\n //Historical Data Completed\n case '10': // indica q se han terminado de enviar todos los datos historicos.\n var histData = true;\n break;\n //GPS location\n case '20':\n location_type = 'GPS';\n var latitudeHex = value.substring(0, 8);\n var longitudeHex = value.substring(8, 16);\n var speedHex = value.substring(16, 20);\n var directionHex = value.substring(20, 24);\n var altitudeHex = value.substring(24, 28);\n var location_accuracyHex = value.substring(28, 32);\n var mileageHex = value.substring(32, 40);\n var satellitesHex = value.substring(40, 42);\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\n speed = ((hexToDecimal(changeEndianness(speedHex))) / 3.6).toFixed(2); //date 14-02-2023 in m/s\n var direction = hexToDecimal(changeEndianness(directionHex));\n var altitude = hexToDecimal(changeEndianness(altitudeHex)); // in meters\n //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\n // Range: 0.5 to 99.9 \n location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\n //var mileage = hexToDecimal(changeEndianness(mileageHex)) this is in km/h we need m/s\n var mileage = hexToDecimal(changeEndianness(mileageHex)); // in meters date 14-02-2023\n var satellites = hexToDecimal(satellitesHex);\n // location_time = timestamp;\n //<>,<>,<>,<>,<>\n gps_data = `${latitude},${longitude},${location_accuracy},${speed},${direction},${altitude},${satellites},${mileage}`;\n general += 'gps location (lat):' + latitude + ', (long):' + longitude + ',';\n break;\n //WIFI Towers\n case '22':\n location_type = 'WIFI';\n var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\n //location_time = timestamp;\n var wifiTowers = value;\n general += 'wifiTowers:';\n var indexWifi = 0;\n var bssid_array = [];\n wifi_data = '';\n for (let i = 0; i < numWifi; i++) {\n wifi_data += hexToDecimalSigned(wifiTowers.substring(indexWifi, indexWifi + 2)) + ',' + wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\n indexWifi += 14;\n }\n wifi_data = wifi_data.slice(0, -1);\n general += wifi_data;\n break;\n //BLE Location Added 10/10/22\n case '23':\n location_type = 'BLE';\n var mac = value.substring(0, 12);\n var latitudeHex = value.substring(12, 20);\n var longitudeHex = value.substring(20, 28);\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\n var address = hexToAscii(value.substring(28, value.length));\n var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\n // add : format in MAC\n mac = mac.match(/.{1,2}/g).join(':');\n // location_time = timestamp;\n ble_data = `${latitude},${longitude},${mac},${address}`;\n general += 'BLE location (lat):' + latitude + ', (long):' + longitude + ',';\n break;\n //General Data , status_data\n case '24':\n //var general = 'true'\n //if (cu != '06') {\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 = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\n sendMessageToLocalhostNoWait(messageForReceiver);\n alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\n }\n //else {\n // messageForReceiver = (`CareWatch-CYC;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};`);\n //}\n // reset variables\n //alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\n var timestampHex = value.substring(0, 8);\n timestampHex = changeEndianness(timestampHex);\n timestamp = hexToDecimal(timestampHex);\n location_time = timestamp;\n event_time = timestamp;\n // HardCode to fix possible issue in protocol\n //event_time = moment.utc().unix();\n // end of hard code\n var statusHex = changeEndianness(value.substring(8, 16));\n var statusInt = hexToDecimal(statusHex);\n var statusDevice = '';\n if ((statusInt & 1) == 1) {\n statusDevice += 'GPS,';\n }\n if ((statusInt & 2) == 2) {\n statusDevice += 'WIFISource,';\n }\n if ((statusInt & 4) == 4) {\n statusDevice += 'CellTower,';\n }\n if ((statusInt & 8) == 8) {\n statusDevice += 'BLELocation,';\n }\n //params.BatteryStatus.BatteryStatus = '1';\n if ((statusInt & 16) == 16) {\n statusDevice += 'Charging,';\n // var alarm = 'BATCN';\n //configs.BatteryStatus.BatteryStatus = '1';\n /* if (configs.BatteryStatus.BatteryStatus !== '1') {\n hasConfigs = true;\n var batteryStatus = '1';\n var alarm = 'BATCN';\n let configsToUpdate = [];\n configsToUpdate.push({\n 'code': configIds.BatteryStatus.BatteryStatus,\n 'value': batteryStatus\n });\n }*/\n }\n if ((statusInt & 32) == 32) {\n statusDevice += 'FUllyCharged,';\n //var alarm = 'BATF';\n // configs.BatteryStatus.BatteryStatus = '3';\n /* if (configs.BatteryStatus.BatteryStatus !== '3') {\n hasConfigs = true;\n var batteryStatus = '3';\n var alarm = 'BATF';\n let configsToUpdate = [];\n configsToUpdate.push({\n 'code': configIds.BatteryStatus.BatteryStatus,\n 'value': batteryStatus\n });\n }*/\n }\n /* if (!((statusInt & 32) == 32) & !((statusInt & 16) == 16)) {\n statusDevice += 'Not Charging,';\n var alarm = 'BATCF';\n //configs.BatteryStatus.BatteryStatus = '2';\n if (configs.BatteryStatus.BatteryStatus !== '2') {\n var batteryStatus = '2';\n var alarm = 'BATCF';\n let configsToUpdate = [];\n configsToUpdate.push({\n 'code': configIds.BatteryStatus.BatteryStatus,\n 'value': batteryStatus\n });\n }\n }*/\n if ((statusInt & 64) == 64) {\n statusDevice += 'Reboot,';\n }\n if ((statusInt & 128) == 128) {\n statusDevice += 'HistoricalData,';\n }\n if ((statusInt & 256) == 256) {\n statusDevice += 'AGPSDataValid,';\n }\n if ((statusInt & 512) == 512) {\n statusDevice += 'Motion,';\n }\n if ((statusInt & 1024) == 1024) {\n statusDevice += 'SmartLocating,';\n }\n if ((statusInt & 2048) == 2048) { //isHome\n statusDevice += 'BeaconLocation,';\n }\n if ((statusInt & 4096) == 4096) {\n statusDevice += 'BLEConnected,';\n }\n if ((statusInt & 16384) == 16384) {\n statusDevice += 'HomeWiFi,';\n }\n statusDevice = statusDevice.slice(0, -1);\n status_data = statusDevice; //to oysta template\n //statusHex = (statusHex);\n statusHex = hexToBin(statusHex);\n statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\n battery_percentage = parseInt(statusHex.substring(0, 8), 2);\n cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\n workMode = parseInt(statusHex.substring(13, 16), 2);\n general += 'statusDevice:' + statusDevice + ',';\n if (battery_percentage) {\n general += 'battery:' + battery_percentage + ',';\n }\n if (cellNetworkSignal) {\n general += 'cellNetworkSignal:' + cellNetworkSignal + ',';\n }\n if (workMode) {\n general += 'workMode:' + workMode + ',';\n }\n //messageForReceiver = (`CareWatch-CYC;${imei};${i};${event_time};${battery_percentage}`);\n break;\n //Call Records\n case '25':\n //Needed?\n break;\n //BLE Location 2\n case '26':\n //I don't understand\n //messageBody = messageBody + keyLengthHex + key + value;\n break;\n //Smart Location\n case '27':\n location_type = 'SMART';\n var latitudeHex = value.substring(0, 8);\n var longitudeHex = value.substring(8, 16);\n var location_accuracyHex = value.substring(16, 20);\n var altitudeHex = value.substring(20, 24);\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\n var altitude = hexToDecimal(changeEndianness(altitudeHex));\n //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\n //04/08/2022 se quita el multiplicador por 5 pq ya viene el valor en metros\n location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\n //location_time = timestamp;\n smart_data = `${latitude},${longitude},${location_accuracy},${altitude}`;\n general += 'smart location (lat):' + latitude + ', (long):' + longitude + ',';\n break;\n //Beacon Location Added 11/10/22\n case '28':\n location_type = 'BEACON';\n // var alarm = 'EBZI';\n var latitudeHex = '00';\n var longitudeHex = '00';\n var descr = 'empty';\n var flag = hexToDecimal(value.substring(0, 1));\n var beacId = hexToDecimal(value.substring(1, 2));\n // msg includes descrip\n if ((flag & 4) == 4) {\n descr = hexToAscii(value.substring(18, value.length));\n }\n // msg includes lat/lon\n if ((flag & 8) == 8) {\n latitudeHex = value.substring(18, 26);\n longitudeHex = value.substring(26, 34);\n }\n // msg includes lat/lon and description\n if ((flag & 12) == 12) {\n latitudeHex = value.substring(18, 26);\n longitudeHex = value.substring(26, 34);\n descr = hexToAscii(value.substring(34, value.length));\n }\n var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\n // add : format in MAC\n mac = mac.match(/.{1,2}/g).join(':');\n var rssiHex = value.substring(14, 16);\n var rssi1Hex = value.substring(16, 18);\n rssi = hexToDecimalSigned(changeEndianness(rssiHex));\n rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\n // var latitudeHex = value.substring(18, 26);\n // var longitudeHex = value.substring(26, 34);\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\n //location_time = timestamp;\n beacon_data = `${latitude},${longitude},${mac},${descr}`;\n general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (listIndex):' + beacId + ',';\n break;\n // Beacon V2\n case '2C':\n location_type = 'BEACON';\n // var alarm = 'EBZI';\n var latitudeHex = '00';\n var longitudeHex = '00';\n var descr = 'empty';\n var flag = hexToDecimal(value.substring(0, 1));\n var beacId = hexToDecimal(value.substring(1, 2));\n // msg includes descrip\n if ((flag & 4) == 4) {\n let desc_leng = hexToDecimal(value.substring(20, 22));\n descr = hexToAscii(value.substring(22, 22 + (2 * desc_leng)));\n //descr = hexToAscii(value.substring(18, value.length));\n }\n // msg includes lat/lon\n if ((flag & 8) == 8) {\n latitudeHex = value.substring(18, 26);\n longitudeHex = value.substring(26, 34);\n }\n // msg includes lat/lon and description\n if ((flag & 12) == 12) {\n latitudeHex = value.substring(20, 28);\n longitudeHex = value.substring(28, 36);\n let desc_leng = hexToDecimal(value.substring(36, 38));\n descr = hexToAscii(value.substring(38, 38 + (2 * desc_leng)));\n }\n var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\n // add : format in MAC\n mac = mac.match(/.{1,2}/g).join(':');\n var rssiHex = value.substring(14, 16);\n var rssi1Hex = value.substring(16, 18);\n rssi = hexToDecimalSigned(changeEndianness(rssiHex));\n rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\n var battery_beacon = hexToDecimal(value.substring(18, 20));\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\n //location_time = timestamp;\n beacon_data = `${latitude},${longitude},${mac},${descr}`;\n general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (battery):' + battery_beacon + ', (listIndex):' + beacId + ',';\n break;\n //Cell Towers Note\n case '29':\n location_type = 'LBS';\n lbs_data = '';\n var mccHex = changeEndianness(value.substring(0, 4));\n var mncHex = value.substring(4, 6);\n var mcc = hexToDecimal(mccHex);\n lbs_data += mcc + ',';\n var mnc = hexToDecimal(mncHex);\n lbs_data += mnc + ',';\n var indexLbs = 6;\n var numTowers = (hexToDecimal(keyLengthHex) - 4) / 7;\n for (let i = 0; i < numTowers; i++) {\n var rxlHex = changeEndianness(value.substring(indexLbs, indexLbs + 2));\n var rxl = hexToDecimal(rxlHex);\n var lacHex = changeEndianness(value.substring(indexLbs + 2, indexLbs + 6));\n var lac = hexToDecimal(lacHex);\n var cellTowers = hexToDecimal(changeEndianness(value.substring(indexLbs + 6, indexLbs + 14)));\n lbs_data += rxl + ',' + lac + ',' + cellTowers + ',';\n indexLbs += 14;\n }\n lbs_data = lbs_data.slice(0, -1);\n general += lbs_data;\n break;\n case '30':\n //G-sensor.\n //value = hexToAscii(value);\n //if (value != '06') {\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 = (`Watch-${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 //value = hexToAscii(value);\n //if (value != '06') {\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 = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\n sendMessageToLocalhostNoWait(messageForReceiver);\n }\n break;\n //BLE Connected . For Flic button\n case '62':\n location_type = 'BLE';\n //var alarm = 'EBZI'; \n //var latitudeHex = '00';\n //var longitudeHex = '00';\n //var descr = 'empty';\n var flag = hexToDecimal(value.substring(0, 2)); // 0= Disconnected, 1= Connected\n var mac = value.substring(2, 14); // No hace falta darle la vuelta\n // add : format in MAC\n mac = mac.match(/.{1,2}/g).join(':');\n var batLevel = hexToDecimal(value.substring(14, 16)); // 0-100\n //location_time = timestamp;\n ble_data = `${flag},${batLevel},${mac}`;\n general += 'BLE location (State):' + flag + ', (bat):' + batLevel + ', (mac):' + mac + ',';\n break;\n }\n }\n if (alarmCode) {\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};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 = (`Watch;ACK-FIRM;${imei};`);\n sendMessageToLocalhostNoWait(messageForReceiver);\n AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\n //AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\n configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\n //configsToAck.push(configIds.OnDevice.LastDateTimeRead);\n //messageBody = messageBody + keyLengthHex + key + value;\n break;\n case '1A':\n //no ACK need\n var fwVersion = hexToAscii(value);\n imei = serverParams.Imei;\n AddValue(codeValues, \"imei\", imei);\n AddValue(codeValues, \"fwVersion\", fwVersion);\n messageForReceiver = (`Watch;ACK-FIRM;${imei};`);\n sendMessageToLocalhostNoWait(messageForReceiver);\n AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\n //AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\n configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\n //configsToAck.push(configIds.OnDevice.LastDateTimeRead);\n break;\n //IMEI\n case '03':\n var imei = hexToDecimal(value);\n // harcode to avoid conflicts with Rio protocol\n //if ((imei != '860470063029395') && (imei != '860470063035947')) {\n // AddValue(codeValues, \"error\", \"device imei is not in this protocol\");\n // AddValue(codeValues, \"rawFromBytes\", rawFromBytes);\n //AddValue(codeValues, \"IMEI\", imei);\n // return\n //}\n if (serverParams.Imei === undefined || serverParams.Imei === null) {\n sendMessageToLocalhostNoWait(\"Eview-ASSOCIATE;\" + imei + \";\" + serverParams.Guid + \";\");\n //return;\n }\n messageBody = messageBody + keyLengthHex + key + value;\n break;\n //ICCID\n case '04':\n var iccid = hexToDecimal(value);\n messageBody = messageBody + keyLengthHex + key + value;\n break;\n //BLE-MAC\n case '05':\n var bleMac = hexToDecimal(value);\n messageBody = messageBody + keyLengthHex + key + value;\n break;\n //Run Time\n case '07':\n var runTime = hexToDecimal(value);\n messageBody = messageBody + keyLengthHex + key + value;\n break;\n case '10': // Ringer Volume\n var volume = hexToDecimal(value);\n imei = serverParams.Imei;\n messageForReceiver = (`Watch;ACK-VOL;${imei};`);\n sendMessageToLocalhostNoWait(messageForReceiver);\n AddValue(codeValues, \"Volume\", volume);\n AddValue(configsToUpdate, configIds.ReadSystemSettings.Volume, volume);\n configsToAck.push(configIds.ReadSystemSettings.Volume);\n break;\n case '0A': //Performance mode\n //var workMode = hexToDecimal(value);\n //messageBody = messageBody + keyLengthHex + key + value;\n //AddValue(codeValues, \"WorkMode\", workMode);\n //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\n //configsToAck.push(configIds.ReadPerformance`Settings.Mode);\n //var workMode = hexToAscii(value.substring(0, value.length));\n //var workMode = hexToDecimal(value);\n //var workMode = hexToAscii(value.substring(0, value.length));\n var workMode = 1234; // + value + \"end\";\n //var workModeVal = 9;\n //workMode = 'test10';\n imei = serverParams.Imei;\n messageForReceiver = (`Watch;ACK-MODE;${imei};`);\n AddValue(codeValues, \"Mode\", workMode);\n AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\n configsToAck.push(configIds.ReadPerformanceSettings.Mode);\n sendMessageToLocalhostNoWait(messageForReceiver);\n //AddValue(codeValues, \"performanceMode\", performanceMode);\n //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, performanceMode);\n // configsToAck.push(configIds.ReadPerformanceSettings.Mode);\n break;\n case '1B':\n //Decimal o ascii?\n var gsmModule = hexToDecimal(value);\n messageBody = messageBody + keyLengthHex + key + value;\n break;\n case '1F':\n //System Language\n var systemLanguage = hexToAscii(value.substring(0, value.length));\n imei = serverParams.Imei;\n //messageBody = messageBody + keyLengthHex + key + value;\n messageForReceiver = (`Watch;ACK-LANG;${imei};`);\n sendMessageToLocalhostNoWait(messageForReceiver);\n AddValue(codeValues, \"SystemLanguage\", systemLanguage);\n AddValue(configsToUpdate, configIds.ReadSystemSettings.SystemLanguage, systemLanguage);\n configsToAck.push(configIds.ReadSystemSettings.SystemLanguage);\n break;\n case '33': // phone option\n // [Value]:83 0B 00 00 {\"phoneOption\":{\"flag_value\":2947,\"s3\":1,\"s4\":0,\"s5\":1,\"s6\":0,\"callIncoming\":0,\"rings\":3,\"s7\":0,\"toneID\":0,\"s1\":1,\"s2\":1}}\n var statusPhone = hexToBin(value.substring(0, 2)); // To find autoanswer setup\n if (statusPhone.substring(0, 1) == '1') { // 1 Enable\n var auto = 'true';\n } else var auto = 'false';\n statusPhone = hexToBin(value.substring(2, 4)); // To find allow list setup\n if (statusPhone.substring(7, 8) == '1') { // 1 Enable\n allow = 'true';\n } else var allow = 'false';\n //statusPhone = hexToBin(value.substring(0, 2)) + hexToBin(value.substring(2, 4));\n //AddValue(configsToUpdate, configIds.ReadSystemSettings.Statusphone, statusPhone);\n AddValue(configsToUpdate, configIds.ReadSystemSettings.AllowList, allow);\n AddValue(configsToUpdate, configIds.ReadSystemSettings.AutoAnswer, auto);\n //configsToAck.push(configIds.ReadSystemSettings.Statusphone);\n configsToAck.push(configIds.ReadSystemSettings.AllowList);\n configsToAck.push(configIds.ReadSystemSettings.AutoAnswer);\n break;\n case '34': //ContactList with name\n var contactNumber = value.substring(1, 2);\n var telLength = hexToDecimal(value.substring(2, 4));\n var tel = '';\n switch (contactNumber) {\n // Emergency Number\n case '0':\n tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\n AddValue(codeValues, \"EmergencyNumber\", tel);\n AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\n configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\n break;\n // Speed Dial Number\n //case '1':\n // tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\n // AddValue(codeValues, \"SpeedDialNumber\", tel);\n // AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.SpeedDialNumber, tel);\n // configsToAck.push(configIds.ReadSpeedDialSettings.SpeedDialNumber);\n // break;\n // Gateway Number\n case '9': //00447781482635,Esendex UK 0034627177148,Esendex Spain 00447507288240,Esendex UK Acceptance\n tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\n if (tel.includes('447781482635') || tel.includes('00447781482635')) {\n tel = 'Esendex UK'\n } else if (tel.includes('34627177148') || tel.includes('0034627177148')) {\n tel = 'Esendex Spain'\n } else if (tel.includes('447507288240') || tel.includes('00447507288240')) {\n tel = 'Esendex UK Acceptance'\n } else {\n tel = 'Default'\n }\n AddValue(codeValues, \"SMSGateway\", tel);\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\n configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\n break;\n default:\n tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\n if (tel.length < 6) {\n contacts += '';\n AddValue(codeValues, \"ApprovedContacts\", contacts);\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\n break;\n }\n //contacts += 'A' + (contactNumber - 1) + ': ' + tel + ', ';\n contacts += tel + ', ';\n AddValue(codeValues, \"ApprovedContacts\", contacts);\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\n break;\n }\n break;\n case '40': // APN\n //no ACK need\n AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'));\n configsToAck.push(configIds.OnDevice.LastDateTimeRead);\n var apn = hexToAscii(value.substring(0, value.length));\n imei = serverParams.Imei;\n break;\n case '41': // APN Username\n //no ACK need\n //apn = apn + ',' + hexToAscii(value.substring(0, value.length));\n break;\n case '42': // APN Password\n //no ACK need\n //apn = apn + ',' + hexToAscii(value.substring(0, value.length));\n messageForReceiver = (`Watch;ACK-GDATA;${imei};`);\n sendMessageToLocalhostNoWait(messageForReceiver);\n AddValue(codeValues, \"apn\", apn);\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.APN, apn);\n configsToAck.push(configIds.ReadCommunicationSettings.APN);\n break;\n case '43': //Server Details\n //52.232.85.255,5678 production 52.174.17.77,5678 acceptance\n var serverDetails = hexToAscii(value.substring(6, value.length)) + ':' + hexToDecimal(value.substring(4, 6) + value.substring(2, 4));\n if (serverDetails.includes('52.232.85.255:5678')) {\n serverDetails = 'Production'\n } else if (serverDetails.includes('52.174.17.77:5678')) {\n serverDetails = 'Acceptance'\n } else if (serverDetails.includes('52.174.17.77:5778')) {\n serverDetails = 'Protocol-Import'\n } else if (serverDetails.includes('52.174.17.77:5878')) {\n serverDetails = 'Protocol-Dev'\n } else {\n serverDetails = 'Default'\n }\n AddValue(codeValues, \"server\", serverDetails);\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.Server, serverDetails);\n configsToAck.push(configIds.ReadCommunicationSettings.Server);\n break;\n case '44': //time interval - work mode intervals\n imei = serverParams.Imei;\n messageForReceiver = (`Watch;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 = (`Watch;ACK-CUSTID;${imei};`);\n sendMessageToLocalhostNoWait(messageForReceiver);\n AddValue(codeValues, \"customeid\", value);\n AddValue(configsToUpdate, configIds.ReadState.CustomId, hexToAscii(value)); //now it comes \"3036\"\n configsToAck.push(configIds.ReadState.CustomId);\n break;\n case '53': // Non motion alert\n //2B020080\n var status = hexToBin(value.substring(6, 8));\n var alertSetting = '';\n var enableDisable = '';\n if (status.substring(0, 1) == '1') {\n alertSetting = 'Enable, '\n enableDisable = '1';\n } else {\n alertSetting = 'Disable, '\n };\n //if (status.substring(5, 6) == '1') {\n // alertSetting += 'Dial, '\n //} else {\n // alertSetting += 'No Dial, '\n //};\n var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\n alertSetting += time;\n imei = serverParams.Imei;\n messageForReceiver = (`Watch;ACK-NOMOTION;${imei};`);\n sendMessageToLocalhostNoWait(messageForReceiver);\n AddValue(codeValues, \"nomotion\", alertSetting);\n //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings, enableDisable);\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\n //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\n configsToAck.push(configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings);\n configsToAck.push(configIds.ReadNonMovementSettings.Time);\n break;\n case '56': //Fall down sensibility\n // '00001100'\n var fallStatus = hexToBin(value.substring(0, 2));\n var enalbleDisable = '';\n //if (fallStatus.substring(4, 5) == '1') {\n if (fallStatus.substring(0, 1) == '1') {\n var sensibility = 'Enable, '\n enalbleDisable = '1'\n } else {\n var sensibility = 'Disable, '\n };\n if (fallStatus.substring(5, 6) == '1') {\n sensibility += 'Dial, '\n } else {\n sensibility += 'No Dial, '\n };\n var imei = serverParams.Imei;\n messageForReceiver = (`Watch;ACK-FALLALERT;${imei};`);\n sendMessageToLocalhostNoWait(messageForReceiver);\n var sesibityOptionValue = hexToDecimal(value.substring(1, 2));\n sensibility += sesibityOptionValue;\n AddValue(codeValues, \"sensibility\", sensibility);\n //AddValue(configsToUpdate, configIds.ReadAlertSettings.FallSettings, sensibility);\n AddValue(configsToUpdate, configIds.ReadFallSettings.EnableDisableFallSettings, enalbleDisable);\n AddValue(configsToUpdate, configIds.ReadFallSettings.Sensitivity, sesibityOptionValue);\n //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\n configsToAck.push(configIds.ReadFallSettings.EnableDisableFallSettings);\n configsToAck.push(configIds.ReadFallSettings.Sensitivity);\n break;\n case '73': //BeaconList\n var beaconNumber = hexToDecimal(value.substring(1, 2));\n var beaconStatus = hexToBin(value.substring(0, 1));\n beaconStatus = hexToAscii(value.substring(30, value.length));\n //beaconStatus = changeEndianness(value.substring(30, value.length));\n //homeBeacon += 'B' + (beaconNumber + 1) + ': ' + beaconStatus + ', ';\n homeBeacon += beaconStatus + ', ';\n AddValue(codeValues, \"homeBeacon\", homeBeacon);\n messageForReceiver = (`Watch;ACK-GDATA;${imei};`);\n sendMessageToLocalhostNoWait(messageForReceiver);\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\n configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\n break;\n case '4A': //Wifi Network List\n var wifiSSIDLenght = hexToDecimal(value.substring(2, 4));\n var wifiPasswordLenght = hexToDecimal(value.substring(4, 6));\n var wifiIndex = hexToDecimal(value.substring(1, 2));\n //var wifiStatus = hexToDecimal(value.substring(0, 1));\n var wifiStatus = value.substring(0, 1);\n /*var enalbleDisable = wifiSSID = wifiPassword = homeWifi = '';\n /var homeWifi = '';\n if (wifiIndex == '0') { // Only first Wifi of the list\n if (wifiStatus == '8') {\n homeWifi += ' Enable, '\n enalbleDisable = '1';\n } else {\n homeWifi += ' Disable, '\n //enalbleDisable = '0';\n };*/\n if ((wifiStatus == '8') || (wifiStatus == 'C')) { // 8 == ON OR C== ON and Connected\n var wifiSSID = hexToAscii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\n var wifiPassword = hexToAscii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\n var imei = serverParams.Imei;\n messageForReceiver = (`Watch;ACK-WIFI;${imei};`);\n sendMessageToLocalhostNoWait(messageForReceiver);\n //homeWiFi += 'W' + (wifiIndex + 1) + ': ' + wifiSSID + ', ' + wifiPassword + ';';\n homeWiFi += wifiSSID + ', ' + wifiPassword + ';';\n AddValue(codeValues, \"wifi\", homeWiFi);\n AddValue(configsToUpdate, configIds.ReadWiFiList.WiFiList, homeWiFi);\n configsToAck.push(configIds.ReadWiFiList.WiFiList);\n }\n //AddValue(configsToUpdate, configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings, enalbleDisable);\n //AddValue(configsToUpdate, configIds.ReadWiFiSettings.SSID, wifiSSID);\n //AddValue(configsToUpdate, configIds.ReadWiFiSettings.Password, wifiPassword);\n //configsToAck.push(configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings);\n //configsToAck.push(configIds.ReadWiFiSettings.SSID);\n //configsToAck.push(configIds.ReadWiFiSettings.Password);\n break;\n case '21': // Speed Dial Settings\n // [Value]:53 84 {\"call1Button\":{\"mode\":0,\"feedBack\":3,\"task\":2,\"time\":20,\"status\":1}}\n var status = hexToBin(value.substring(2, 4)); //always pass 2 HEXs to this function\n var alertSetting = '';\n var enalbleDisable = '';\n if (status.substring(0, 1) == '1') {\n alertSetting = 'Enable, '\n enalbleDisable = '1'\n } else {\n alertSetting = 'Disable, '\n //enableDisable = '0';\n };\n //var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\n //alertSetting += time;\n imei = serverParams.Imei;\n messageForReceiver = (`Watch;ACK-SPEED;${imei};`);\n sendMessageToLocalhostNoWait(messageForReceiver);\n AddValue(codeValues, \"speed\", alertSetting);\n //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\n AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\n //AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\n //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\n configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\n //configsToAck.push(configIds.ReadNonMovementSettings.Time);\n break;\n }\n }\n }\n if (command == '03') {\n while (index < total_length + 16) {\n var keyLengthHex = message.substring(index, index = index + 2);\n var keyLength = 2 * hexToDecimal(keyLengthHex);\n var key = message.substring(index, index = index + 2);\n var value = message.substring(index, index = index + keyLength - 2);\n debug('key = ' + key);\n debug('value = ' + value);\n switch (key) {\n case '01': // Device ID\n var imei = hexToAscii(value);\n if (serverParams.Imei === undefined || serverParams.Imei === null) {\n sendMessageToLocalhostNoWait(\"Eview-ASSOCIATE;\" + imei + \";\" + serverParams.Guid + \";\");\n //return;\n }\n break;\n //CustomID is not provided so far with command type 03.. commented in the mean time\n /* case '03':\n //update customID to check if belongs to this type of device\n customID = value;\n if (value != '04') {\n AddValue(codeValues, \"error\", \"customID not belongs to this protocol\");\n AddValue(codeValues, \"rawFromBytes\", rawFromBytes);\n AddValue(codeValues, \"customID\", value);\n return\n } else {\n if (serverParams.Imei === undefined || serverParams.Imei === null) {\n sendMessageToLocalhostNoWait(\"Eview-ASSOCIATE;\" + imei + \";\" + serverParams.Guid + \";\");\n }\n AddValue(codeValues, \"customID\", value);\n general += 'customID:' + value + ',';\n break;\n }\n break; */\n case '10': // Heartbeat\n var heartbeat = hexToAscii(value);\n event_time = moment.utc().unix();\n if (index < total_length + 16) {\n var keyLengthHex = message.substring(index, index = index + 2);\n keyLength = 2 * hexToDecimal(keyLengthHex);\n key = message.substring(index, index = index + 2);\n if (key == '24') {\n // debug('key: ' + key) //comment those out\n value = message.substring(index, index = index + keyLength - 2);\n // debug(value)\n var timestampHex = value.substring(0, 8);\n // debug('timestampt hex: ' + timestampHex)\n timestampHex = changeEndianness(timestampHex);\n timestamp = hexToDecimal(timestampHex);\n event_time = timestamp;\n // debug(event_time)\n var statusHex = changeEndianness(value.substring(8, 16));\n // debug(statusHex)\n var statusInt = hexToDecimal(statusHex);\n var statusDevice = '';\n if ((statusInt & 1) == 1) {\n statusDevice += 'GPS,';\n }\n if ((statusInt & 2) == 2) {\n statusDevice += 'WIFISource,';\n }\n if ((statusInt & 4) == 4) {\n statusDevice += 'CellTower,';\n }\n if ((statusInt & 8) == 8) {\n statusDevice += 'BLELocation,';\n }\n if ((statusInt & 16) == 16) {\n statusDevice += 'Charging,';\n }\n if ((statusInt & 32) == 32) {\n statusDevice += 'FUllyCharged,';\n }\n if ((statusInt & 64) == 64) {\n statusDevice += 'Reboot,';\n }\n if ((statusInt & 128) == 128) {\n statusDevice += 'HistoricalData,';\n }\n if ((statusInt & 256) == 256) {\n statusDevice += 'AGPSDataValid,';\n }\n if ((statusInt & 512) == 512) {\n statusDevice += 'Motion,';\n }\n if ((statusInt & 1024) == 1024) {\n statusDevice += 'SmartLocating,';\n }\n if ((statusInt & 2048) == 2048) {\n statusDevice += 'BeaconLocation,';\n }\n if ((statusInt & 4096) == 4096) {\n statusDevice += 'BLEConnected,';\n }\n statusDevice = statusDevice.slice(0, -1);\n // debug('statusHex:' + statusHex)\n statusHex = (statusHex);\n statusHex = hexToBin(statusHex);\n statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\n // debug(statusHex)\n battery_percentage = parseInt(statusHex.substring(0, 8), 2);\n // debug(battery_percentage)\n // debug(battery_percentage)\n // debug(statusHex.substring(8, 13))\n cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\n // debug(cellNetworkSignal)\n workMode = parseInt(statusHex.substring(13, 16), 2);\n // debug(workMode)\n general += 'statusDevice:' + statusDevice + ';';\n if (battery_percentage) {\n general += 'battery:' + battery_percentage + ';';\n }\n if (cellNetworkSignal) {\n general += 'cellNetworkSignal:' + cellNetworkSignal + ';';\n }\n if (workMode) {\n general += 'workMode:' + workMode + ';';\n }\n }\n }\n // revisar\n var gen_location = '0';\n //CustomID is not provided so far with command type 03.. commented in the mean time\n /*if (customID != '04') {\n AddValue(codeValues, \"error\", \"customID not belongs to this protocol\");\n //AddValue(codeValues, \"rawFromBytes\", rawFromBytes);\n AddValue(codeValues, \"customID\", value);\n return\n }*/\n //messageForReceiver = (`Eview-HTB;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};SIGNAL=${cellNetworkSignal};WM=${workMode};SL=${systemLanguage};GENERAL=${general}`);\n messageForReceiver = (`Watch-HTB;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\n sendMessageToLocalhostNoWait(messageForReceiver);\n //messageBody = messageBody + keyLengthHex + key + value;\n break;\n case '12': // Device requesting timestamp\n timestamp = moment.utc().unix();\n timestampHex = decimalToHex(timestamp);\n timestampHex = changeEndianness(timestampHex);\n keyLengthHex = ('00' + decimalToHex(1 + (timestampHex.length) / 2)).slice(-2);\n // respond to device with the timestamp of the server\n messageBody = messageBody + keyLengthHex + key + timestampHex;\n messageForReceiver = `Eview;${imei};${sequenceID};Get timestamp`;\n sendMessageToLocalhostNoWait(messageForReceiver);\n break;\n case '21': //Cell Towers\n var mccHex = value.substring(0, 2);\n var mncHex = value.substring(2, 3);\n var mcc = hexToDecimal(mccHex);\n var mnc = hexToDecimal(mncHex);\n var numTowers = (keyLength - 4) / 5;\n var cellTowers = hexToAscii(value);\n messageBody = messageBody + keyLengthHex + key + value;\n break;\n case '22': // WIFI locations \n location_type = 'WIFI';\n var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\n //location_time = timestamp;\n var wifiTowers = value;\n general += 'wifiTowers:';\n var indexWifi = 0;\n var bssid_array = [];\n gen_location = '';\n for (let i = 0; i < numWifi; i++) {\n gen_location += wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\n indexWifi += 14;\n }\n gen_location = gen_location.slice(0, -1);\n general += gen_location;\n //CustomID is not provided so far with command type 03\n /*if (customID != '04') {\n AddValue(codeValues, \"error\", \"customID not belongs to this protocol\");\n //AddValue(codeValues, \"rawFromBytes\", rawFromBytes);\n AddValue(codeValues, \"customID\", value);\n return\n }*/\n if (alarmCode) {\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};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 = (`Watch-ACK;${imei};${message}`); // ${sequenceID}; add ${sequenceID}; 19-07\n sendMessageToLocalhostNoWait(messageForReceiver);\n var value = message.substring(index, index = index + keyLength - 2);\n if (typeof configIds !== 'undefined' && configIds && configIds.ConfigureDevice && configIds.ConfigureDevice.LastConfigured) { // when is defined\n AddValue(configsToUpdate, configIds.ConfigureDevice.LastConfigured, moment().format('YYYY/MM/DD, HH:mm:ss'));\n configsToAck.push(configIds.ConfigureDevice.LastConfigured);\n }\n //}\n }\n if (command == 'FE') {\n while (index < total_length + 16) {\n var keyLength = message.substring(index, index = index + 2);\n keyLength = 2 * hexToDecimal(keyLength);\n var key = message.substring(index, index = index + 2);\n var value = message.substring(index, index = index + keyLength - 2);\n }\n }\n // prepare the ACK msg and change config if it is needed\n lengthAck = messageBody.length / 2;\n lengthAck = ('0000' + decimalToHex(lengthAck)).slice(-4);\n lengthAck = lengthAck.toString().substring(2, 4) + lengthAck.toString().substring(0, 2);\n ////////////checksum CRC 16\n var checksumAck = byteStringToByteArray(messageBody);\n checksumAck = crc16byte(checksumAck);\n checksumAck = decimalToHex(checksumAck);\n checksumAck = ('0000' + checksumAck).slice(-4);\n checksumAck = checksumAck.toString().substring(2, 4) + checksumAck.toString().substring(0, 2);\n prefix = prefix + lengthAck + checksumAck + sequenceID;\n // To send ACK to the device previous to internal msg with parts\n if (needsAck == true) {\n if (messageBody.length <= 2) {\n ack = 'AB00030008C7' + sequenceID + '7F0100'; // change AB10030008C7 to AB00030008C7\n } else {\n ack = prefix + messageBody;\n }\n AddValue(codeValues, 'imei', imei);\n AddValue(codeValues, 'ack', ack);\n }\n } else { // checksum was invalid - print out useful debug info and bet quess at imei \n AddValue(codeValues, \"error\", \"checksum failed for message\");\n AddValue(codeValues, \"rawFromBytes\", rawFromBytes);\n i = rawFromBytes.search('3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]');\n if (i >= 0) {\n imei = hexToAscii(rawFromBytes.substring(i, i + 30));\n AddValue(codeValues, \"imei\", imei);\n }\n }\n }\n // Auxiliary functions\n function buildDataToReceiver(codeValues, configsToAck = [], configsToUpdate = [], configsToSend = []) {\n const dataToReceiver = {\n values: codeValues\n };\n if (configsToAck.length > 0) {\n dataToReceiver.configsToAck = configsToAck;\n }\n if (configsToUpdate.length > 0) {\n dataToReceiver.configsToUpdate = configsToUpdate;\n }\n if (configsToSend.length > 0) {\n dataToReceiver.configsToSend = configsToSend;\n }\n return dataToReceiver;\n }\n\n function AddValue(codeValueArray, p1, p2) { // push code value pair into array\n var cvpair = {\n code: p1,\n value: p2\n };\n codeValueArray.push(cvpair);\n }\n // convert functions\n function asciiToHex(str) { // ascii to hex \n return [...str].map(char => char.charCodeAt(0).toString(16).padStart(2, '0')).join('');\n }\n\n function byteStringToByteArray(str) { // convierte una cadena hexadecimal en un array de bytes (number[])\n const bytes = [];\n for (let i = 0; i < str.length; i += 2) {\n const byte = parseInt(str.substring(i, i + 2), 16);\n if (!isNaN(byte) && byte >= 0 && byte <= 255) {\n bytes.push(byte);\n }\n }\n return bytes;\n }\n\n function decimalToHex(x) {\n return Number(x).toString(16).toUpperCase();\n }\n\n function hexToBin(hex) { // convierte un valor hexadecimal a su representación binaria, y asegura que tenga al menos 8 bits \n const bin = parseInt(hex, 16).toString(2);\n return bin.padStart(hex.length * 4, '0');\n }\n\n function hexToAscii(hex) {\n if (hex.length % 2 !== 0) {\n throw new Error(\"Hex string length must be even\");\n }\n let ascii = '';\n for (let i = 0; i < hex.length; i += 2) {\n const byte = hex.substr(i, 2);\n const charCode = parseInt(byte, 16);\n if (charCode !== 0) { // remove null character (\\u0000)\n ascii += String.fromCharCode(charCode);\n }\n }\n return ascii;\n //return hex.match(/.{2}/g).map(byte => String.fromCharCode(parseInt(byte, 16))).join('');\n }\n\n function hexToDecimalSigned(hex) { // hex to decimal\n if (hex.length % 2 !== 0) {\n hex = '0' + hex;\n }\n const num = parseInt(hex, 16);\n const bits = hex.length * 4;\n const maxVal = 2 ** bits;\n return num >= maxVal / 2 ? num - maxVal : num;\n }\n\n function hexToDecimal(hex) {\n return parseInt(hex, 16);\n }\n // CheckSum and debug functions\n function changeEndianness(hexString) { // changeEndianness\n if (hexString.length === 0) { //if string is empty or not defined\n return \"\";\n }\n if (hexString.length % 2 !== 0) {\n throw new Error(\"Hex string length must be even\");\n }\n return hexString.match(/.{2}/g) // divide in bytes (2 chars)\n .reverse() // reverse the order\n .join('');\n }\n\n function calculateCheckSum(payloadData) { // calcula el CRC16 sobre una cadena hexadecimal y devuelve el valor con el endianness invertido\n const bytes = byteStringToByteArray(payloadData);\n const crc = crc16byte(bytes);\n const hex = crc.toString(16).padStart(4, '0').toUpperCase();\n return changeEndianness(hex);\n }\n\n function crc16byte(byteArray) { // calcula el CRC-16 sobre un array de bytes usando una tabla precalculada (crcTable)\n let crc = 0x0000;\n for (const byte of byteArray) {\n if (byte < 0 || byte > 255 || !Number.isInteger(byte)) {\n throw new RangeError(\"Invalid byte value in input array\");\n }\n const index = (byte ^ (crc >> 8)) & 0xFF;\n crc = crcTable[index] ^ (crc << 8);\n }\n return crc & 0xFFFF;\n }\n\n function debug(...args) { // write debug info to console log, if localTesting\n if (localTesting) {\n console.debug('[DEBUG]', ...args);\n }\n }\n /*\n function sendMessageToLocalhostNoWait(str) { // sends message to system, closing connection after\n var server;\n if (localTesting) {\n console.log('local testing - sending to protocol-dev server the message ... '); // port 5878\n console.log(str);\n server = '52.174.17.77';\n } else {\n server = '127.0.0.1';\n }\n var c = net.createConnection(5878, server);\n c.on('error', function(error) {\n c = net.createConnection(5878, server);\n });\n c.write(`${str}`);\n c.end();\n }*/\n function sendMessageToLocalhostNoWait(message) {\n const server = localTesting ? '52.174.17.77' : '127.0.0.1';\n //const port = localTesting ? '5878' : ''; //Protocol-dev\n const port = '5678'; //acceptance-dev\n if (localTesting) {\n console.debug('[DEBUG] Sending message to test server:', message);\n }\n const client = net.createConnection(port, server, () => {\n client.write(message);\n client.end();\n });\n client.on('error', (err) => {\n console.error(`[ERROR] Failed to send message to ${server}:${port}:`, err.message);\n });\n client.on('end', () => {\n if (localTesting) {\n console.debug('[DEBUG] Connection closed');\n }\n });\n }\n}\n// params is not defined locally -> export as module\nif (typeof(params) === 'undefined') {\n module.exports = {\n execute_ops\n }\n} else { // on server use local defined vars\n let return_values = execute_ops(moment, msg, net, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\n // define global returns\n msg = return_values;\n}","Type":0,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":437,\"Name\":\"Access TEC Care Watch\",\"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 // Watch protocol - please see variables and typical values in order below\\n // Watch-CYC;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;SIGNAL=<>;WM=<>;GENERAL=<>\\n // Watch-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\n //\\n // Author: Juanmi Navarro\\n // Created: 01/01/0000\\n // Last modified: 20/05/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', 'Watch');\\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 = (`Watch-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 //<>,<>,<> \\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 //<>,<>,<> \\n if (mac2) {\\n AddValue(codeValues, 'beacon_mac', mac2);\\n var simpleQuery2 = [{\\n 'code': 'Mac',\\n 'value': mac2,\\n }];\\n var simpleQueryLabel2 = {\\n 'table': 'beacons',\\n 'select': 'Name',\\n 'query': simpleQuery2\\n };\\n var labels2 = [];\\n labels2.push(JSON.stringify(simpleQueryLabel2));\\n AddValue(codeValues, 'oysta_labels', JSON.stringify(labels2));\\n }\\n if (params.beacon_major) {\\n AddValue(codeValues, 'beacon_major', params.beacon_major);\\n } else {\\n AddValue(codeValues, 'beacon_major', 0);\\n }\\n if (params.beacon_minor) {\\n AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\n } else {\\n AddValue(codeValues, 'beacon_minor', 0);\\n }\\n //AddValue(codeValues,'oysta_labels', label);\\n //AddValue(codeValues,'oysta_value', mac);\\n if (location_time) {\\n AddValue(codeValues, 'location_time', location_time);\\n }\\n }\\n /* meter mas tarde... \\n if (params.smart_data !== 'undefined') {\\n var gen_location = params.smart_data.split(',')\\n var latitude = gen_location[0]\\n var longitude = gen_location[1]\\n var location_accuracy = gen_location[2]\\n var altitude = gen_location[3]\\n AddValue(codeValues,'latitude', latitude);\\n AddValue(codeValues,'longitude', longitude);\\n AddValue(codeValues,'altitude', altitude);\\n AddValue(codeValues,'location_accuracy', location_accuracy);\\n }\\n */\\n /*else if ((params.event_time) && (params.event_time == '')) {\\n var event_time = moment.utc().unix();\\n AddValue(codeValues,'event_time', event_time);\\n } revisar mas adelante*/\\n // to parse SMS info from the device\\n switch (messageTypeLocalCode) {\\n case 'COMM-SMS': // SMS message sent in\\n if (params.data.startsWith('Device location request')) {\\n configsToAck.push(configIds.Controls.RealTimeLocate);\\n } else if (params.data.startsWith('Set IP ok')) {\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\n } else if (params.data.startsWith('IMEI:')) {\\n configsToAck.push(configIds.Controls.GetFirmwareVersion);\\n } else if (params.data.startsWith('Set IP ok')) {\\n configsToAck.push(configIds.Controls.ClearBufferedMessages);\\n } else if (params.data.startsWith('flush ok')) {\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\n } else if (params.data.startsWith('Set Watch-')) {\\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 = (`Watch-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 = (`Watch;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 = (`Watch;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 = (`Watch-RTL;${params.imei};${location_time};${location_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n break;\\n }\\n if (!params.event_time && !event_time) { // if params.event_time undefined - set it to now. \\n var event_time = moment.utc().unix();\\n AddValue(codeValues, 'event_time', event_time);\\n }\\n // if (!params.location_time && !location_time) { // if params.location_time undefined - set it to now. \\n // var location_time = moment.utc().unix();\\n // AddValue(codeValues, 'location_time', location_time);\\n //}\\n }\\n // send data msg to kibana\\n const data = buildDataToReceiver(codeValues, configsToAck, configsToUpdate, configsToSend);\\n console.log(data);\\n return data\\n // end of main operation\\n // define functions used in operation\\n // decode global msg\\n function decoder(str) { // decode rawdata\\n // CARE Decoder\\n AddValue(codeValues, 'Message : ', str);\\n var message = str;\\n // need to check if checksum is correct for possible msg corruption 10/03/23\\n var checksum = message.substring(8, 12);\\n var messageBody = message.substring(16, message.length);\\n debug('message =' + message);\\n debug('checksum =' + checksum);\\n debug('calculateCheckSum =' + calculateCheckSum(messageBody));\\n if (calculateCheckSum(messageBody) == checksum) { // payload is valid\\n debug(\\\"message has valid checksum\\\");\\n var messageBody = command; // update value for the ACK\\n debug('command =' + command);\\n if (command == '01') {\\n while (index < total_length + 16) {\\n // gen_location = '0'; //cambiado 30/09\\n var keyLengthHex = message.substring(index, index = index + 2);\\n var keyLength = 2 * hexToDecimal(keyLengthHex);\\n var key = message.substring(index, index = index + 2);\\n var value = message.substring(index, index = index + keyLength - 2);\\n debug('key = ' + key);\\n debug('value = ' + value);\\n switch (key) {\\n //Device ID\\n case '01':\\n var imei = hexToAscii(value);\\n break;\\n //Alarm code\\n case '02':\\n var alarm = 'CYC';\\n var alarmCode = value.substring(0, 8);\\n alarmCode = changeEndianness(alarmCode);\\n var timestampHex = value.substring(8, 16);\\n timestampHex = changeEndianness(timestampHex);\\n timestamp = hexToDecimal(timestampHex);\\n event_time = timestamp;\\n var alarmCodeInt = hexToDecimal(alarmCode);\\n var alarmCodeExt = value.substring(16, 24);\\n alarmCodeExt = changeEndianness(alarmCodeExt);\\n var alarmCodeExtInt = hexToDecimal(alarmCodeExt);\\n //Extended Alerts\\n // Fall off\\n if ((alarmCodeExtInt & 1) == 1) {\\n var alarm = 'ALF-C';\\n }\\n // Welfare Check-out\\n else if ((alarmCodeExtInt & 2) == 2) {\\n var alarm = 'ALA-C';\\n }\\n // Standard Alerts\\n //Battery low\\n else if ((alarmCodeInt & 1) == 1) {\\n var alarm = 'BATL';\\n }\\n //Overspeed\\n else if ((alarmCodeInt & 2) == 2) {\\n var alarm = 'ALSP';\\n }\\n //Fall\\n else if ((alarmCodeInt & 4) == 4) {\\n var alarm = 'ALF';\\n }\\n //Tilt\\n else if ((alarmCodeInt & 8) == 8) {\\n var alarm = 'Tilt';\\n } else if ((alarmCodeInt & 16) == 16) {\\n if ((alarmCodeInt & 16777216) == 16777216) {\\n var alarm = 'Geo1-IN';\\n } else {\\n var alarm = 'Geo1-OUT';\\n }\\n } else if ((alarmCodeInt & 32) == 32) {\\n if ((alarmCodeInt & 33554432) == 33554432) {\\n var alarm = 'Geo2-IN';\\n } else {\\n var alarm = 'Geo2-OUT';\\n }\\n } else if ((alarmCodeInt & 64) == 64) {\\n if ((alarmCodeInt & 67108864) == 67108864) {\\n var alarm = 'Geo3-IN';\\n } else {\\n var alarm = 'Geo3-OUT';\\n }\\n } else if ((alarmCodeInt & 128) == 128) {\\n if ((alarmCodeInt & 134217728) == 134217728) {\\n var alarm = 'Geo4-IN';\\n } else {\\n var alarm = 'Geo4-OUT';\\n }\\n }\\n //Power Off\\n else if ((alarmCodeInt & 256) == 256) {\\n var alarm = 'PWRF';\\n }\\n //Power On\\n else if ((alarmCodeInt & 512) == 512) {\\n var alarm = 'PWRN';\\n }\\n //Motion\\n else if ((alarmCodeInt & 1024) == 1024) {\\n var alarm = 'ALMOV';\\n }\\n //No Motion\\n else if ((alarmCodeInt & 2048) == 2048) {\\n var alarm = 'ALNM';\\n }\\n //SOS\\n else if ((alarmCodeInt & 4096) == 4096) {\\n var alarm = 'ALSOS';\\n } else if ((alarmCodeInt & 8192) == 8192) {\\n var alarm = 'Side1';\\n } else if ((alarmCodeInt & 16384) == 16384) {\\n var alarm = 'Side2';\\n }\\n //Battery charging\\n else if ((alarmCodeInt & 32768) == 32768) {\\n var alarm = 'BATCN';\\n }\\n //Battery no charging\\n else if ((alarmCodeInt & 65536) == 65536) {\\n var alarm = 'BATCF';\\n }\\n //SOS Ending\\n // Temporary Commented until we know exactly how it works. 22/09/2022\\n else if ((alarmCodeInt & 131072) == 131072) {\\n var alarm = 'SOSEnding';\\n info = 'Alarm Finished';\\n }\\n //Amber Alert EC03 only\\n else if ((alarmCodeInt & 262144) == 262144) {\\n var alarm = 'ALAO';\\n }\\n // welfare Alert check-in ALA-O\\n else if ((alarmCodeInt & 524288) == 524288) {\\n var alarm = 'ALA-O';\\n }\\n // Amber alert Ending ALA-C\\n else if ((alarmCodeInt & 1048576) == 1048576) {\\n var alarm = 'ALA-C';\\n }\\n // Amber alert Ending ALA-C\\n //else if ((alarmCodeInt & 1048576) == 1048576) {\\n // var alarm = 'ALA-C';\\n //}\\n // Fall-Down Alert ending\\n else if ((alarmCodeInt & 2097152) == 2097152) {\\n var alarm = 'ALF-C';\\n }\\n // welfare Alert Ending ALA\\n else if ((alarmCodeInt & 4194304) == 4194304) {\\n var alarm = 'ALA';\\n }\\n // Beacon absent Alert 11/10/22. Need to be added in msg types\\n //else if ((alarmCodeInt & 16777216) == 16777216) {\\n // var alarm = 'BEA';\\n //}\\n general += 'alarm:' + alarm + ',';\\n break;\\n //Custom ID\\n case '03':\\n // in value is customID.... '06' for Watch Care\\n // if ((imei != '860470063029395') && (imei != '860470063035947')) {\\n //update customID to check if belongs to this type of device\\n //value = hexToAscii(value);\\n customID = value;\\n if (value != '3036') {\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n AddValue(codeValues, \\\"customID\\\", value);\\n // exit decoder\\n // const data = buildDataToReceiver(codeValues, configsToAck, configsToUpdate, configsToSend);\\n // console.log(data);\\n return // data\\n } else {\\n if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\n //return;\\n }\\n AddValue(codeValues, \\\"customID\\\", value);\\n general += 'customID:' + value + ',';\\n break;\\n }\\n //Historical Data Completed\\n case '10': // indica q se han terminado de enviar todos los datos historicos.\\n var histData = true;\\n break;\\n //GPS location\\n case '20':\\n location_type = 'GPS';\\n var latitudeHex = value.substring(0, 8);\\n var longitudeHex = value.substring(8, 16);\\n var speedHex = value.substring(16, 20);\\n var directionHex = value.substring(20, 24);\\n var altitudeHex = value.substring(24, 28);\\n var location_accuracyHex = value.substring(28, 32);\\n var mileageHex = value.substring(32, 40);\\n var satellitesHex = value.substring(40, 42);\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n speed = ((hexToDecimal(changeEndianness(speedHex))) / 3.6).toFixed(2); //date 14-02-2023 in m/s\\n var direction = hexToDecimal(changeEndianness(directionHex));\\n var altitude = hexToDecimal(changeEndianness(altitudeHex)); // in meters\\n //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\n // Range: 0.5 to 99.9 \\n location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\n //var mileage = hexToDecimal(changeEndianness(mileageHex)) this is in km/h we need m/s\\n var mileage = hexToDecimal(changeEndianness(mileageHex)); // in meters date 14-02-2023\\n var satellites = hexToDecimal(satellitesHex);\\n // location_time = timestamp;\\n //<>,<>,<>,<>,<>\\n gps_data = `${latitude},${longitude},${location_accuracy},${speed},${direction},${altitude},${satellites},${mileage}`;\\n general += 'gps location (lat):' + latitude + ', (long):' + longitude + ',';\\n break;\\n //WIFI Towers\\n case '22':\\n location_type = 'WIFI';\\n var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\n //location_time = timestamp;\\n var wifiTowers = value;\\n general += 'wifiTowers:';\\n var indexWifi = 0;\\n var bssid_array = [];\\n wifi_data = '';\\n for (let i = 0; i < numWifi; i++) {\\n wifi_data += hexToDecimalSigned(wifiTowers.substring(indexWifi, indexWifi + 2)) + ',' + wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\n indexWifi += 14;\\n }\\n wifi_data = wifi_data.slice(0, -1);\\n general += wifi_data;\\n break;\\n //BLE Location Added 10/10/22\\n case '23':\\n location_type = 'BLE';\\n var mac = value.substring(0, 12);\\n var latitudeHex = value.substring(12, 20);\\n var longitudeHex = value.substring(20, 28);\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n var address = hexToAscii(value.substring(28, value.length));\\n var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\n // add : format in MAC\\n mac = mac.match(/.{1,2}/g).join(':');\\n // location_time = timestamp;\\n ble_data = `${latitude},${longitude},${mac},${address}`;\\n general += 'BLE location (lat):' + latitude + ', (long):' + longitude + ',';\\n break;\\n //General Data , status_data\\n case '24':\\n //var general = 'true'\\n if (customID != '3036') {\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n AddValue(codeValues, \\\"customID\\\", customID);\\n return\\n }\\n if (alarmCode) {\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\n }\\n //else {\\n // messageForReceiver = (`CareWatch-CYC;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};`);\\n //}\\n // reset variables\\n //alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\n var timestampHex = value.substring(0, 8);\\n timestampHex = changeEndianness(timestampHex);\\n timestamp = hexToDecimal(timestampHex);\\n location_time = timestamp;\\n event_time = timestamp;\\n // HardCode to fix possible issue in protocol\\n //event_time = moment.utc().unix();\\n // end of hard code\\n var statusHex = changeEndianness(value.substring(8, 16));\\n var statusInt = hexToDecimal(statusHex);\\n var statusDevice = '';\\n if ((statusInt & 1) == 1) {\\n statusDevice += 'GPS,';\\n }\\n if ((statusInt & 2) == 2) {\\n statusDevice += 'WIFISource,';\\n }\\n if ((statusInt & 4) == 4) {\\n statusDevice += 'CellTower,';\\n }\\n if ((statusInt & 8) == 8) {\\n statusDevice += 'BLELocation,';\\n }\\n //params.BatteryStatus.BatteryStatus = '1';\\n if ((statusInt & 16) == 16) {\\n statusDevice += 'Charging,';\\n // var alarm = 'BATCN';\\n //configs.BatteryStatus.BatteryStatus = '1';\\n /* if (configs.BatteryStatus.BatteryStatus !== '1') {\\n hasConfigs = true;\\n var batteryStatus = '1';\\n var alarm = 'BATCN';\\n let configsToUpdate = [];\\n configsToUpdate.push({\\n 'code': configIds.BatteryStatus.BatteryStatus,\\n 'value': batteryStatus\\n });\\n }*/\\n }\\n if ((statusInt & 32) == 32) {\\n statusDevice += 'FUllyCharged,';\\n //var alarm = 'BATF';\\n // configs.BatteryStatus.BatteryStatus = '3';\\n /* if (configs.BatteryStatus.BatteryStatus !== '3') {\\n hasConfigs = true;\\n var batteryStatus = '3';\\n var alarm = 'BATF';\\n let configsToUpdate = [];\\n configsToUpdate.push({\\n 'code': configIds.BatteryStatus.BatteryStatus,\\n 'value': batteryStatus\\n });\\n }*/\\n }\\n /* if (!((statusInt & 32) == 32) & !((statusInt & 16) == 16)) {\\n statusDevice += 'Not Charging,';\\n var alarm = 'BATCF';\\n //configs.BatteryStatus.BatteryStatus = '2';\\n if (configs.BatteryStatus.BatteryStatus !== '2') {\\n var batteryStatus = '2';\\n var alarm = 'BATCF';\\n let configsToUpdate = [];\\n configsToUpdate.push({\\n 'code': configIds.BatteryStatus.BatteryStatus,\\n 'value': batteryStatus\\n });\\n }\\n }*/\\n if ((statusInt & 64) == 64) {\\n statusDevice += 'Reboot,';\\n }\\n if ((statusInt & 128) == 128) {\\n statusDevice += 'HistoricalData,';\\n }\\n if ((statusInt & 256) == 256) {\\n statusDevice += 'AGPSDataValid,';\\n }\\n if ((statusInt & 512) == 512) {\\n statusDevice += 'Motion,';\\n }\\n if ((statusInt & 1024) == 1024) {\\n statusDevice += 'SmartLocating,';\\n }\\n if ((statusInt & 2048) == 2048) { //isHome\\n statusDevice += 'BeaconLocation,';\\n }\\n if ((statusInt & 4096) == 4096) {\\n statusDevice += 'BLEConnected,';\\n }\\n if ((statusInt & 16384) == 16384) {\\n statusDevice += 'HomeWiFi,';\\n }\\n statusDevice = statusDevice.slice(0, -1);\\n status_data = statusDevice; //to oysta template\\n //statusHex = (statusHex);\\n statusHex = hexToBin(statusHex);\\n statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\n battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\n cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\n workMode = parseInt(statusHex.substring(13, 16), 2);\\n general += 'statusDevice:' + statusDevice + ',';\\n if (battery_percentage) {\\n general += 'battery:' + battery_percentage + ',';\\n }\\n if (cellNetworkSignal) {\\n general += 'cellNetworkSignal:' + cellNetworkSignal + ',';\\n }\\n if (workMode) {\\n general += 'workMode:' + workMode + ',';\\n }\\n //messageForReceiver = (`CareWatch-CYC;${imei};${i};${event_time};${battery_percentage}`);\\n break;\\n //Call Records\\n case '25':\\n //Needed?\\n break;\\n //BLE Location 2\\n case '26':\\n //I don't understand\\n //messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n //Smart Location\\n case '27':\\n location_type = 'SMART';\\n var latitudeHex = value.substring(0, 8);\\n var longitudeHex = value.substring(8, 16);\\n var location_accuracyHex = value.substring(16, 20);\\n var altitudeHex = value.substring(20, 24);\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n var altitude = hexToDecimal(changeEndianness(altitudeHex));\\n //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\n //04/08/2022 se quita el multiplicador por 5 pq ya viene el valor en metros\\n location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\n //location_time = timestamp;\\n smart_data = `${latitude},${longitude},${location_accuracy},${altitude}`;\\n general += 'smart location (lat):' + latitude + ', (long):' + longitude + ',';\\n break;\\n //Beacon Location Added 11/10/22\\n case '28':\\n location_type = 'BEACON';\\n // var alarm = 'EBZI';\\n var latitudeHex = '00';\\n var longitudeHex = '00';\\n var descr = 'empty';\\n var flag = hexToDecimal(value.substring(0, 1));\\n var beacId = hexToDecimal(value.substring(1, 2));\\n // msg includes descrip\\n if ((flag & 4) == 4) {\\n descr = hexToAscii(value.substring(18, value.length));\\n }\\n // msg includes lat/lon\\n if ((flag & 8) == 8) {\\n latitudeHex = value.substring(18, 26);\\n longitudeHex = value.substring(26, 34);\\n }\\n // msg includes lat/lon and description\\n if ((flag & 12) == 12) {\\n latitudeHex = value.substring(18, 26);\\n longitudeHex = value.substring(26, 34);\\n descr = hexToAscii(value.substring(34, value.length));\\n }\\n var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\n // add : format in MAC\\n mac = mac.match(/.{1,2}/g).join(':');\\n var rssiHex = value.substring(14, 16);\\n var rssi1Hex = value.substring(16, 18);\\n rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\n rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\n // var latitudeHex = value.substring(18, 26);\\n // var longitudeHex = value.substring(26, 34);\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n //location_time = timestamp;\\n beacon_data = `${latitude},${longitude},${mac},${descr}`;\\n general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (listIndex):' + beacId + ',';\\n break;\\n // Beacon V2\\n case '2C':\\n location_type = 'BEACON';\\n // var alarm = 'EBZI';\\n var latitudeHex = '00';\\n var longitudeHex = '00';\\n var descr = 'empty';\\n var flag = hexToDecimal(value.substring(0, 1));\\n var beacId = hexToDecimal(value.substring(1, 2));\\n // msg includes descrip\\n if ((flag & 4) == 4) {\\n let desc_leng = hexToDecimal(value.substring(20, 22));\\n descr = hexToAscii(value.substring(22, 22 + (2 * desc_leng)));\\n //descr = hexToAscii(value.substring(18, value.length));\\n }\\n // msg includes lat/lon\\n if ((flag & 8) == 8) {\\n latitudeHex = value.substring(18, 26);\\n longitudeHex = value.substring(26, 34);\\n }\\n // msg includes lat/lon and description\\n if ((flag & 12) == 12) {\\n latitudeHex = value.substring(20, 28);\\n longitudeHex = value.substring(28, 36);\\n let desc_leng = hexToDecimal(value.substring(36, 38));\\n descr = hexToAscii(value.substring(38, 38 + (2 * desc_leng)));\\n }\\n var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\n // add : format in MAC\\n mac = mac.match(/.{1,2}/g).join(':');\\n var rssiHex = value.substring(14, 16);\\n var rssi1Hex = value.substring(16, 18);\\n rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\n rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\n var battery_beacon = hexToDecimal(value.substring(18, 20));\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n //location_time = timestamp;\\n beacon_data = `${latitude},${longitude},${mac},${descr}`;\\n general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (battery):' + battery_beacon + ', (listIndex):' + beacId + ',';\\n break;\\n //Cell Towers Note\\n case '29':\\n location_type = 'LBS';\\n lbs_data = '';\\n var mccHex = changeEndianness(value.substring(0, 4));\\n var mncHex = value.substring(4, 6);\\n var mcc = hexToDecimal(mccHex);\\n lbs_data += mcc + ',';\\n var mnc = hexToDecimal(mncHex);\\n lbs_data += mnc + ',';\\n var indexLbs = 6;\\n var numTowers = (hexToDecimal(keyLengthHex) - 4) / 7;\\n for (let i = 0; i < numTowers; i++) {\\n var rxlHex = changeEndianness(value.substring(indexLbs, indexLbs + 2));\\n var rxl = hexToDecimal(rxlHex);\\n var lacHex = changeEndianness(value.substring(indexLbs + 2, indexLbs + 6));\\n var lac = hexToDecimal(lacHex);\\n var cellTowers = hexToDecimal(changeEndianness(value.substring(indexLbs + 6, indexLbs + 14)));\\n lbs_data += rxl + ',' + lac + ',' + cellTowers + ',';\\n indexLbs += 14;\\n }\\n lbs_data = lbs_data.slice(0, -1);\\n general += lbs_data;\\n break;\\n case '30':\\n //G-sensor.\\n //value = hexToAscii(value);\\n //if (value != '06') {\\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 = (`Watch-${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 //value = hexToAscii(value);\\n //if (value != '06') {\\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 = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n }\\n break;\\n //BLE Connected . For Flic button\\n case '62':\\n location_type = 'BLE';\\n //var alarm = 'EBZI'; \\n //var latitudeHex = '00';\\n //var longitudeHex = '00';\\n //var descr = 'empty';\\n var flag = hexToDecimal(value.substring(0, 2)); // 0= Disconnected, 1= Connected\\n var mac = value.substring(2, 14); // No hace falta darle la vuelta\\n // add : format in MAC\\n mac = mac.match(/.{1,2}/g).join(':');\\n var batLevel = hexToDecimal(value.substring(14, 16)); // 0-100\\n //location_time = timestamp;\\n ble_data = `${flag},${batLevel},${mac}`;\\n general += 'BLE location (State):' + flag + ', (bat):' + batLevel + ', (mac):' + mac + ',';\\n break;\\n }\\n }\\n if (alarmCode) {\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};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 = (`Watch;ACK-FIRM;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\n //AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\n configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\n //configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\n //messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n case '1A':\\n //no ACK need\\n var fwVersion = hexToAscii(value);\\n imei = serverParams.Imei;\\n AddValue(codeValues, \\\"imei\\\", imei);\\n AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\n messageForReceiver = (`Watch;ACK-FIRM;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\n //AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\n configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\n //configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\n break;\\n //IMEI\\n case '03':\\n var imei = hexToDecimal(value);\\n // harcode to avoid conflicts with Rio protocol\\n //if ((imei != '860470063029395') && (imei != '860470063035947')) {\\n // AddValue(codeValues, \\\"error\\\", \\\"device imei is not in this protocol\\\");\\n // AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n //AddValue(codeValues, \\\"IMEI\\\", imei);\\n // return\\n //}\\n if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\n //return;\\n }\\n messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n //ICCID\\n case '04':\\n var iccid = hexToDecimal(value);\\n messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n //BLE-MAC\\n case '05':\\n var bleMac = hexToDecimal(value);\\n messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n //Run Time\\n case '07':\\n var runTime = hexToDecimal(value);\\n messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n case '10': // Ringer Volume\\n var volume = hexToDecimal(value);\\n imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-VOL;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"Volume\\\", volume);\\n AddValue(configsToUpdate, configIds.ReadSystemSettings.Volume, volume);\\n configsToAck.push(configIds.ReadSystemSettings.Volume);\\n break;\\n case '0A': //Performance mode\\n //var workMode = hexToDecimal(value);\\n //messageBody = messageBody + keyLengthHex + key + value;\\n //AddValue(codeValues, \\\"WorkMode\\\", workMode);\\n //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\n //configsToAck.push(configIds.ReadPerformance`Settings.Mode);\\n //var workMode = hexToAscii(value.substring(0, value.length));\\n //var workMode = hexToDecimal(value);\\n //var workMode = hexToAscii(value.substring(0, value.length));\\n var workMode = 1234; // + value + \\\"end\\\";\\n //var workModeVal = 9;\\n //workMode = 'test10';\\n imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-MODE;${imei};`);\\n AddValue(codeValues, \\\"Mode\\\", workMode);\\n AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\n configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n //AddValue(codeValues, \\\"performanceMode\\\", performanceMode);\\n //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, performanceMode);\\n // configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\n break;\\n case '1B':\\n //Decimal o ascii?\\n var gsmModule = hexToDecimal(value);\\n messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n case '1F':\\n //System Language\\n var systemLanguage = hexToAscii(value.substring(0, value.length));\\n imei = serverParams.Imei;\\n //messageBody = messageBody + keyLengthHex + key + value;\\n messageForReceiver = (`Watch;ACK-LANG;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"SystemLanguage\\\", systemLanguage);\\n AddValue(configsToUpdate, configIds.ReadSystemSettings.SystemLanguage, systemLanguage);\\n configsToAck.push(configIds.ReadSystemSettings.SystemLanguage);\\n break;\\n case '33': // phone option\\n // [Value]:83 0B 00 00 {\\\"phoneOption\\\":{\\\"flag_value\\\":2947,\\\"s3\\\":1,\\\"s4\\\":0,\\\"s5\\\":1,\\\"s6\\\":0,\\\"callIncoming\\\":0,\\\"rings\\\":3,\\\"s7\\\":0,\\\"toneID\\\":0,\\\"s1\\\":1,\\\"s2\\\":1}}\\n var statusPhone = hexToBin(value.substring(0, 2)); // To find autoanswer setup\\n if (statusPhone.substring(0, 1) == '1') { // 1 Enable\\n var auto = 'true';\\n } else var auto = 'false';\\n statusPhone = hexToBin(value.substring(2, 4)); // To find allow list setup\\n if (statusPhone.substring(7, 8) == '1') { // 1 Enable\\n allow = 'true';\\n } else var allow = 'false';\\n //statusPhone = hexToBin(value.substring(0, 2)) + hexToBin(value.substring(2, 4));\\n //AddValue(configsToUpdate, configIds.ReadSystemSettings.Statusphone, statusPhone);\\n AddValue(configsToUpdate, configIds.ReadSystemSettings.AllowList, allow);\\n AddValue(configsToUpdate, configIds.ReadSystemSettings.AutoAnswer, auto);\\n //configsToAck.push(configIds.ReadSystemSettings.Statusphone);\\n configsToAck.push(configIds.ReadSystemSettings.AllowList);\\n configsToAck.push(configIds.ReadSystemSettings.AutoAnswer);\\n break;\\n case '34': //ContactList with name\\n var contactNumber = value.substring(1, 2);\\n var telLength = hexToDecimal(value.substring(2, 4));\\n var tel = '';\\n switch (contactNumber) {\\n // Emergency Number\\n case '0':\\n tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\n AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\n AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\n configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\n break;\\n // Speed Dial Number\\n //case '1':\\n // tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\n // AddValue(codeValues, \\\"SpeedDialNumber\\\", tel);\\n // AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.SpeedDialNumber, tel);\\n // configsToAck.push(configIds.ReadSpeedDialSettings.SpeedDialNumber);\\n // break;\\n // Gateway Number\\n case '9': //00447781482635,Esendex UK 0034627177148,Esendex Spain 00447507288240,Esendex UK Acceptance\\n tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\n if (tel.includes('447781482635') || tel.includes('00447781482635')) {\\n tel = 'Esendex UK'\\n } else if (tel.includes('34627177148') || tel.includes('0034627177148')) {\\n tel = 'Esendex Spain'\\n } else if (tel.includes('447507288240') || tel.includes('00447507288240')) {\\n tel = 'Esendex UK Acceptance'\\n } else {\\n tel = 'Default'\\n }\\n AddValue(codeValues, \\\"SMSGateway\\\", tel);\\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\n configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\n break;\\n default:\\n tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\n if (tel.length < 6) {\\n contacts += '';\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\n break;\\n }\\n //contacts += 'A' + (contactNumber - 1) + ': ' + tel + ', ';\\n contacts += tel + ', ';\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\n break;\\n }\\n break;\\n case '40': // APN\\n //no ACK need\\n AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'));\\n configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\n var apn = hexToAscii(value.substring(0, value.length));\\n imei = serverParams.Imei;\\n break;\\n case '41': // APN Username\\n //no ACK need\\n //apn = apn + ',' + hexToAscii(value.substring(0, value.length));\\n break;\\n case '42': // APN Password\\n //no ACK need\\n //apn = apn + ',' + hexToAscii(value.substring(0, value.length));\\n messageForReceiver = (`Watch;ACK-GDATA;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"apn\\\", apn);\\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.APN, apn);\\n configsToAck.push(configIds.ReadCommunicationSettings.APN);\\n break;\\n case '43': //Server Details\\n //52.232.85.255,5678 production 52.174.17.77,5678 acceptance\\n var serverDetails = hexToAscii(value.substring(6, value.length)) + ':' + hexToDecimal(value.substring(4, 6) + value.substring(2, 4));\\n if (serverDetails.includes('52.232.85.255:5678')) {\\n serverDetails = 'Production'\\n } else if (serverDetails.includes('52.174.17.77:5678')) {\\n serverDetails = 'Acceptance'\\n } else if (serverDetails.includes('52.174.17.77:5778')) {\\n serverDetails = 'Protocol-Import'\\n } else if (serverDetails.includes('52.174.17.77:5878')) {\\n serverDetails = 'Protocol-Dev'\\n } else {\\n serverDetails = 'Default'\\n }\\n AddValue(codeValues, \\\"server\\\", serverDetails);\\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.Server, serverDetails);\\n configsToAck.push(configIds.ReadCommunicationSettings.Server);\\n break;\\n case '44': //time interval - work mode intervals\\n imei = serverParams.Imei;\\n messageForReceiver = (`Watch;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 = (`Watch;ACK-CUSTID;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"customeid\\\", value);\\n AddValue(configsToUpdate, configIds.ReadState.CustomId, hexToAscii(value)); //now it comes \\\"3036\\\"\\n configsToAck.push(configIds.ReadState.CustomId);\\n break;\\n case '53': // Non motion alert\\n //2B020080\\n var status = hexToBin(value.substring(6, 8));\\n var alertSetting = '';\\n var enableDisable = '';\\n if (status.substring(0, 1) == '1') {\\n alertSetting = 'Enable, '\\n enableDisable = '1';\\n } else {\\n alertSetting = 'Disable, '\\n };\\n //if (status.substring(5, 6) == '1') {\\n // alertSetting += 'Dial, '\\n //} else {\\n // alertSetting += 'No Dial, '\\n //};\\n var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\n alertSetting += time;\\n imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-NOMOTION;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"nomotion\\\", alertSetting);\\n //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings, enableDisable);\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\n //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\n configsToAck.push(configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings);\\n configsToAck.push(configIds.ReadNonMovementSettings.Time);\\n break;\\n case '56': //Fall down sensibility\\n // '00001100'\\n var fallStatus = hexToBin(value.substring(0, 2));\\n var enalbleDisable = '';\\n //if (fallStatus.substring(4, 5) == '1') {\\n if (fallStatus.substring(0, 1) == '1') {\\n var sensibility = 'Enable, '\\n enalbleDisable = '1'\\n } else {\\n var sensibility = 'Disable, '\\n };\\n if (fallStatus.substring(5, 6) == '1') {\\n sensibility += 'Dial, '\\n } else {\\n sensibility += 'No Dial, '\\n };\\n var imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-FALLALERT;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n var sesibityOptionValue = hexToDecimal(value.substring(1, 2));\\n sensibility += sesibityOptionValue;\\n AddValue(codeValues, \\\"sensibility\\\", sensibility);\\n //AddValue(configsToUpdate, configIds.ReadAlertSettings.FallSettings, sensibility);\\n AddValue(configsToUpdate, configIds.ReadFallSettings.EnableDisableFallSettings, enalbleDisable);\\n AddValue(configsToUpdate, configIds.ReadFallSettings.Sensitivity, sesibityOptionValue);\\n //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\n configsToAck.push(configIds.ReadFallSettings.EnableDisableFallSettings);\\n configsToAck.push(configIds.ReadFallSettings.Sensitivity);\\n break;\\n case '73': //BeaconList\\n var beaconNumber = hexToDecimal(value.substring(1, 2));\\n var beaconStatus = hexToBin(value.substring(0, 1));\\n beaconStatus = hexToAscii(value.substring(30, value.length));\\n //beaconStatus = changeEndianness(value.substring(30, value.length));\\n //homeBeacon += 'B' + (beaconNumber + 1) + ': ' + beaconStatus + ', ';\\n homeBeacon += beaconStatus + ', ';\\n AddValue(codeValues, \\\"homeBeacon\\\", homeBeacon);\\n messageForReceiver = (`Watch;ACK-GDATA;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\n configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\n break;\\n case '4A': //Wifi Network List\\n var wifiSSIDLenght = hexToDecimal(value.substring(2, 4));\\n var wifiPasswordLenght = hexToDecimal(value.substring(4, 6));\\n var wifiIndex = hexToDecimal(value.substring(1, 2));\\n //var wifiStatus = hexToDecimal(value.substring(0, 1));\\n var wifiStatus = value.substring(0, 1);\\n /*var enalbleDisable = wifiSSID = wifiPassword = homeWifi = '';\\n /var homeWifi = '';\\n if (wifiIndex == '0') { // Only first Wifi of the list\\n if (wifiStatus == '8') {\\n homeWifi += ' Enable, '\\n enalbleDisable = '1';\\n } else {\\n homeWifi += ' Disable, '\\n //enalbleDisable = '0';\\n };*/\\n if ((wifiStatus == '8') || (wifiStatus == 'C')) { // 8 == ON OR C== ON and Connected\\n var wifiSSID = hexToAscii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\n var wifiPassword = hexToAscii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\n var imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-WIFI;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n //homeWiFi += 'W' + (wifiIndex + 1) + ': ' + wifiSSID + ', ' + wifiPassword + ';';\\n homeWiFi += wifiSSID + ', ' + wifiPassword + ';';\\n AddValue(codeValues, \\\"wifi\\\", homeWiFi);\\n AddValue(configsToUpdate, configIds.ReadWiFiList.WiFiList, homeWiFi);\\n configsToAck.push(configIds.ReadWiFiList.WiFiList);\\n }\\n //AddValue(configsToUpdate, configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings, enalbleDisable);\\n //AddValue(configsToUpdate, configIds.ReadWiFiSettings.SSID, wifiSSID);\\n //AddValue(configsToUpdate, configIds.ReadWiFiSettings.Password, wifiPassword);\\n //configsToAck.push(configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings);\\n //configsToAck.push(configIds.ReadWiFiSettings.SSID);\\n //configsToAck.push(configIds.ReadWiFiSettings.Password);\\n break;\\n case '21': // Speed Dial Settings\\n // [Value]:53 84 {\\\"call1Button\\\":{\\\"mode\\\":0,\\\"feedBack\\\":3,\\\"task\\\":2,\\\"time\\\":20,\\\"status\\\":1}}\\n var status = hexToBin(value.substring(2, 4)); //always pass 2 HEXs to this function\\n var alertSetting = '';\\n var enalbleDisable = '';\\n if (status.substring(0, 1) == '1') {\\n alertSetting = 'Enable, '\\n enalbleDisable = '1'\\n } else {\\n alertSetting = 'Disable, '\\n //enableDisable = '0';\\n };\\n //var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\n //alertSetting += time;\\n imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-SPEED;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"speed\\\", alertSetting);\\n //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\n AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\n //AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\n //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\n configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\n //configsToAck.push(configIds.ReadNonMovementSettings.Time);\\n break;\\n }\\n }\\n }\\n if (command == '03') {\\n while (index < total_length + 16) {\\n var keyLengthHex = message.substring(index, index = index + 2);\\n var keyLength = 2 * hexToDecimal(keyLengthHex);\\n var key = message.substring(index, index = index + 2);\\n var value = message.substring(index, index = index + keyLength - 2);\\n debug('key = ' + key);\\n debug('value = ' + value);\\n switch (key) {\\n case '01': // Device ID\\n var imei = hexToAscii(value);\\n if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\n //return;\\n }\\n break;\\n //CustomID is not provided so far with command type 03.. commented in the mean time\\n /* case '03':\\n //update customID to check if belongs to this type of device\\n customID = value;\\n if (value != '04') {\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n AddValue(codeValues, \\\"customID\\\", value);\\n return\\n } else {\\n if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\n }\\n AddValue(codeValues, \\\"customID\\\", value);\\n general += 'customID:' + value + ',';\\n break;\\n }\\n break; */\\n case '10': // Heartbeat\\n var heartbeat = hexToAscii(value);\\n event_time = moment.utc().unix();\\n if (index < total_length + 16) {\\n var keyLengthHex = message.substring(index, index = index + 2);\\n keyLength = 2 * hexToDecimal(keyLengthHex);\\n key = message.substring(index, index = index + 2);\\n if (key == '24') {\\n // debug('key: ' + key) //comment those out\\n value = message.substring(index, index = index + keyLength - 2);\\n // debug(value)\\n var timestampHex = value.substring(0, 8);\\n // debug('timestampt hex: ' + timestampHex)\\n timestampHex = changeEndianness(timestampHex);\\n timestamp = hexToDecimal(timestampHex);\\n event_time = timestamp;\\n // debug(event_time)\\n var statusHex = changeEndianness(value.substring(8, 16));\\n // debug(statusHex)\\n var statusInt = hexToDecimal(statusHex);\\n var statusDevice = '';\\n if ((statusInt & 1) == 1) {\\n statusDevice += 'GPS,';\\n }\\n if ((statusInt & 2) == 2) {\\n statusDevice += 'WIFISource,';\\n }\\n if ((statusInt & 4) == 4) {\\n statusDevice += 'CellTower,';\\n }\\n if ((statusInt & 8) == 8) {\\n statusDevice += 'BLELocation,';\\n }\\n if ((statusInt & 16) == 16) {\\n statusDevice += 'Charging,';\\n }\\n if ((statusInt & 32) == 32) {\\n statusDevice += 'FUllyCharged,';\\n }\\n if ((statusInt & 64) == 64) {\\n statusDevice += 'Reboot,';\\n }\\n if ((statusInt & 128) == 128) {\\n statusDevice += 'HistoricalData,';\\n }\\n if ((statusInt & 256) == 256) {\\n statusDevice += 'AGPSDataValid,';\\n }\\n if ((statusInt & 512) == 512) {\\n statusDevice += 'Motion,';\\n }\\n if ((statusInt & 1024) == 1024) {\\n statusDevice += 'SmartLocating,';\\n }\\n if ((statusInt & 2048) == 2048) {\\n statusDevice += 'BeaconLocation,';\\n }\\n if ((statusInt & 4096) == 4096) {\\n statusDevice += 'BLEConnected,';\\n }\\n statusDevice = statusDevice.slice(0, -1);\\n // debug('statusHex:' + statusHex)\\n statusHex = (statusHex);\\n statusHex = hexToBin(statusHex);\\n statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\n // debug(statusHex)\\n battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\n // debug(battery_percentage)\\n // debug(battery_percentage)\\n // debug(statusHex.substring(8, 13))\\n cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\n // debug(cellNetworkSignal)\\n workMode = parseInt(statusHex.substring(13, 16), 2);\\n // debug(workMode)\\n general += 'statusDevice:' + statusDevice + ';';\\n if (battery_percentage) {\\n general += 'battery:' + battery_percentage + ';';\\n }\\n if (cellNetworkSignal) {\\n general += 'cellNetworkSignal:' + cellNetworkSignal + ';';\\n }\\n if (workMode) {\\n general += 'workMode:' + workMode + ';';\\n }\\n }\\n }\\n // revisar\\n var gen_location = '0';\\n //CustomID is not provided so far with command type 03.. commented in the mean time\\n /*if (customID != '04') {\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n AddValue(codeValues, \\\"customID\\\", value);\\n return\\n }*/\\n //messageForReceiver = (`Eview-HTB;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};SIGNAL=${cellNetworkSignal};WM=${workMode};SL=${systemLanguage};GENERAL=${general}`);\\n messageForReceiver = (`Watch-HTB;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n //messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n case '12': // Device requesting timestamp\\n timestamp = moment.utc().unix();\\n timestampHex = decimalToHex(timestamp);\\n timestampHex = changeEndianness(timestampHex);\\n keyLengthHex = ('00' + decimalToHex(1 + (timestampHex.length) / 2)).slice(-2);\\n // respond to device with the timestamp of the server\\n messageBody = messageBody + keyLengthHex + key + timestampHex;\\n messageForReceiver = `Eview;${imei};${sequenceID};Get timestamp`;\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n break;\\n case '21': //Cell Towers\\n var mccHex = value.substring(0, 2);\\n var mncHex = value.substring(2, 3);\\n var mcc = hexToDecimal(mccHex);\\n var mnc = hexToDecimal(mncHex);\\n var numTowers = (keyLength - 4) / 5;\\n var cellTowers = hexToAscii(value);\\n messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n case '22': // WIFI locations \\n location_type = 'WIFI';\\n var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\n //location_time = timestamp;\\n var wifiTowers = value;\\n general += 'wifiTowers:';\\n var indexWifi = 0;\\n var bssid_array = [];\\n gen_location = '';\\n for (let i = 0; i < numWifi; i++) {\\n gen_location += wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\n indexWifi += 14;\\n }\\n gen_location = gen_location.slice(0, -1);\\n general += gen_location;\\n //CustomID is not provided so far with command type 03\\n /*if (customID != '04') {\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n AddValue(codeValues, \\\"customID\\\", value);\\n return\\n }*/\\n if (alarmCode) {\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};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 = (`Watch-ACK;${imei};${message}`); // ${sequenceID}; add ${sequenceID}; 19-07\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n var value = message.substring(index, index = index + keyLength - 2);\\n if (typeof configIds !== 'undefined' && configIds && configIds.ConfigureDevice && configIds.ConfigureDevice.LastConfigured) { // when is defined\\n AddValue(configsToUpdate, configIds.ConfigureDevice.LastConfigured, moment().format('YYYY/MM/DD, HH:mm:ss'));\\n configsToAck.push(configIds.ConfigureDevice.LastConfigured);\\n }\\n //}\\n }\\n if (command == 'FE') {\\n while (index < total_length + 16) {\\n var keyLength = message.substring(index, index = index + 2);\\n keyLength = 2 * hexToDecimal(keyLength);\\n var key = message.substring(index, index = index + 2);\\n var value = message.substring(index, index = index + keyLength - 2);\\n }\\n }\\n // prepare the ACK msg and change config if it is needed\\n lengthAck = messageBody.length / 2;\\n lengthAck = ('0000' + decimalToHex(lengthAck)).slice(-4);\\n lengthAck = lengthAck.toString().substring(2, 4) + lengthAck.toString().substring(0, 2);\\n ////////////checksum CRC 16\\n var checksumAck = byteStringToByteArray(messageBody);\\n checksumAck = crc16byte(checksumAck);\\n checksumAck = decimalToHex(checksumAck);\\n checksumAck = ('0000' + checksumAck).slice(-4);\\n checksumAck = checksumAck.toString().substring(2, 4) + checksumAck.toString().substring(0, 2);\\n prefix = prefix + lengthAck + checksumAck + sequenceID;\\n // To send ACK to the device previous to internal msg with parts\\n if (needsAck == true) {\\n if (messageBody.length <= 2) {\\n ack = 'AB00030008C7' + sequenceID + '7F0100'; // change AB10030008C7 to AB00030008C7\\n } else {\\n ack = prefix + messageBody;\\n }\\n AddValue(codeValues, 'imei', imei);\\n AddValue(codeValues, 'ack', ack);\\n }\\n } else { // checksum was invalid - print out useful debug info and bet quess at imei \\n AddValue(codeValues, \\\"error\\\", \\\"checksum failed for message\\\");\\n AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n i = rawFromBytes.search('3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]');\\n if (i >= 0) {\\n imei = hexToAscii(rawFromBytes.substring(i, i + 30));\\n AddValue(codeValues, \\\"imei\\\", imei);\\n }\\n }\\n }\\n // Auxiliary functions\\n function buildDataToReceiver(codeValues, configsToAck = [], configsToUpdate = [], configsToSend = []) {\\n const dataToReceiver = {\\n values: codeValues\\n };\\n if (configsToAck.length > 0) {\\n dataToReceiver.configsToAck = configsToAck;\\n }\\n if (configsToUpdate.length > 0) {\\n dataToReceiver.configsToUpdate = configsToUpdate;\\n }\\n if (configsToSend.length > 0) {\\n dataToReceiver.configsToSend = configsToSend;\\n }\\n return dataToReceiver;\\n }\\n\\n function AddValue(codeValueArray, p1, p2) { // push code value pair into array\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n codeValueArray.push(cvpair);\\n }\\n // convert functions\\n function asciiToHex(str) { // ascii to hex \\n return [...str].map(char => char.charCodeAt(0).toString(16).padStart(2, '0')).join('');\\n }\\n\\n function byteStringToByteArray(str) { // convierte una cadena hexadecimal en un array de bytes (number[])\\n const bytes = [];\\n for (let i = 0; i < str.length; i += 2) {\\n const byte = parseInt(str.substring(i, i + 2), 16);\\n if (!isNaN(byte) && byte >= 0 && byte <= 255) {\\n bytes.push(byte);\\n }\\n }\\n return bytes;\\n }\\n\\n function decimalToHex(x) {\\n return Number(x).toString(16).toUpperCase();\\n }\\n\\n function hexToBin(hex) { // convierte un valor hexadecimal a su representación binaria, y asegura que tenga al menos 8 bits \\n const bin = parseInt(hex, 16).toString(2);\\n return bin.padStart(hex.length * 4, '0');\\n }\\n\\n function hexToAscii(hex) {\\n if (hex.length % 2 !== 0) {\\n throw new Error(\\\"Hex string length must be even\\\");\\n }\\n let ascii = '';\\n for (let i = 0; i < hex.length; i += 2) {\\n const byte = hex.substr(i, 2);\\n const charCode = parseInt(byte, 16);\\n if (charCode !== 0) { // remove null character (\\\\u0000)\\n ascii += String.fromCharCode(charCode);\\n }\\n }\\n return ascii;\\n //return hex.match(/.{2}/g).map(byte => String.fromCharCode(parseInt(byte, 16))).join('');\\n }\\n\\n function hexToDecimalSigned(hex) { // hex to decimal\\n if (hex.length % 2 !== 0) {\\n hex = '0' + hex;\\n }\\n const num = parseInt(hex, 16);\\n const bits = hex.length * 4;\\n const maxVal = 2 ** bits;\\n return num >= maxVal / 2 ? num - maxVal : num;\\n }\\n\\n function hexToDecimal(hex) {\\n return parseInt(hex, 16);\\n }\\n // CheckSum and debug functions\\n function changeEndianness(hexString) { // changeEndianness\\n if (hexString.length === 0) { //if string is empty or not defined\\n return \\\"\\\";\\n }\\n if (hexString.length % 2 !== 0) {\\n throw new Error(\\\"Hex string length must be even\\\");\\n }\\n return hexString.match(/.{2}/g) // divide in bytes (2 chars)\\n .reverse() // reverse the order\\n .join('');\\n }\\n\\n function calculateCheckSum(payloadData) { // calcula el CRC16 sobre una cadena hexadecimal y devuelve el valor con el endianness invertido\\n const bytes = byteStringToByteArray(payloadData);\\n const crc = crc16byte(bytes);\\n const hex = crc.toString(16).padStart(4, '0').toUpperCase();\\n return changeEndianness(hex);\\n }\\n\\n function crc16byte(byteArray) { // calcula el CRC-16 sobre un array de bytes usando una tabla precalculada (crcTable)\\n let crc = 0x0000;\\n for (const byte of byteArray) {\\n if (byte < 0 || byte > 255 || !Number.isInteger(byte)) {\\n throw new RangeError(\\\"Invalid byte value in input array\\\");\\n }\\n const index = (byte ^ (crc >> 8)) & 0xFF;\\n crc = crcTable[index] ^ (crc << 8);\\n }\\n return crc & 0xFFFF;\\n }\\n\\n function debug(...args) { // write debug info to console log, if localTesting\\n if (localTesting) {\\n console.debug('[DEBUG]', ...args);\\n }\\n }\\n /*\\n function sendMessageToLocalhostNoWait(str) { // sends message to system, closing connection after\\n var server;\\n if (localTesting) {\\n console.log('local testing - sending to protocol-dev server the message ... '); // port 5878\\n console.log(str);\\n server = '52.174.17.77';\\n } else {\\n server = '127.0.0.1';\\n }\\n var c = net.createConnection(5878, server);\\n c.on('error', function(error) {\\n c = net.createConnection(5878, server);\\n });\\n c.write(`${str}`);\\n c.end();\\n }*/\\n function sendMessageToLocalhostNoWait(message) {\\n const server = localTesting ? '52.174.17.77' : '127.0.0.1';\\n //const port = localTesting ? '5878' : ''; //Protocol-dev\\n const port = '5678'; //acceptance-dev\\n if (localTesting) {\\n console.debug('[DEBUG] Sending message to test server:', message);\\n }\\n const client = net.createConnection(port, server, () => {\\n client.write(message);\\n client.end();\\n });\\n client.on('error', (err) => {\\n console.error(`[ERROR] Failed to send message to ${server}:${port}:`, err.message);\\n });\\n client.on('end', () => {\\n if (localTesting) {\\n console.debug('[DEBUG] Connection closed');\\n }\\n });\\n }\\n}\\n// params is not defined locally -> export as module\\nif (typeof(params) === 'undefined') {\\n module.exports = {\\n execute_ops\\n }\\n} else { // on server use local defined vars\\n let return_values = execute_ops(moment, msg, net, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\n // define global returns\\n msg = return_values;\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1748968518},{"Type":1,"NewValue":"{\"Id\":437,\"Name\":\"Access TEC Care Watch\",\"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 // Watch protocol - please see variables and typical values in order below\\n // Watch-CYC;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;SIGNAL=<>;WM=<>;GENERAL=<>\\n // Watch-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\n //\\n // Author: Juanmi Navarro\\n // Created: 01/01/0000\\n // Last modified: 20/05/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', 'Watch');\\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 = (`Watch-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 //<>,<>,<> \\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 //<>,<>,<> \\n if (mac2) {\\n AddValue(codeValues, 'beacon_mac', mac2);\\n var simpleQuery2 = [{\\n 'code': 'Mac',\\n 'value': mac2,\\n }];\\n var simpleQueryLabel2 = {\\n 'table': 'beacons',\\n 'select': 'Name',\\n 'query': simpleQuery2\\n };\\n var labels2 = [];\\n labels2.push(JSON.stringify(simpleQueryLabel2));\\n AddValue(codeValues, 'oysta_labels', JSON.stringify(labels2));\\n }\\n if (params.beacon_major) {\\n AddValue(codeValues, 'beacon_major', params.beacon_major);\\n } else {\\n AddValue(codeValues, 'beacon_major', 0);\\n }\\n if (params.beacon_minor) {\\n AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\n } else {\\n AddValue(codeValues, 'beacon_minor', 0);\\n }\\n //AddValue(codeValues,'oysta_labels', label);\\n //AddValue(codeValues,'oysta_value', mac);\\n if (location_time) {\\n AddValue(codeValues, 'location_time', location_time);\\n }\\n }\\n /* meter mas tarde... \\n if (params.smart_data !== 'undefined') {\\n var gen_location = params.smart_data.split(',')\\n var latitude = gen_location[0]\\n var longitude = gen_location[1]\\n var location_accuracy = gen_location[2]\\n var altitude = gen_location[3]\\n AddValue(codeValues,'latitude', latitude);\\n AddValue(codeValues,'longitude', longitude);\\n AddValue(codeValues,'altitude', altitude);\\n AddValue(codeValues,'location_accuracy', location_accuracy);\\n }\\n */\\n /*else if ((params.event_time) && (params.event_time == '')) {\\n var event_time = moment.utc().unix();\\n AddValue(codeValues,'event_time', event_time);\\n } revisar mas adelante*/\\n // to parse SMS info from the device\\n switch (messageTypeLocalCode) {\\n case 'COMM-SMS': // SMS message sent in\\n if (params.data.startsWith('Device location request')) {\\n configsToAck.push(configIds.Controls.RealTimeLocate);\\n } else if (params.data.startsWith('Set IP ok')) {\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\n } else if (params.data.startsWith('IMEI:')) {\\n configsToAck.push(configIds.Controls.GetFirmwareVersion);\\n } else if (params.data.startsWith('Set IP ok')) {\\n configsToAck.push(configIds.Controls.ClearBufferedMessages);\\n } else if (params.data.startsWith('flush ok')) {\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\n } else if (params.data.startsWith('Set Watch-')) {\\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 = (`Watch-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 = (`Watch;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 = (`Watch;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 = (`Watch-RTL;${params.imei};${location_time};${location_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n break;\\n }\\n if (!params.event_time && !event_time) { // if params.event_time undefined - set it to now. \\n var event_time = moment.utc().unix();\\n AddValue(codeValues, 'event_time', event_time);\\n }\\n // if (!params.location_time && !location_time) { // if params.location_time undefined - set it to now. \\n // var location_time = moment.utc().unix();\\n // AddValue(codeValues, 'location_time', location_time);\\n //}\\n }\\n // send data msg to kibana\\n const data = buildDataToReceiver(codeValues, configsToAck, configsToUpdate, configsToSend);\\n console.log(data);\\n return data\\n // end of main operation\\n // define functions used in operation\\n // decode global msg\\n function decoder(str) { // decode rawdata\\n // CARE Decoder\\n AddValue(codeValues, 'Message : ', str);\\n var message = str;\\n // need to check if checksum is correct for possible msg corruption 10/03/23\\n var checksum = message.substring(8, 12);\\n var messageBody = message.substring(16, message.length);\\n debug('message =' + message);\\n debug('checksum =' + checksum);\\n debug('calculateCheckSum =' + calculateCheckSum(messageBody));\\n if (calculateCheckSum(messageBody) == checksum) { // payload is valid\\n debug(\\\"message has valid checksum\\\");\\n var messageBody = command; // update value for the ACK\\n debug('command =' + command);\\n if (command == '01') {\\n while (index < total_length + 16) {\\n // gen_location = '0'; //cambiado 30/09\\n var keyLengthHex = message.substring(index, index = index + 2);\\n var keyLength = 2 * hexToDecimal(keyLengthHex);\\n var key = message.substring(index, index = index + 2);\\n var value = message.substring(index, index = index + keyLength - 2);\\n debug('key = ' + key);\\n debug('value = ' + value);\\n switch (key) {\\n //Device ID\\n case '01':\\n var imei = hexToAscii(value);\\n // create long connection if it is needed\\n if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\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\\n if ((alarmCodeExtInt & 1) == 1) {\\n var alarm = 'ALF-C';\\n }\\n // Welfare Check-out\\n else if ((alarmCodeExtInt & 2) == 2) {\\n var alarm = 'ALA-C';\\n }\\n // Standard Alerts\\n //Battery low\\n else if ((alarmCodeInt & 1) == 1) {\\n var alarm = 'BATL';\\n }\\n //Overspeed\\n else if ((alarmCodeInt & 2) == 2) {\\n var alarm = 'ALSP';\\n }\\n //Fall\\n else if ((alarmCodeInt & 4) == 4) {\\n var alarm = 'ALF';\\n }\\n //Tilt\\n else if ((alarmCodeInt & 8) == 8) {\\n var alarm = 'Tilt';\\n } else if ((alarmCodeInt & 16) == 16) {\\n if ((alarmCodeInt & 16777216) == 16777216) {\\n var alarm = 'Geo1-IN';\\n } else {\\n var alarm = 'Geo1-OUT';\\n }\\n } else if ((alarmCodeInt & 32) == 32) {\\n if ((alarmCodeInt & 33554432) == 33554432) {\\n var alarm = 'Geo2-IN';\\n } else {\\n var alarm = 'Geo2-OUT';\\n }\\n } else if ((alarmCodeInt & 64) == 64) {\\n if ((alarmCodeInt & 67108864) == 67108864) {\\n var alarm = 'Geo3-IN';\\n } else {\\n var alarm = 'Geo3-OUT';\\n }\\n } else if ((alarmCodeInt & 128) == 128) {\\n if ((alarmCodeInt & 134217728) == 134217728) {\\n var alarm = 'Geo4-IN';\\n } else {\\n var alarm = 'Geo4-OUT';\\n }\\n }\\n //Power Off\\n else if ((alarmCodeInt & 256) == 256) {\\n var alarm = 'PWRF';\\n }\\n //Power On\\n else if ((alarmCodeInt & 512) == 512) {\\n var alarm = 'PWRN';\\n }\\n //Motion\\n else if ((alarmCodeInt & 1024) == 1024) {\\n var alarm = 'ALMOV';\\n }\\n //No Motion\\n else if ((alarmCodeInt & 2048) == 2048) {\\n var alarm = 'ALNM';\\n }\\n //SOS\\n else if ((alarmCodeInt & 4096) == 4096) {\\n var alarm = 'ALSOS';\\n } else if ((alarmCodeInt & 8192) == 8192) {\\n var alarm = 'Side1';\\n } else if ((alarmCodeInt & 16384) == 16384) {\\n var alarm = 'Side2';\\n }\\n //Battery charging\\n else if ((alarmCodeInt & 32768) == 32768) {\\n var alarm = 'BATCN';\\n }\\n //Battery no charging\\n else if ((alarmCodeInt & 65536) == 65536) {\\n var alarm = 'BATCF';\\n }\\n //SOS Ending\\n // Temporary Commented until we know exactly how it works. 22/09/2022\\n else if ((alarmCodeInt & 131072) == 131072) {\\n var alarm = 'SOSEnding';\\n info = 'Alarm Finished';\\n }\\n //Amber Alert EC03 only\\n else if ((alarmCodeInt & 262144) == 262144) {\\n var alarm = 'ALAO';\\n }\\n // welfare Alert check-in ALA-O\\n else if ((alarmCodeInt & 524288) == 524288) {\\n var alarm = 'ALA-O';\\n }\\n // Amber alert Ending ALA-C\\n else if ((alarmCodeInt & 1048576) == 1048576) {\\n var alarm = 'ALA-C';\\n }\\n // Amber alert Ending ALA-C\\n //else if ((alarmCodeInt & 1048576) == 1048576) {\\n // var alarm = 'ALA-C';\\n //}\\n // Fall-Down Alert ending\\n else if ((alarmCodeInt & 2097152) == 2097152) {\\n var alarm = 'ALF-C';\\n }\\n // welfare Alert Ending ALA\\n else if ((alarmCodeInt & 4194304) == 4194304) {\\n var alarm = 'ALA';\\n }\\n // Beacon absent Alert 11/10/22. Need to be added in msg types\\n //else if ((alarmCodeInt & 16777216) == 16777216) {\\n // var alarm = 'BEA';\\n //}\\n general += 'alarm:' + alarm + ',';\\n break;\\n //Custom ID\\n case '03':\\n // in value is customID.... '06' for Watch Care\\n // if ((imei != '860470063029395') && (imei != '860470063035947')) {\\n //update customID to check if belongs to this type of device\\n //value = hexToAscii(value);\\n customID = value;\\n if (value != '3036') {\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n AddValue(codeValues, \\\"customID\\\", value);\\n // exit decoder\\n // const data = buildDataToReceiver(codeValues, configsToAck, configsToUpdate, configsToSend);\\n // console.log(data);\\n return // data\\n } else {\\n if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\n //return;\\n }\\n AddValue(codeValues, \\\"customID\\\", value);\\n general += 'customID:' + value + ',';\\n break;\\n }\\n //Historical Data Completed\\n case '10': // indica q se han terminado de enviar todos los datos historicos.\\n var histData = true;\\n break;\\n //GPS location\\n case '20':\\n location_type = 'GPS';\\n var latitudeHex = value.substring(0, 8);\\n var longitudeHex = value.substring(8, 16);\\n var speedHex = value.substring(16, 20);\\n var directionHex = value.substring(20, 24);\\n var altitudeHex = value.substring(24, 28);\\n var location_accuracyHex = value.substring(28, 32);\\n var mileageHex = value.substring(32, 40);\\n var satellitesHex = value.substring(40, 42);\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n speed = ((hexToDecimal(changeEndianness(speedHex))) / 3.6).toFixed(2); //date 14-02-2023 in m/s\\n var direction = hexToDecimal(changeEndianness(directionHex));\\n var altitude = hexToDecimal(changeEndianness(altitudeHex)); // in meters\\n //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\n // Range: 0.5 to 99.9 \\n location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\n //var mileage = hexToDecimal(changeEndianness(mileageHex)) this is in km/h we need m/s\\n var mileage = hexToDecimal(changeEndianness(mileageHex)); // in meters date 14-02-2023\\n var satellites = hexToDecimal(satellitesHex);\\n // location_time = timestamp;\\n //<>,<>,<>,<>,<>\\n gps_data = `${latitude},${longitude},${location_accuracy},${speed},${direction},${altitude},${satellites},${mileage}`;\\n general += 'gps location (lat):' + latitude + ', (long):' + longitude + ',';\\n break;\\n //WIFI Towers\\n case '22':\\n location_type = 'WIFI';\\n var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\n //location_time = timestamp;\\n var wifiTowers = value;\\n general += 'wifiTowers:';\\n var indexWifi = 0;\\n var bssid_array = [];\\n wifi_data = '';\\n for (let i = 0; i < numWifi; i++) {\\n wifi_data += hexToDecimalSigned(wifiTowers.substring(indexWifi, indexWifi + 2)) + ',' + wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\n indexWifi += 14;\\n }\\n wifi_data = wifi_data.slice(0, -1);\\n general += wifi_data;\\n break;\\n //BLE Location Added 10/10/22\\n case '23':\\n location_type = 'BLE';\\n var mac = value.substring(0, 12);\\n var latitudeHex = value.substring(12, 20);\\n var longitudeHex = value.substring(20, 28);\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n var address = hexToAscii(value.substring(28, value.length));\\n var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\n // add : format in MAC\\n mac = mac.match(/.{1,2}/g).join(':');\\n // location_time = timestamp;\\n ble_data = `${latitude},${longitude},${mac},${address}`;\\n general += 'BLE location (lat):' + latitude + ', (long):' + longitude + ',';\\n break;\\n //General Data , status_data\\n case '24':\\n //var general = 'true'\\n if (customID != '3036') {\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n AddValue(codeValues, \\\"customID\\\", customID);\\n return\\n }\\n if (alarmCode) {\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\n }\\n //else {\\n // messageForReceiver = (`CareWatch-CYC;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};`);\\n //}\\n // reset variables\\n //alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\n var timestampHex = value.substring(0, 8);\\n timestampHex = changeEndianness(timestampHex);\\n timestamp = hexToDecimal(timestampHex);\\n location_time = timestamp;\\n event_time = timestamp;\\n // HardCode to fix possible issue in protocol\\n //event_time = moment.utc().unix();\\n // end of hard code\\n var statusHex = changeEndianness(value.substring(8, 16));\\n var statusInt = hexToDecimal(statusHex);\\n var statusDevice = '';\\n if ((statusInt & 1) == 1) {\\n statusDevice += 'GPS,';\\n }\\n if ((statusInt & 2) == 2) {\\n statusDevice += 'WIFISource,';\\n }\\n if ((statusInt & 4) == 4) {\\n statusDevice += 'CellTower,';\\n }\\n if ((statusInt & 8) == 8) {\\n statusDevice += 'BLELocation,';\\n }\\n //params.BatteryStatus.BatteryStatus = '1';\\n if ((statusInt & 16) == 16) {\\n statusDevice += 'Charging,';\\n // var alarm = 'BATCN';\\n //configs.BatteryStatus.BatteryStatus = '1';\\n /* if (configs.BatteryStatus.BatteryStatus !== '1') {\\n hasConfigs = true;\\n var batteryStatus = '1';\\n var alarm = 'BATCN';\\n let configsToUpdate = [];\\n configsToUpdate.push({\\n 'code': configIds.BatteryStatus.BatteryStatus,\\n 'value': batteryStatus\\n });\\n }*/\\n }\\n if ((statusInt & 32) == 32) {\\n statusDevice += 'FUllyCharged,';\\n //var alarm = 'BATF';\\n // configs.BatteryStatus.BatteryStatus = '3';\\n /* if (configs.BatteryStatus.BatteryStatus !== '3') {\\n hasConfigs = true;\\n var batteryStatus = '3';\\n var alarm = 'BATF';\\n let configsToUpdate = [];\\n configsToUpdate.push({\\n 'code': configIds.BatteryStatus.BatteryStatus,\\n 'value': batteryStatus\\n });\\n }*/\\n }\\n /* if (!((statusInt & 32) == 32) & !((statusInt & 16) == 16)) {\\n statusDevice += 'Not Charging,';\\n var alarm = 'BATCF';\\n //configs.BatteryStatus.BatteryStatus = '2';\\n if (configs.BatteryStatus.BatteryStatus !== '2') {\\n var batteryStatus = '2';\\n var alarm = 'BATCF';\\n let configsToUpdate = [];\\n configsToUpdate.push({\\n 'code': configIds.BatteryStatus.BatteryStatus,\\n 'value': batteryStatus\\n });\\n }\\n }*/\\n if ((statusInt & 64) == 64) {\\n statusDevice += 'Reboot,';\\n }\\n if ((statusInt & 128) == 128) {\\n statusDevice += 'HistoricalData,';\\n }\\n if ((statusInt & 256) == 256) {\\n statusDevice += 'AGPSDataValid,';\\n }\\n if ((statusInt & 512) == 512) {\\n statusDevice += 'Motion,';\\n }\\n if ((statusInt & 1024) == 1024) {\\n statusDevice += 'SmartLocating,';\\n }\\n if ((statusInt & 2048) == 2048) { //isHome\\n statusDevice += 'BeaconLocation,';\\n }\\n if ((statusInt & 4096) == 4096) {\\n statusDevice += 'BLEConnected,';\\n }\\n if ((statusInt & 16384) == 16384) {\\n statusDevice += 'HomeWiFi,';\\n }\\n statusDevice = statusDevice.slice(0, -1);\\n status_data = statusDevice; //to oysta template\\n //statusHex = (statusHex);\\n statusHex = hexToBin(statusHex);\\n statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\n battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\n cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\n workMode = parseInt(statusHex.substring(13, 16), 2);\\n general += 'statusDevice:' + statusDevice + ',';\\n if (battery_percentage) {\\n general += 'battery:' + battery_percentage + ',';\\n }\\n if (cellNetworkSignal) {\\n general += 'cellNetworkSignal:' + cellNetworkSignal + ',';\\n }\\n if (workMode) {\\n general += 'workMode:' + workMode + ',';\\n }\\n //messageForReceiver = (`CareWatch-CYC;${imei};${i};${event_time};${battery_percentage}`);\\n break;\\n //Call Records\\n case '25':\\n //Needed?\\n break;\\n //BLE Location 2\\n case '26':\\n //I don't understand\\n //messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n //Smart Location\\n case '27':\\n location_type = 'SMART';\\n var latitudeHex = value.substring(0, 8);\\n var longitudeHex = value.substring(8, 16);\\n var location_accuracyHex = value.substring(16, 20);\\n var altitudeHex = value.substring(20, 24);\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n var altitude = hexToDecimal(changeEndianness(altitudeHex));\\n //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\n //04/08/2022 se quita el multiplicador por 5 pq ya viene el valor en metros\\n location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\n //location_time = timestamp;\\n smart_data = `${latitude},${longitude},${location_accuracy},${altitude}`;\\n general += 'smart location (lat):' + latitude + ', (long):' + longitude + ',';\\n break;\\n //Beacon Location Added 11/10/22\\n case '28':\\n location_type = 'BEACON';\\n // var alarm = 'EBZI';\\n var latitudeHex = '00';\\n var longitudeHex = '00';\\n var descr = 'empty';\\n var flag = hexToDecimal(value.substring(0, 1));\\n var beacId = hexToDecimal(value.substring(1, 2));\\n // msg includes descrip\\n if ((flag & 4) == 4) {\\n descr = hexToAscii(value.substring(18, value.length));\\n }\\n // msg includes lat/lon\\n if ((flag & 8) == 8) {\\n latitudeHex = value.substring(18, 26);\\n longitudeHex = value.substring(26, 34);\\n }\\n // msg includes lat/lon and description\\n if ((flag & 12) == 12) {\\n latitudeHex = value.substring(18, 26);\\n longitudeHex = value.substring(26, 34);\\n descr = hexToAscii(value.substring(34, value.length));\\n }\\n var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\n // add : format in MAC\\n mac = mac.match(/.{1,2}/g).join(':');\\n var rssiHex = value.substring(14, 16);\\n var rssi1Hex = value.substring(16, 18);\\n rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\n rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\n // var latitudeHex = value.substring(18, 26);\\n // var longitudeHex = value.substring(26, 34);\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n //location_time = timestamp;\\n beacon_data = `${latitude},${longitude},${mac},${descr}`;\\n general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (listIndex):' + beacId + ',';\\n break;\\n // Beacon V2\\n case '2C':\\n location_type = 'BEACON';\\n // var alarm = 'EBZI';\\n var latitudeHex = '00';\\n var longitudeHex = '00';\\n var descr = 'empty';\\n var flag = hexToDecimal(value.substring(0, 1));\\n var beacId = hexToDecimal(value.substring(1, 2));\\n // msg includes descrip\\n if ((flag & 4) == 4) {\\n let desc_leng = hexToDecimal(value.substring(20, 22));\\n descr = hexToAscii(value.substring(22, 22 + (2 * desc_leng)));\\n //descr = hexToAscii(value.substring(18, value.length));\\n }\\n // msg includes lat/lon\\n if ((flag & 8) == 8) {\\n latitudeHex = value.substring(18, 26);\\n longitudeHex = value.substring(26, 34);\\n }\\n // msg includes lat/lon and description\\n if ((flag & 12) == 12) {\\n latitudeHex = value.substring(20, 28);\\n longitudeHex = value.substring(28, 36);\\n let desc_leng = hexToDecimal(value.substring(36, 38));\\n descr = hexToAscii(value.substring(38, 38 + (2 * desc_leng)));\\n }\\n var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\n // add : format in MAC\\n mac = mac.match(/.{1,2}/g).join(':');\\n var rssiHex = value.substring(14, 16);\\n var rssi1Hex = value.substring(16, 18);\\n rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\n rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\n var battery_beacon = hexToDecimal(value.substring(18, 20));\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n //location_time = timestamp;\\n beacon_data = `${latitude},${longitude},${mac},${descr}`;\\n general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (battery):' + battery_beacon + ', (listIndex):' + beacId + ',';\\n break;\\n //Cell Towers Note\\n case '29':\\n location_type = 'LBS';\\n lbs_data = '';\\n var mccHex = changeEndianness(value.substring(0, 4));\\n var mncHex = value.substring(4, 6);\\n var mcc = hexToDecimal(mccHex);\\n lbs_data += mcc + ',';\\n var mnc = hexToDecimal(mncHex);\\n lbs_data += mnc + ',';\\n var indexLbs = 6;\\n var numTowers = (hexToDecimal(keyLengthHex) - 4) / 7;\\n for (let i = 0; i < numTowers; i++) {\\n var rxlHex = changeEndianness(value.substring(indexLbs, indexLbs + 2));\\n var rxl = hexToDecimal(rxlHex);\\n var lacHex = changeEndianness(value.substring(indexLbs + 2, indexLbs + 6));\\n var lac = hexToDecimal(lacHex);\\n var cellTowers = hexToDecimal(changeEndianness(value.substring(indexLbs + 6, indexLbs + 14)));\\n lbs_data += rxl + ',' + lac + ',' + cellTowers + ',';\\n indexLbs += 14;\\n }\\n lbs_data = lbs_data.slice(0, -1);\\n general += lbs_data;\\n break;\\n case '30':\\n //G-sensor.\\n //value = hexToAscii(value);\\n //if (value != '06') {\\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 = (`Watch-${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 //value = hexToAscii(value);\\n //if (value != '06') {\\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 = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n }\\n break;\\n //BLE Connected . For Flic button\\n case '62':\\n location_type = 'BLE';\\n //var alarm = 'EBZI'; \\n //var latitudeHex = '00';\\n //var longitudeHex = '00';\\n //var descr = 'empty';\\n var flag = hexToDecimal(value.substring(0, 2)); // 0= Disconnected, 1= Connected\\n var mac = value.substring(2, 14); // No hace falta darle la vuelta\\n // add : format in MAC\\n mac = mac.match(/.{1,2}/g).join(':');\\n var batLevel = hexToDecimal(value.substring(14, 16)); // 0-100\\n //location_time = timestamp;\\n ble_data = `${flag},${batLevel},${mac}`;\\n general += 'BLE location (State):' + flag + ', (bat):' + batLevel + ', (mac):' + mac + ',';\\n break;\\n }\\n }\\n if (alarmCode) {\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};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 = (`Watch;ACK-FIRM;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\n //AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\n configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\n //configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\n //messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n case '1A':\\n //no ACK need\\n var fwVersion = hexToAscii(value);\\n imei = serverParams.Imei;\\n AddValue(codeValues, \\\"imei\\\", imei);\\n AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\n messageForReceiver = (`Watch;ACK-FIRM;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\n //AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\n configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\n //configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\n break;\\n //IMEI\\n case '03':\\n var imei = hexToDecimal(value);\\n // harcode to avoid conflicts with Rio protocol\\n //if ((imei != '860470063029395') && (imei != '860470063035947')) {\\n // AddValue(codeValues, \\\"error\\\", \\\"device imei is not in this protocol\\\");\\n // AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n //AddValue(codeValues, \\\"IMEI\\\", imei);\\n // return\\n //}\\n if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\n //return;\\n }\\n messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n //ICCID\\n case '04':\\n var iccid = hexToDecimal(value);\\n messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n //BLE-MAC\\n case '05':\\n var bleMac = hexToDecimal(value);\\n messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n //Run Time\\n case '07':\\n var runTime = hexToDecimal(value);\\n messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n case '10': // Ringer Volume\\n var volume = hexToDecimal(value);\\n imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-VOL;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"Volume\\\", volume);\\n AddValue(configsToUpdate, configIds.ReadSystemSettings.Volume, volume);\\n configsToAck.push(configIds.ReadSystemSettings.Volume);\\n break;\\n case '0A': //Performance mode\\n //var workMode = hexToDecimal(value);\\n //messageBody = messageBody + keyLengthHex + key + value;\\n //AddValue(codeValues, \\\"WorkMode\\\", workMode);\\n //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\n //configsToAck.push(configIds.ReadPerformance`Settings.Mode);\\n //var workMode = hexToAscii(value.substring(0, value.length));\\n //var workMode = hexToDecimal(value);\\n //var workMode = hexToAscii(value.substring(0, value.length));\\n var workMode = 1234; // + value + \\\"end\\\";\\n //var workModeVal = 9;\\n //workMode = 'test10';\\n imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-MODE;${imei};`);\\n AddValue(codeValues, \\\"Mode\\\", workMode);\\n AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\n configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n //AddValue(codeValues, \\\"performanceMode\\\", performanceMode);\\n //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, performanceMode);\\n // configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\n break;\\n case '1B':\\n //Decimal o ascii?\\n var gsmModule = hexToDecimal(value);\\n messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n case '1F':\\n //System Language\\n var systemLanguage = hexToAscii(value.substring(0, value.length));\\n imei = serverParams.Imei;\\n //messageBody = messageBody + keyLengthHex + key + value;\\n messageForReceiver = (`Watch;ACK-LANG;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"SystemLanguage\\\", systemLanguage);\\n AddValue(configsToUpdate, configIds.ReadSystemSettings.SystemLanguage, systemLanguage);\\n configsToAck.push(configIds.ReadSystemSettings.SystemLanguage);\\n break;\\n case '33': // phone option\\n // [Value]:83 0B 00 00 {\\\"phoneOption\\\":{\\\"flag_value\\\":2947,\\\"s3\\\":1,\\\"s4\\\":0,\\\"s5\\\":1,\\\"s6\\\":0,\\\"callIncoming\\\":0,\\\"rings\\\":3,\\\"s7\\\":0,\\\"toneID\\\":0,\\\"s1\\\":1,\\\"s2\\\":1}}\\n var statusPhone = hexToBin(value.substring(0, 2)); // To find autoanswer setup\\n if (statusPhone.substring(0, 1) == '1') { // 1 Enable\\n var auto = 'true';\\n } else var auto = 'false';\\n statusPhone = hexToBin(value.substring(2, 4)); // To find allow list setup\\n if (statusPhone.substring(7, 8) == '1') { // 1 Enable\\n allow = 'true';\\n } else var allow = 'false';\\n //statusPhone = hexToBin(value.substring(0, 2)) + hexToBin(value.substring(2, 4));\\n //AddValue(configsToUpdate, configIds.ReadSystemSettings.Statusphone, statusPhone);\\n AddValue(configsToUpdate, configIds.ReadSystemSettings.AllowList, allow);\\n AddValue(configsToUpdate, configIds.ReadSystemSettings.AutoAnswer, auto);\\n //configsToAck.push(configIds.ReadSystemSettings.Statusphone);\\n configsToAck.push(configIds.ReadSystemSettings.AllowList);\\n configsToAck.push(configIds.ReadSystemSettings.AutoAnswer);\\n break;\\n case '34': //ContactList with name\\n var contactNumber = value.substring(1, 2);\\n var telLength = hexToDecimal(value.substring(2, 4));\\n var tel = '';\\n switch (contactNumber) {\\n // Emergency Number\\n case '0':\\n tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\n AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\n AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\n configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\n break;\\n // Speed Dial Number\\n //case '1':\\n // tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\n // AddValue(codeValues, \\\"SpeedDialNumber\\\", tel);\\n // AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.SpeedDialNumber, tel);\\n // configsToAck.push(configIds.ReadSpeedDialSettings.SpeedDialNumber);\\n // break;\\n // Gateway Number\\n case '9': //00447781482635,Esendex UK 0034627177148,Esendex Spain 00447507288240,Esendex UK Acceptance\\n tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\n if (tel.includes('447781482635') || tel.includes('00447781482635')) {\\n tel = 'Esendex UK'\\n } else if (tel.includes('34627177148') || tel.includes('0034627177148')) {\\n tel = 'Esendex Spain'\\n } else if (tel.includes('447507288240') || tel.includes('00447507288240')) {\\n tel = 'Esendex UK Acceptance'\\n } else {\\n tel = 'Default'\\n }\\n AddValue(codeValues, \\\"SMSGateway\\\", tel);\\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\n configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\n break;\\n default:\\n tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\n if (tel.length < 6) {\\n contacts += '';\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\n break;\\n }\\n //contacts += 'A' + (contactNumber - 1) + ': ' + tel + ', ';\\n contacts += tel + ', ';\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\n break;\\n }\\n break;\\n case '40': // APN\\n //no ACK need\\n AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'));\\n configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\n var apn = hexToAscii(value.substring(0, value.length));\\n imei = serverParams.Imei;\\n break;\\n case '41': // APN Username\\n //no ACK need\\n //apn = apn + ',' + hexToAscii(value.substring(0, value.length));\\n break;\\n case '42': // APN Password\\n //no ACK need\\n //apn = apn + ',' + hexToAscii(value.substring(0, value.length));\\n messageForReceiver = (`Watch;ACK-GDATA;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"apn\\\", apn);\\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.APN, apn);\\n configsToAck.push(configIds.ReadCommunicationSettings.APN);\\n break;\\n case '43': //Server Details\\n //52.232.85.255,5678 production 52.174.17.77,5678 acceptance\\n var serverDetails = hexToAscii(value.substring(6, value.length)) + ':' + hexToDecimal(value.substring(4, 6) + value.substring(2, 4));\\n if (serverDetails.includes('52.232.85.255:5678')) {\\n serverDetails = 'Production'\\n } else if (serverDetails.includes('52.174.17.77:5678')) {\\n serverDetails = 'Acceptance'\\n } else if (serverDetails.includes('52.174.17.77:5778')) {\\n serverDetails = 'Protocol-Import'\\n } else if (serverDetails.includes('52.174.17.77:5878')) {\\n serverDetails = 'Protocol-Dev'\\n } else {\\n serverDetails = 'Default'\\n }\\n AddValue(codeValues, \\\"server\\\", serverDetails);\\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.Server, serverDetails);\\n configsToAck.push(configIds.ReadCommunicationSettings.Server);\\n break;\\n case '44': //time interval - work mode intervals\\n imei = serverParams.Imei;\\n messageForReceiver = (`Watch;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 = (`Watch;ACK-CUSTID;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"customeid\\\", value);\\n AddValue(configsToUpdate, configIds.ReadState.CustomId, hexToAscii(value)); //now it comes \\\"3036\\\"\\n configsToAck.push(configIds.ReadState.CustomId);\\n break;\\n case '53': // Non motion alert\\n //2B020080\\n var status = hexToBin(value.substring(6, 8));\\n var alertSetting = '';\\n var enableDisable = '';\\n if (status.substring(0, 1) == '1') {\\n alertSetting = 'Enable, '\\n enableDisable = '1';\\n } else {\\n alertSetting = 'Disable, '\\n };\\n //if (status.substring(5, 6) == '1') {\\n // alertSetting += 'Dial, '\\n //} else {\\n // alertSetting += 'No Dial, '\\n //};\\n var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\n alertSetting += time;\\n imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-NOMOTION;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"nomotion\\\", alertSetting);\\n //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings, enableDisable);\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\n //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\n configsToAck.push(configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings);\\n configsToAck.push(configIds.ReadNonMovementSettings.Time);\\n break;\\n case '56': //Fall down sensibility\\n // '00001100'\\n var fallStatus = hexToBin(value.substring(0, 2));\\n var enalbleDisable = '';\\n //if (fallStatus.substring(4, 5) == '1') {\\n if (fallStatus.substring(0, 1) == '1') {\\n var sensibility = 'Enable, '\\n enalbleDisable = '1'\\n } else {\\n var sensibility = 'Disable, '\\n };\\n if (fallStatus.substring(5, 6) == '1') {\\n sensibility += 'Dial, '\\n } else {\\n sensibility += 'No Dial, '\\n };\\n var imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-FALLALERT;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n var sesibityOptionValue = hexToDecimal(value.substring(1, 2));\\n sensibility += sesibityOptionValue;\\n AddValue(codeValues, \\\"sensibility\\\", sensibility);\\n //AddValue(configsToUpdate, configIds.ReadAlertSettings.FallSettings, sensibility);\\n AddValue(configsToUpdate, configIds.ReadFallSettings.EnableDisableFallSettings, enalbleDisable);\\n AddValue(configsToUpdate, configIds.ReadFallSettings.Sensitivity, sesibityOptionValue);\\n //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\n configsToAck.push(configIds.ReadFallSettings.EnableDisableFallSettings);\\n configsToAck.push(configIds.ReadFallSettings.Sensitivity);\\n break;\\n case '73': //BeaconList\\n var beaconNumber = hexToDecimal(value.substring(1, 2));\\n var beaconStatus = hexToBin(value.substring(0, 1));\\n beaconStatus = hexToAscii(value.substring(30, value.length));\\n //beaconStatus = changeEndianness(value.substring(30, value.length));\\n //homeBeacon += 'B' + (beaconNumber + 1) + ': ' + beaconStatus + ', ';\\n homeBeacon += beaconStatus + ', ';\\n AddValue(codeValues, \\\"homeBeacon\\\", homeBeacon);\\n messageForReceiver = (`Watch;ACK-GDATA;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\n configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\n break;\\n case '4A': //Wifi Network List\\n var wifiSSIDLenght = hexToDecimal(value.substring(2, 4));\\n var wifiPasswordLenght = hexToDecimal(value.substring(4, 6));\\n var wifiIndex = hexToDecimal(value.substring(1, 2));\\n //var wifiStatus = hexToDecimal(value.substring(0, 1));\\n var wifiStatus = value.substring(0, 1);\\n /*var enalbleDisable = wifiSSID = wifiPassword = homeWifi = '';\\n /var homeWifi = '';\\n if (wifiIndex == '0') { // Only first Wifi of the list\\n if (wifiStatus == '8') {\\n homeWifi += ' Enable, '\\n enalbleDisable = '1';\\n } else {\\n homeWifi += ' Disable, '\\n //enalbleDisable = '0';\\n };*/\\n if ((wifiStatus == '8') || (wifiStatus == 'C')) { // 8 == ON OR C== ON and Connected\\n var wifiSSID = hexToAscii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\n var wifiPassword = hexToAscii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\n var imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-WIFI;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n //homeWiFi += 'W' + (wifiIndex + 1) + ': ' + wifiSSID + ', ' + wifiPassword + ';';\\n homeWiFi += wifiSSID + ', ' + wifiPassword + ';';\\n AddValue(codeValues, \\\"wifi\\\", homeWiFi);\\n AddValue(configsToUpdate, configIds.ReadWiFiList.WiFiList, homeWiFi);\\n configsToAck.push(configIds.ReadWiFiList.WiFiList);\\n }\\n //AddValue(configsToUpdate, configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings, enalbleDisable);\\n //AddValue(configsToUpdate, configIds.ReadWiFiSettings.SSID, wifiSSID);\\n //AddValue(configsToUpdate, configIds.ReadWiFiSettings.Password, wifiPassword);\\n //configsToAck.push(configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings);\\n //configsToAck.push(configIds.ReadWiFiSettings.SSID);\\n //configsToAck.push(configIds.ReadWiFiSettings.Password);\\n break;\\n case '21': // Speed Dial Settings\\n // [Value]:53 84 {\\\"call1Button\\\":{\\\"mode\\\":0,\\\"feedBack\\\":3,\\\"task\\\":2,\\\"time\\\":20,\\\"status\\\":1}}\\n var status = hexToBin(value.substring(2, 4)); //always pass 2 HEXs to this function\\n var alertSetting = '';\\n var enalbleDisable = '';\\n if (status.substring(0, 1) == '1') {\\n alertSetting = 'Enable, '\\n enalbleDisable = '1'\\n } else {\\n alertSetting = 'Disable, '\\n //enableDisable = '0';\\n };\\n //var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\n //alertSetting += time;\\n imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-SPEED;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"speed\\\", alertSetting);\\n //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\n AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\n //AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\n //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\n configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\n //configsToAck.push(configIds.ReadNonMovementSettings.Time);\\n break;\\n }\\n }\\n }\\n if (command == '03') {\\n while (index < total_length + 16) {\\n var keyLengthHex = message.substring(index, index = index + 2);\\n var keyLength = 2 * hexToDecimal(keyLengthHex);\\n var key = message.substring(index, index = index + 2);\\n var value = message.substring(index, index = index + keyLength - 2);\\n debug('key = ' + key);\\n debug('value = ' + value);\\n switch (key) {\\n case '01': // Device ID\\n var imei = hexToAscii(value);\\n // create long connection if it is needed\\n if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\n return;\\n }\\n break;\\n //CustomID is not provided so far with command type 03.. commented in the mean time\\n /* case '03':\\n //update customID to check if belongs to this type of device\\n customID = value;\\n if (value != '04') {\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n AddValue(codeValues, \\\"customID\\\", value);\\n return\\n } else {\\n if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\n }\\n AddValue(codeValues, \\\"customID\\\", value);\\n general += 'customID:' + value + ',';\\n break;\\n }\\n break; */\\n case '10': // Heartbeat\\n var heartbeat = hexToAscii(value);\\n event_time = moment.utc().unix();\\n if (index < total_length + 16) {\\n var keyLengthHex = message.substring(index, index = index + 2);\\n keyLength = 2 * hexToDecimal(keyLengthHex);\\n key = message.substring(index, index = index + 2);\\n if (key == '24') {\\n // debug('key: ' + key) //comment those out\\n value = message.substring(index, index = index + keyLength - 2);\\n // debug(value)\\n var timestampHex = value.substring(0, 8);\\n // debug('timestampt hex: ' + timestampHex)\\n timestampHex = changeEndianness(timestampHex);\\n timestamp = hexToDecimal(timestampHex);\\n event_time = timestamp;\\n // debug(event_time)\\n var statusHex = changeEndianness(value.substring(8, 16));\\n // debug(statusHex)\\n var statusInt = hexToDecimal(statusHex);\\n var statusDevice = '';\\n if ((statusInt & 1) == 1) {\\n statusDevice += 'GPS,';\\n }\\n if ((statusInt & 2) == 2) {\\n statusDevice += 'WIFISource,';\\n }\\n if ((statusInt & 4) == 4) {\\n statusDevice += 'CellTower,';\\n }\\n if ((statusInt & 8) == 8) {\\n statusDevice += 'BLELocation,';\\n }\\n if ((statusInt & 16) == 16) {\\n statusDevice += 'Charging,';\\n }\\n if ((statusInt & 32) == 32) {\\n statusDevice += 'FUllyCharged,';\\n }\\n if ((statusInt & 64) == 64) {\\n statusDevice += 'Reboot,';\\n }\\n if ((statusInt & 128) == 128) {\\n statusDevice += 'HistoricalData,';\\n }\\n if ((statusInt & 256) == 256) {\\n statusDevice += 'AGPSDataValid,';\\n }\\n if ((statusInt & 512) == 512) {\\n statusDevice += 'Motion,';\\n }\\n if ((statusInt & 1024) == 1024) {\\n statusDevice += 'SmartLocating,';\\n }\\n if ((statusInt & 2048) == 2048) {\\n statusDevice += 'BeaconLocation,';\\n }\\n if ((statusInt & 4096) == 4096) {\\n statusDevice += 'BLEConnected,';\\n }\\n statusDevice = statusDevice.slice(0, -1);\\n // debug('statusHex:' + statusHex)\\n statusHex = (statusHex);\\n statusHex = hexToBin(statusHex);\\n statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\n // debug(statusHex)\\n battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\n // debug(battery_percentage)\\n // debug(battery_percentage)\\n // debug(statusHex.substring(8, 13))\\n cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\n // debug(cellNetworkSignal)\\n workMode = parseInt(statusHex.substring(13, 16), 2);\\n // debug(workMode)\\n general += 'statusDevice:' + statusDevice + ';';\\n if (battery_percentage) {\\n general += 'battery:' + battery_percentage + ';';\\n }\\n if (cellNetworkSignal) {\\n general += 'cellNetworkSignal:' + cellNetworkSignal + ';';\\n }\\n if (workMode) {\\n general += 'workMode:' + workMode + ';';\\n }\\n }\\n }\\n // revisar\\n var gen_location = '0';\\n //CustomID is not provided so far with command type 03.. commented in the mean time\\n /*if (customID != '04') {\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n AddValue(codeValues, \\\"customID\\\", value);\\n return\\n }*/\\n //messageForReceiver = (`Eview-HTB;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};SIGNAL=${cellNetworkSignal};WM=${workMode};SL=${systemLanguage};GENERAL=${general}`);\\n messageForReceiver = (`Watch-HTB;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n //messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n case '12': // Device requesting timestamp\\n timestamp = moment.utc().unix();\\n timestampHex = decimalToHex(timestamp);\\n timestampHex = changeEndianness(timestampHex);\\n keyLengthHex = ('00' + decimalToHex(1 + (timestampHex.length) / 2)).slice(-2);\\n // respond to device with the timestamp of the server\\n messageBody = messageBody + keyLengthHex + key + timestampHex;\\n messageForReceiver = `Eview;${imei};${sequenceID};Get timestamp`;\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n break;\\n case '21': //Cell Towers\\n var mccHex = value.substring(0, 2);\\n var mncHex = value.substring(2, 3);\\n var mcc = hexToDecimal(mccHex);\\n var mnc = hexToDecimal(mncHex);\\n var numTowers = (keyLength - 4) / 5;\\n var cellTowers = hexToAscii(value);\\n messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n case '22': // WIFI locations \\n location_type = 'WIFI';\\n var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\n //location_time = timestamp;\\n var wifiTowers = value;\\n general += 'wifiTowers:';\\n var indexWifi = 0;\\n var bssid_array = [];\\n gen_location = '';\\n for (let i = 0; i < numWifi; i++) {\\n gen_location += wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\n indexWifi += 14;\\n }\\n gen_location = gen_location.slice(0, -1);\\n general += gen_location;\\n //CustomID is not provided so far with command type 03\\n /*if (customID != '04') {\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n AddValue(codeValues, \\\"customID\\\", value);\\n return\\n }*/\\n if (alarmCode) {\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};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 = (`Watch-ACK;${imei};${message}`); // ${sequenceID}; add ${sequenceID}; 19-07\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n var value = message.substring(index, index = index + keyLength - 2);\\n if (typeof configIds !== 'undefined' && configIds && configIds.ConfigureDevice && configIds.ConfigureDevice.LastConfigured) { // when is defined\\n AddValue(configsToUpdate, configIds.ConfigureDevice.LastConfigured, moment().format('YYYY/MM/DD, HH:mm:ss'));\\n configsToAck.push(configIds.ConfigureDevice.LastConfigured);\\n }\\n //}\\n }\\n if (command == 'FE') {\\n while (index < total_length + 16) {\\n var keyLength = message.substring(index, index = index + 2);\\n keyLength = 2 * hexToDecimal(keyLength);\\n var key = message.substring(index, index = index + 2);\\n var value = message.substring(index, index = index + keyLength - 2);\\n }\\n }\\n // prepare the ACK msg and change config if it is needed\\n lengthAck = messageBody.length / 2;\\n lengthAck = ('0000' + decimalToHex(lengthAck)).slice(-4);\\n lengthAck = lengthAck.toString().substring(2, 4) + lengthAck.toString().substring(0, 2);\\n ////////////checksum CRC 16\\n var checksumAck = byteStringToByteArray(messageBody);\\n checksumAck = crc16byte(checksumAck);\\n checksumAck = decimalToHex(checksumAck);\\n checksumAck = ('0000' + checksumAck).slice(-4);\\n checksumAck = checksumAck.toString().substring(2, 4) + checksumAck.toString().substring(0, 2);\\n prefix = prefix + lengthAck + checksumAck + sequenceID;\\n // To send ACK to the device previous to internal msg with parts\\n if (needsAck == true) {\\n if (messageBody.length <= 2) {\\n ack = 'AB00030008C7' + sequenceID + '7F0100'; // change AB10030008C7 to AB00030008C7\\n } else {\\n ack = prefix + messageBody;\\n }\\n AddValue(codeValues, 'imei', imei);\\n AddValue(codeValues, 'ack', ack);\\n }\\n } else { // checksum was invalid - print out useful debug info and bet quess at imei \\n AddValue(codeValues, \\\"error\\\", \\\"checksum failed for message\\\");\\n AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n i = rawFromBytes.search('3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]');\\n if (i >= 0) {\\n imei = hexToAscii(rawFromBytes.substring(i, i + 30));\\n AddValue(codeValues, \\\"imei\\\", imei);\\n }\\n }\\n }\\n // Auxiliary functions\\n function buildDataToReceiver(codeValues, configsToAck = [], configsToUpdate = [], configsToSend = []) {\\n const dataToReceiver = {\\n values: codeValues\\n };\\n if (configsToAck.length > 0) {\\n dataToReceiver.configsToAck = configsToAck;\\n }\\n if (configsToUpdate.length > 0) {\\n dataToReceiver.configsToUpdate = configsToUpdate;\\n }\\n if (configsToSend.length > 0) {\\n dataToReceiver.configsToSend = configsToSend;\\n }\\n return dataToReceiver;\\n }\\n\\n function AddValue(codeValueArray, p1, p2) { // push code value pair into array\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n codeValueArray.push(cvpair);\\n }\\n // convert functions\\n function asciiToHex(str) { // ascii to hex \\n return [...str].map(char => char.charCodeAt(0).toString(16).padStart(2, '0')).join('');\\n }\\n\\n function byteStringToByteArray(str) { // convierte una cadena hexadecimal en un array de bytes (number[])\\n const bytes = [];\\n for (let i = 0; i < str.length; i += 2) {\\n const byte = parseInt(str.substring(i, i + 2), 16);\\n if (!isNaN(byte) && byte >= 0 && byte <= 255) {\\n bytes.push(byte);\\n }\\n }\\n return bytes;\\n }\\n\\n function decimalToHex(x) {\\n return Number(x).toString(16).toUpperCase();\\n }\\n\\n function hexToBin(hex) { // convierte un valor hexadecimal a su representación binaria, y asegura que tenga al menos 8 bits \\n const bin = parseInt(hex, 16).toString(2);\\n return bin.padStart(hex.length * 4, '0');\\n }\\n\\n function hexToAscii(hex) {\\n if (hex.length % 2 !== 0) {\\n throw new Error(\\\"Hex string length must be even\\\");\\n }\\n let ascii = '';\\n for (let i = 0; i < hex.length; i += 2) {\\n const byte = hex.substr(i, 2);\\n const charCode = parseInt(byte, 16);\\n if (charCode !== 0) { // remove null character (\\\\u0000)\\n ascii += String.fromCharCode(charCode);\\n }\\n }\\n return ascii;\\n //return hex.match(/.{2}/g).map(byte => String.fromCharCode(parseInt(byte, 16))).join('');\\n }\\n\\n function hexToDecimalSigned(hex) { // hex to decimal\\n if (hex.length % 2 !== 0) {\\n hex = '0' + hex;\\n }\\n const num = parseInt(hex, 16);\\n const bits = hex.length * 4;\\n const maxVal = 2 ** bits;\\n return num >= maxVal / 2 ? num - maxVal : num;\\n }\\n\\n function hexToDecimal(hex) {\\n return parseInt(hex, 16);\\n }\\n // CheckSum and debug functions\\n function changeEndianness(hexString) { // changeEndianness\\n if (hexString.length === 0) { //if string is empty or not defined\\n return \\\"\\\";\\n }\\n if (hexString.length % 2 !== 0) {\\n throw new Error(\\\"Hex string length must be even\\\");\\n }\\n return hexString.match(/.{2}/g) // divide in bytes (2 chars)\\n .reverse() // reverse the order\\n .join('');\\n }\\n\\n function calculateCheckSum(payloadData) { // calcula el CRC16 sobre una cadena hexadecimal y devuelve el valor con el endianness invertido\\n const bytes = byteStringToByteArray(payloadData);\\n const crc = crc16byte(bytes);\\n const hex = crc.toString(16).padStart(4, '0').toUpperCase();\\n return changeEndianness(hex);\\n }\\n\\n function crc16byte(byteArray) { // calcula el CRC-16 sobre un array de bytes usando una tabla precalculada (crcTable)\\n let crc = 0x0000;\\n for (const byte of byteArray) {\\n if (byte < 0 || byte > 255 || !Number.isInteger(byte)) {\\n throw new RangeError(\\\"Invalid byte value in input array\\\");\\n }\\n const index = (byte ^ (crc >> 8)) & 0xFF;\\n crc = crcTable[index] ^ (crc << 8);\\n }\\n return crc & 0xFFFF;\\n }\\n\\n function debug(...args) { // write debug info to console log, if localTesting\\n if (localTesting) {\\n console.debug('[DEBUG]', ...args);\\n }\\n }\\n /*\\n function sendMessageToLocalhostNoWait(str) { // sends message to system, closing connection after\\n var server;\\n if (localTesting) {\\n console.log('local testing - sending to protocol-dev server the message ... '); // port 5878\\n console.log(str);\\n server = '52.174.17.77';\\n } else {\\n server = '127.0.0.1';\\n }\\n var c = net.createConnection(5878, server);\\n c.on('error', function(error) {\\n c = net.createConnection(5878, server);\\n });\\n c.write(`${str}`);\\n c.end();\\n }*/\\n function sendMessageToLocalhostNoWait(message) {\\n const server = localTesting ? '52.174.17.77' : '127.0.0.1';\\n //const port = localTesting ? '5878' : ''; //Protocol-dev\\n const port = '5678'; //acceptance-dev\\n if (localTesting) {\\n console.debug('[DEBUG] Sending message to test server:', message);\\n }\\n const client = net.createConnection(port, server, () => {\\n client.write(message);\\n client.end();\\n });\\n client.on('error', (err) => {\\n console.error(`[ERROR] Failed to send message to ${server}:${port}:`, err.message);\\n });\\n client.on('end', () => {\\n if (localTesting) {\\n console.debug('[DEBUG] Connection closed');\\n }\\n });\\n }\\n}\\n// params is not defined locally -> export as module\\nif (typeof(params) === 'undefined') {\\n module.exports = {\\n execute_ops\\n }\\n} else { // on server use local defined vars\\n let return_values = execute_ops(moment, msg, net, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\n // define global returns\\n msg = return_values;\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1749057260},{"Type":1,"NewValue":"{\"Id\":437,\"Name\":\"Access TEC Care Watch\",\"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 // Watch protocol - please see variables and typical values in order below\\n // Watch-CYC;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;SIGNAL=<>;WM=<>;GENERAL=<>\\n // Watch-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\n //\\n // Author: Juanmi Navarro\\n // Created: 01/01/0000\\n // Last modified: 20/05/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', 'Watch');\\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 = (`Watch-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 //<>,<>,<> \\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 //<>,<>,<> \\n if (mac2) {\\n AddValue(codeValues, 'beacon_mac', mac2);\\n var simpleQuery2 = [{\\n 'code': 'Mac',\\n 'value': mac2,\\n }];\\n var simpleQueryLabel2 = {\\n 'table': 'beacons',\\n 'select': 'Name',\\n 'query': simpleQuery2\\n };\\n var labels2 = [];\\n labels2.push(JSON.stringify(simpleQueryLabel2));\\n AddValue(codeValues, 'oysta_labels', JSON.stringify(labels2));\\n }\\n if (params.beacon_major) {\\n AddValue(codeValues, 'beacon_major', params.beacon_major);\\n } else {\\n AddValue(codeValues, 'beacon_major', 0);\\n }\\n if (params.beacon_minor) {\\n AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\n } else {\\n AddValue(codeValues, 'beacon_minor', 0);\\n }\\n //AddValue(codeValues,'oysta_labels', label);\\n //AddValue(codeValues,'oysta_value', mac);\\n if (location_time) {\\n AddValue(codeValues, 'location_time', location_time);\\n }\\n }\\n /* meter mas tarde... \\n if (params.smart_data !== 'undefined') {\\n var gen_location = params.smart_data.split(',')\\n var latitude = gen_location[0]\\n var longitude = gen_location[1]\\n var location_accuracy = gen_location[2]\\n var altitude = gen_location[3]\\n AddValue(codeValues,'latitude', latitude);\\n AddValue(codeValues,'longitude', longitude);\\n AddValue(codeValues,'altitude', altitude);\\n AddValue(codeValues,'location_accuracy', location_accuracy);\\n }\\n */\\n /*else if ((params.event_time) && (params.event_time == '')) {\\n var event_time = moment.utc().unix();\\n AddValue(codeValues,'event_time', event_time);\\n } revisar mas adelante*/\\n // to parse SMS info from the device\\n switch (messageTypeLocalCode) {\\n case 'COMM-SMS': // SMS message sent in\\n if (params.data.startsWith('Device location request')) {\\n configsToAck.push(configIds.Controls.RealTimeLocate);\\n } else if (params.data.startsWith('Set IP ok')) {\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\n } else if (params.data.startsWith('IMEI:')) {\\n configsToAck.push(configIds.Controls.GetFirmwareVersion);\\n } else if (params.data.startsWith('Set IP ok')) {\\n configsToAck.push(configIds.Controls.ClearBufferedMessages);\\n } else if (params.data.startsWith('flush ok')) {\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\n } else if (params.data.startsWith('Set Watch-')) {\\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 = (`Watch-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 = (`Watch;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 = (`Watch;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 = (`Watch-RTL;${params.imei};${location_time};${location_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n break;\\n }\\n if (!params.event_time && !event_time) { // if params.event_time undefined - set it to now. \\n var event_time = moment.utc().unix();\\n AddValue(codeValues, 'event_time', event_time);\\n }\\n // if (!params.location_time && !location_time) { // if params.location_time undefined - set it to now. \\n // var location_time = moment.utc().unix();\\n // AddValue(codeValues, 'location_time', location_time);\\n //}\\n }\\n // send data msg to kibana\\n const data = buildDataToReceiver(codeValues, configsToAck, configsToUpdate, configsToSend);\\n console.log(data);\\n return data\\n // end of main operation\\n // define functions used in operation\\n // decode global msg\\n function decoder(str) { // decode rawdata\\n // CARE Decoder\\n AddValue(codeValues, 'Message : ', str);\\n var message = str;\\n // need to check if checksum is correct for possible msg corruption 10/03/23\\n var checksum = message.substring(8, 12);\\n var messageBody = message.substring(16, message.length);\\n debug('message =' + message);\\n debug('checksum =' + checksum);\\n debug('calculateCheckSum =' + calculateCheckSum(messageBody));\\n if (calculateCheckSum(messageBody) == checksum) { // payload is valid\\n debug(\\\"message has valid checksum\\\");\\n var messageBody = command; // update value for the ACK\\n debug('command =' + command);\\n if (command == '01') {\\n while (index < total_length + 16) {\\n // gen_location = '0'; //cambiado 30/09\\n var keyLengthHex = message.substring(index, index = index + 2);\\n var keyLength = 2 * hexToDecimal(keyLengthHex);\\n var key = message.substring(index, index = index + 2);\\n var value = message.substring(index, index = index + keyLength - 2);\\n debug('key = ' + key);\\n debug('value = ' + value);\\n switch (key) {\\n //Device ID\\n case '01':\\n var imei = hexToAscii(value);\\n // create long connection if it is needed\\n if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\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\\n if ((alarmCodeExtInt & 1) == 1) {\\n var alarm = 'ALF-C';\\n }\\n // Welfare Check-out\\n else if ((alarmCodeExtInt & 2) == 2) {\\n var alarm = 'ALA-C';\\n }\\n // Standard Alerts\\n //Battery low\\n else if ((alarmCodeInt & 1) == 1) {\\n var alarm = 'BATL';\\n }\\n //Overspeed\\n else if ((alarmCodeInt & 2) == 2) {\\n var alarm = 'ALSP';\\n }\\n //Fall\\n else if ((alarmCodeInt & 4) == 4) {\\n var alarm = 'ALF';\\n }\\n //Tilt\\n else if ((alarmCodeInt & 8) == 8) {\\n var alarm = 'Tilt';\\n } else if ((alarmCodeInt & 16) == 16) {\\n if ((alarmCodeInt & 16777216) == 16777216) {\\n var alarm = 'Geo1-IN';\\n } else {\\n var alarm = 'Geo1-OUT';\\n }\\n } else if ((alarmCodeInt & 32) == 32) {\\n if ((alarmCodeInt & 33554432) == 33554432) {\\n var alarm = 'Geo2-IN';\\n } else {\\n var alarm = 'Geo2-OUT';\\n }\\n } else if ((alarmCodeInt & 64) == 64) {\\n if ((alarmCodeInt & 67108864) == 67108864) {\\n var alarm = 'Geo3-IN';\\n } else {\\n var alarm = 'Geo3-OUT';\\n }\\n } else if ((alarmCodeInt & 128) == 128) {\\n if ((alarmCodeInt & 134217728) == 134217728) {\\n var alarm = 'Geo4-IN';\\n } else {\\n var alarm = 'Geo4-OUT';\\n }\\n }\\n //Power Off\\n else if ((alarmCodeInt & 256) == 256) {\\n var alarm = 'PWRF';\\n }\\n //Power On\\n else if ((alarmCodeInt & 512) == 512) {\\n var alarm = 'PWRN';\\n }\\n //Motion\\n else if ((alarmCodeInt & 1024) == 1024) {\\n var alarm = 'ALMOV';\\n }\\n //No Motion\\n else if ((alarmCodeInt & 2048) == 2048) {\\n var alarm = 'ALNM';\\n }\\n //SOS\\n else if ((alarmCodeInt & 4096) == 4096) {\\n var alarm = 'ALSOS';\\n } else if ((alarmCodeInt & 8192) == 8192) {\\n var alarm = 'Side1';\\n } else if ((alarmCodeInt & 16384) == 16384) {\\n var alarm = 'Side2';\\n }\\n //Battery charging\\n else if ((alarmCodeInt & 32768) == 32768) {\\n var alarm = 'BATCN';\\n }\\n //Battery no charging\\n else if ((alarmCodeInt & 65536) == 65536) {\\n var alarm = 'BATCF';\\n }\\n //SOS Ending\\n // Temporary Commented until we know exactly how it works. 22/09/2022\\n else if ((alarmCodeInt & 131072) == 131072) {\\n var alarm = 'SOSEnding';\\n info = 'Alarm Finished';\\n }\\n //Amber Alert EC03 only\\n else if ((alarmCodeInt & 262144) == 262144) {\\n var alarm = 'ALAO';\\n }\\n // welfare Alert check-in ALA-O\\n else if ((alarmCodeInt & 524288) == 524288) {\\n var alarm = 'ALA-O';\\n }\\n // Amber alert Ending ALA-C\\n else if ((alarmCodeInt & 1048576) == 1048576) {\\n var alarm = 'ALA-C';\\n }\\n // Amber alert Ending ALA-C\\n //else if ((alarmCodeInt & 1048576) == 1048576) {\\n // var alarm = 'ALA-C';\\n //}\\n // Fall-Down Alert ending\\n else if ((alarmCodeInt & 2097152) == 2097152) {\\n var alarm = 'ALF-C';\\n }\\n // welfare Alert Ending ALA\\n else if ((alarmCodeInt & 4194304) == 4194304) {\\n var alarm = 'ALA';\\n }\\n // Beacon absent Alert 11/10/22. Need to be added in msg types\\n //else if ((alarmCodeInt & 16777216) == 16777216) {\\n // var alarm = 'BEA';\\n //}\\n general += 'alarm:' + alarm + ',';\\n break;\\n //Custom ID\\n case '03':\\n // in value is customID.... '06' for Watch Care\\n // if ((imei != '860470063029395') && (imei != '860470063035947')) {\\n //update customID to check if belongs to this type of device\\n //value = hexToAscii(value);\\n customID = value;\\n if (value != '3036') {\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n AddValue(codeValues, \\\"customID\\\", value);\\n // exit decoder\\n // const data = buildDataToReceiver(codeValues, configsToAck, configsToUpdate, configsToSend);\\n // console.log(data);\\n return // data\\n } else {\\n if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\n //return;\\n }\\n AddValue(codeValues, \\\"customID\\\", value);\\n general += 'customID:' + value + ',';\\n break;\\n }\\n //Historical Data Completed\\n case '10': // indica q se han terminado de enviar todos los datos historicos.\\n var histData = true;\\n break;\\n //GPS location\\n case '20':\\n location_type = 'GPS';\\n var latitudeHex = value.substring(0, 8);\\n var longitudeHex = value.substring(8, 16);\\n var speedHex = value.substring(16, 20);\\n var directionHex = value.substring(20, 24);\\n var altitudeHex = value.substring(24, 28);\\n var location_accuracyHex = value.substring(28, 32);\\n var mileageHex = value.substring(32, 40);\\n var satellitesHex = value.substring(40, 42);\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n speed = ((hexToDecimal(changeEndianness(speedHex))) / 3.6).toFixed(2); //date 14-02-2023 in m/s\\n var direction = hexToDecimal(changeEndianness(directionHex));\\n var altitude = hexToDecimal(changeEndianness(altitudeHex)); // in meters\\n //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\n // Range: 0.5 to 99.9 \\n location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\n //var mileage = hexToDecimal(changeEndianness(mileageHex)) this is in km/h we need m/s\\n var mileage = hexToDecimal(changeEndianness(mileageHex)); // in meters date 14-02-2023\\n var satellites = hexToDecimal(satellitesHex);\\n // location_time = timestamp;\\n //<>,<>,<>,<>,<>\\n gps_data = `${latitude},${longitude},${location_accuracy},${speed},${direction},${altitude},${satellites},${mileage}`;\\n general += 'gps location (lat):' + latitude + ', (long):' + longitude + ',';\\n break;\\n //WIFI Towers\\n case '22':\\n location_type = 'WIFI';\\n var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\n //location_time = timestamp;\\n var wifiTowers = value;\\n general += 'wifiTowers:';\\n var indexWifi = 0;\\n var bssid_array = [];\\n wifi_data = '';\\n for (let i = 0; i < numWifi; i++) {\\n wifi_data += hexToDecimalSigned(wifiTowers.substring(indexWifi, indexWifi + 2)) + ',' + wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\n indexWifi += 14;\\n }\\n wifi_data = wifi_data.slice(0, -1);\\n general += wifi_data;\\n break;\\n //BLE Location Added 10/10/22\\n case '23':\\n location_type = 'BLE';\\n var mac = value.substring(0, 12);\\n var latitudeHex = value.substring(12, 20);\\n var longitudeHex = value.substring(20, 28);\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n var address = hexToAscii(value.substring(28, value.length));\\n var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\n // add : format in MAC\\n mac = mac.match(/.{1,2}/g).join(':');\\n // location_time = timestamp;\\n ble_data = `${latitude},${longitude},${mac},${address}`;\\n general += 'BLE location (lat):' + latitude + ', (long):' + longitude + ',';\\n break;\\n //General Data , status_data\\n case '24':\\n //var general = 'true'\\n if (customID != '3036') {\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n AddValue(codeValues, \\\"customID\\\", customID);\\n return\\n }\\n if (alarmCode) {\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\n }\\n //else {\\n // messageForReceiver = (`CareWatch-CYC;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};`);\\n //}\\n // reset variables\\n //alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\n var timestampHex = value.substring(0, 8);\\n timestampHex = changeEndianness(timestampHex);\\n timestamp = hexToDecimal(timestampHex);\\n location_time = timestamp;\\n event_time = timestamp;\\n // HardCode to fix possible issue in protocol\\n //event_time = moment.utc().unix();\\n // end of hard code\\n var statusHex = changeEndianness(value.substring(8, 16));\\n var statusInt = hexToDecimal(statusHex);\\n var statusDevice = '';\\n if ((statusInt & 1) == 1) {\\n statusDevice += 'GPS,';\\n }\\n if ((statusInt & 2) == 2) {\\n statusDevice += 'WIFISource,';\\n }\\n if ((statusInt & 4) == 4) {\\n statusDevice += 'CellTower,';\\n }\\n if ((statusInt & 8) == 8) {\\n statusDevice += 'BLELocation,';\\n }\\n //params.BatteryStatus.BatteryStatus = '1';\\n if ((statusInt & 16) == 16) {\\n statusDevice += 'Charging,';\\n // var alarm = 'BATCN';\\n //configs.BatteryStatus.BatteryStatus = '1';\\n /* if (configs.BatteryStatus.BatteryStatus !== '1') {\\n hasConfigs = true;\\n var batteryStatus = '1';\\n var alarm = 'BATCN';\\n let configsToUpdate = [];\\n configsToUpdate.push({\\n 'code': configIds.BatteryStatus.BatteryStatus,\\n 'value': batteryStatus\\n });\\n }*/\\n }\\n if ((statusInt & 32) == 32) {\\n statusDevice += 'FUllyCharged,';\\n //var alarm = 'BATF';\\n // configs.BatteryStatus.BatteryStatus = '3';\\n /* if (configs.BatteryStatus.BatteryStatus !== '3') {\\n hasConfigs = true;\\n var batteryStatus = '3';\\n var alarm = 'BATF';\\n let configsToUpdate = [];\\n configsToUpdate.push({\\n 'code': configIds.BatteryStatus.BatteryStatus,\\n 'value': batteryStatus\\n });\\n }*/\\n }\\n /* if (!((statusInt & 32) == 32) & !((statusInt & 16) == 16)) {\\n statusDevice += 'Not Charging,';\\n var alarm = 'BATCF';\\n //configs.BatteryStatus.BatteryStatus = '2';\\n if (configs.BatteryStatus.BatteryStatus !== '2') {\\n var batteryStatus = '2';\\n var alarm = 'BATCF';\\n let configsToUpdate = [];\\n configsToUpdate.push({\\n 'code': configIds.BatteryStatus.BatteryStatus,\\n 'value': batteryStatus\\n });\\n }\\n }*/\\n if ((statusInt & 64) == 64) {\\n statusDevice += 'Reboot,';\\n }\\n if ((statusInt & 128) == 128) {\\n statusDevice += 'HistoricalData,';\\n }\\n if ((statusInt & 256) == 256) {\\n statusDevice += 'AGPSDataValid,';\\n }\\n if ((statusInt & 512) == 512) {\\n statusDevice += 'Motion,';\\n }\\n if ((statusInt & 1024) == 1024) {\\n statusDevice += 'SmartLocating,';\\n }\\n if ((statusInt & 2048) == 2048) { //isHome\\n statusDevice += 'BeaconLocation,';\\n }\\n if ((statusInt & 4096) == 4096) {\\n statusDevice += 'BLEConnected,';\\n }\\n if ((statusInt & 16384) == 16384) {\\n statusDevice += 'HomeWiFi,';\\n }\\n statusDevice = statusDevice.slice(0, -1);\\n status_data = statusDevice; //to oysta template\\n //statusHex = (statusHex);\\n statusHex = hexToBin(statusHex);\\n statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\n battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\n cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\n workMode = parseInt(statusHex.substring(13, 16), 2);\\n general += 'statusDevice:' + statusDevice + ',';\\n if (battery_percentage) {\\n general += 'battery:' + battery_percentage + ',';\\n }\\n if (cellNetworkSignal) {\\n general += 'cellNetworkSignal:' + cellNetworkSignal + ',';\\n }\\n if (workMode) {\\n general += 'workMode:' + workMode + ',';\\n }\\n //messageForReceiver = (`CareWatch-CYC;${imei};${i};${event_time};${battery_percentage}`);\\n break;\\n //Call Records\\n case '25':\\n //Needed?\\n break;\\n //BLE Location 2\\n case '26':\\n //I don't understand\\n //messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n //Smart Location\\n case '27':\\n location_type = 'SMART';\\n var latitudeHex = value.substring(0, 8);\\n var longitudeHex = value.substring(8, 16);\\n var location_accuracyHex = value.substring(16, 20);\\n var altitudeHex = value.substring(20, 24);\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n var altitude = hexToDecimal(changeEndianness(altitudeHex));\\n //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\n //04/08/2022 se quita el multiplicador por 5 pq ya viene el valor en metros\\n location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\n //location_time = timestamp;\\n smart_data = `${latitude},${longitude},${location_accuracy},${altitude}`;\\n general += 'smart location (lat):' + latitude + ', (long):' + longitude + ',';\\n break;\\n //Beacon Location Added 11/10/22\\n case '28':\\n location_type = 'BEACON';\\n // var alarm = 'EBZI';\\n var latitudeHex = '00';\\n var longitudeHex = '00';\\n var descr = 'empty';\\n var flag = hexToDecimal(value.substring(0, 1));\\n var beacId = hexToDecimal(value.substring(1, 2));\\n // msg includes descrip\\n if ((flag & 4) == 4) {\\n descr = hexToAscii(value.substring(18, value.length));\\n }\\n // msg includes lat/lon\\n if ((flag & 8) == 8) {\\n latitudeHex = value.substring(18, 26);\\n longitudeHex = value.substring(26, 34);\\n }\\n // msg includes lat/lon and description\\n if ((flag & 12) == 12) {\\n latitudeHex = value.substring(18, 26);\\n longitudeHex = value.substring(26, 34);\\n descr = hexToAscii(value.substring(34, value.length));\\n }\\n var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\n // add : format in MAC\\n mac = mac.match(/.{1,2}/g).join(':');\\n var rssiHex = value.substring(14, 16);\\n var rssi1Hex = value.substring(16, 18);\\n rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\n rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\n // var latitudeHex = value.substring(18, 26);\\n // var longitudeHex = value.substring(26, 34);\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n //location_time = timestamp;\\n beacon_data = `${latitude},${longitude},${mac},${descr}`;\\n general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (listIndex):' + beacId + ',';\\n break;\\n // Beacon V2\\n case '2C':\\n location_type = 'BEACON';\\n // var alarm = 'EBZI';\\n var latitudeHex = '00';\\n var longitudeHex = '00';\\n var descr = 'empty';\\n var flag = hexToDecimal(value.substring(0, 1));\\n var beacId = hexToDecimal(value.substring(1, 2));\\n // msg includes descrip\\n if ((flag & 4) == 4) {\\n let desc_leng = hexToDecimal(value.substring(20, 22));\\n descr = hexToAscii(value.substring(22, 22 + (2 * desc_leng)));\\n //descr = hexToAscii(value.substring(18, value.length));\\n }\\n // msg includes lat/lon\\n if ((flag & 8) == 8) {\\n latitudeHex = value.substring(18, 26);\\n longitudeHex = value.substring(26, 34);\\n }\\n // msg includes lat/lon and description\\n if ((flag & 12) == 12) {\\n latitudeHex = value.substring(20, 28);\\n longitudeHex = value.substring(28, 36);\\n let desc_leng = hexToDecimal(value.substring(36, 38));\\n descr = hexToAscii(value.substring(38, 38 + (2 * desc_leng)));\\n }\\n var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\n // add : format in MAC\\n mac = mac.match(/.{1,2}/g).join(':');\\n var rssiHex = value.substring(14, 16);\\n var rssi1Hex = value.substring(16, 18);\\n rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\n rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\n var battery_beacon = hexToDecimal(value.substring(18, 20));\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n //location_time = timestamp;\\n beacon_data = `${latitude},${longitude},${mac},${descr}`;\\n general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (battery):' + battery_beacon + ', (listIndex):' + beacId + ',';\\n break;\\n //Cell Towers Note\\n case '29':\\n location_type = 'LBS';\\n lbs_data = '';\\n var mccHex = changeEndianness(value.substring(0, 4));\\n var mncHex = value.substring(4, 6);\\n var mcc = hexToDecimal(mccHex);\\n lbs_data += mcc + ',';\\n var mnc = hexToDecimal(mncHex);\\n lbs_data += mnc + ',';\\n var indexLbs = 6;\\n var numTowers = (hexToDecimal(keyLengthHex) - 4) / 7;\\n for (let i = 0; i < numTowers; i++) {\\n var rxlHex = changeEndianness(value.substring(indexLbs, indexLbs + 2));\\n var rxl = hexToDecimal(rxlHex);\\n var lacHex = changeEndianness(value.substring(indexLbs + 2, indexLbs + 6));\\n var lac = hexToDecimal(lacHex);\\n var cellTowers = hexToDecimal(changeEndianness(value.substring(indexLbs + 6, indexLbs + 14)));\\n lbs_data += rxl + ',' + lac + ',' + cellTowers + ',';\\n indexLbs += 14;\\n }\\n lbs_data = lbs_data.slice(0, -1);\\n general += lbs_data;\\n break;\\n case '30':\\n //G-sensor.\\n //value = hexToAscii(value);\\n //if (value != '06') {\\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 = (`Watch-${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 //value = hexToAscii(value);\\n //if (value != '06') {\\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 = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n }\\n break;\\n //BLE Connected . For Flic button\\n case '62':\\n location_type = 'BLE';\\n //var alarm = 'EBZI'; \\n //var latitudeHex = '00';\\n //var longitudeHex = '00';\\n //var descr = 'empty';\\n var flag = hexToDecimal(value.substring(0, 2)); // 0= Disconnected, 1= Connected\\n var mac = value.substring(2, 14); // No hace falta darle la vuelta\\n // add : format in MAC\\n mac = mac.match(/.{1,2}/g).join(':');\\n var batLevel = hexToDecimal(value.substring(14, 16)); // 0-100\\n //location_time = timestamp;\\n ble_data = `${flag},${batLevel},${mac}`;\\n general += 'BLE location (State):' + flag + ', (bat):' + batLevel + ', (mac):' + mac + ',';\\n break;\\n }\\n }\\n if (alarmCode) {\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};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 = (`Watch;ACK-FIRM;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\n //AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\n configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\n //configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\n //messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n case '1A':\\n //no ACK need\\n var fwVersion = hexToAscii(value);\\n imei = serverParams.Imei;\\n AddValue(codeValues, \\\"imei\\\", imei);\\n AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\n messageForReceiver = (`Watch;ACK-FIRM;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\n //AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\n configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\n //configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\n break;\\n //IMEI\\n case '03':\\n var imei = hexToDecimal(value);\\n // harcode to avoid conflicts with Rio protocol\\n //if ((imei != '860470063029395') && (imei != '860470063035947')) {\\n // AddValue(codeValues, \\\"error\\\", \\\"device imei is not in this protocol\\\");\\n // AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n //AddValue(codeValues, \\\"IMEI\\\", imei);\\n // return\\n //}\\n if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\n //return;\\n }\\n messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n //ICCID\\n case '04':\\n var iccid = hexToDecimal(value);\\n messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n //BLE-MAC\\n case '05':\\n var bleMac = hexToDecimal(value);\\n messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n //Run Time\\n case '07':\\n var runTime = hexToDecimal(value);\\n messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n case '10': // Ringer Volume\\n var volume = hexToDecimal(value);\\n imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-VOL;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"Volume\\\", volume);\\n AddValue(configsToUpdate, configIds.ReadSystemSettings.Volume, volume);\\n configsToAck.push(configIds.ReadSystemSettings.Volume);\\n break;\\n case '0A': //Performance mode\\n //var workMode = hexToDecimal(value);\\n //messageBody = messageBody + keyLengthHex + key + value;\\n //AddValue(codeValues, \\\"WorkMode\\\", workMode);\\n //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\n //configsToAck.push(configIds.ReadPerformance`Settings.Mode);\\n //var workMode = hexToAscii(value.substring(0, value.length));\\n //var workMode = hexToDecimal(value);\\n //var workMode = hexToAscii(value.substring(0, value.length));\\n var workMode = 1234; // + value + \\\"end\\\";\\n //var workModeVal = 9;\\n //workMode = 'test10';\\n imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-MODE;${imei};`);\\n AddValue(codeValues, \\\"Mode\\\", workMode);\\n AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\n configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n //AddValue(codeValues, \\\"performanceMode\\\", performanceMode);\\n //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, performanceMode);\\n // configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\n break;\\n case '1B':\\n //Decimal o ascii?\\n var gsmModule = hexToDecimal(value);\\n messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n case '1F':\\n //System Language\\n var systemLanguage = hexToAscii(value.substring(0, value.length));\\n imei = serverParams.Imei;\\n //messageBody = messageBody + keyLengthHex + key + value;\\n messageForReceiver = (`Watch;ACK-LANG;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"SystemLanguage\\\", systemLanguage);\\n AddValue(configsToUpdate, configIds.ReadSystemSettings.SystemLanguage, systemLanguage);\\n configsToAck.push(configIds.ReadSystemSettings.SystemLanguage);\\n break;\\n case '33': // phone option\\n // [Value]:83 0B 00 00 {\\\"phoneOption\\\":{\\\"flag_value\\\":2947,\\\"s3\\\":1,\\\"s4\\\":0,\\\"s5\\\":1,\\\"s6\\\":0,\\\"callIncoming\\\":0,\\\"rings\\\":3,\\\"s7\\\":0,\\\"toneID\\\":0,\\\"s1\\\":1,\\\"s2\\\":1}}\\n var statusPhone = hexToBin(value.substring(0, 2)); // To find autoanswer setup\\n if (statusPhone.substring(0, 1) == '1') { // 1 Enable\\n var auto = 'true';\\n } else var auto = 'false';\\n statusPhone = hexToBin(value.substring(2, 4)); // To find allow list setup\\n if (statusPhone.substring(7, 8) == '1') { // 1 Enable\\n allow = 'true';\\n } else var allow = 'false';\\n //statusPhone = hexToBin(value.substring(0, 2)) + hexToBin(value.substring(2, 4));\\n //AddValue(configsToUpdate, configIds.ReadSystemSettings.Statusphone, statusPhone);\\n AddValue(configsToUpdate, configIds.ReadSystemSettings.AllowList, allow);\\n AddValue(configsToUpdate, configIds.ReadSystemSettings.AutoAnswer, auto);\\n //configsToAck.push(configIds.ReadSystemSettings.Statusphone);\\n configsToAck.push(configIds.ReadSystemSettings.AllowList);\\n configsToAck.push(configIds.ReadSystemSettings.AutoAnswer);\\n break;\\n case '34': //ContactList with name\\n var contactNumber = value.substring(1, 2);\\n var telLength = hexToDecimal(value.substring(2, 4));\\n var tel = '';\\n switch (contactNumber) {\\n // Emergency Number\\n case '0':\\n tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\n AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\n AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\n configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\n break;\\n // Speed Dial Number\\n //case '1':\\n // tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\n // AddValue(codeValues, \\\"SpeedDialNumber\\\", tel);\\n // AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.SpeedDialNumber, tel);\\n // configsToAck.push(configIds.ReadSpeedDialSettings.SpeedDialNumber);\\n // break;\\n // Gateway Number\\n case '9': //00447781482635,Esendex UK 0034627177148,Esendex Spain 00447507288240,Esendex UK Acceptance\\n tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\n if (tel.includes('447781482635') || tel.includes('00447781482635')) {\\n tel = 'Esendex UK'\\n } else if (tel.includes('34627177148') || tel.includes('0034627177148')) {\\n tel = 'Esendex Spain'\\n } else if (tel.includes('447507288240') || tel.includes('00447507288240')) {\\n tel = 'Esendex UK Acceptance'\\n } else {\\n tel = 'Default'\\n }\\n AddValue(codeValues, \\\"SMSGateway\\\", tel);\\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\n configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\n break;\\n default:\\n tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\n if (tel.length < 6) {\\n contacts += '';\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\n break;\\n }\\n //contacts += 'A' + (contactNumber - 1) + ': ' + tel + ', ';\\n contacts += tel + ', ';\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\n break;\\n }\\n break;\\n case '40': // APN\\n //no ACK need\\n AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'));\\n configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\n var apn = hexToAscii(value.substring(0, value.length));\\n imei = serverParams.Imei;\\n break;\\n case '41': // APN Username\\n //no ACK need\\n //apn = apn + ',' + hexToAscii(value.substring(0, value.length));\\n break;\\n case '42': // APN Password\\n //no ACK need\\n //apn = apn + ',' + hexToAscii(value.substring(0, value.length));\\n messageForReceiver = (`Watch;ACK-GDATA;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"apn\\\", apn);\\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.APN, apn);\\n configsToAck.push(configIds.ReadCommunicationSettings.APN);\\n break;\\n case '43': //Server Details\\n //52.232.85.255,5678 production 52.174.17.77,5678 acceptance\\n var serverDetails = hexToAscii(value.substring(6, value.length)) + ':' + hexToDecimal(value.substring(4, 6) + value.substring(2, 4));\\n if (serverDetails.includes('52.232.85.255:5678')) {\\n serverDetails = 'Production'\\n } else if (serverDetails.includes('52.174.17.77:5678')) {\\n serverDetails = 'Acceptance'\\n } else if (serverDetails.includes('52.174.17.77:5778')) {\\n serverDetails = 'Protocol-Import'\\n } else if (serverDetails.includes('52.174.17.77:5878')) {\\n serverDetails = 'Protocol-Dev'\\n } else {\\n serverDetails = 'Default'\\n }\\n AddValue(codeValues, \\\"server\\\", serverDetails);\\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.Server, serverDetails);\\n configsToAck.push(configIds.ReadCommunicationSettings.Server);\\n break;\\n case '44': //time interval - work mode intervals\\n imei = serverParams.Imei;\\n messageForReceiver = (`Watch;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 = (`Watch;ACK-CUSTID;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"customeid\\\", value);\\n AddValue(configsToUpdate, configIds.ReadState.CustomId, hexToAscii(value)); //now it comes \\\"3036\\\"\\n configsToAck.push(configIds.ReadState.CustomId);\\n break;\\n case '53': // Non motion alert\\n //2B020080\\n var status = hexToBin(value.substring(6, 8));\\n var alertSetting = '';\\n var enableDisable = '';\\n if (status.substring(0, 1) == '1') {\\n alertSetting = 'Enable, '\\n enableDisable = '1';\\n } else {\\n alertSetting = 'Disable, '\\n };\\n //if (status.substring(5, 6) == '1') {\\n // alertSetting += 'Dial, '\\n //} else {\\n // alertSetting += 'No Dial, '\\n //};\\n var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\n alertSetting += time;\\n imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-NOMOTION;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"nomotion\\\", alertSetting);\\n //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings, enableDisable);\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\n //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\n configsToAck.push(configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings);\\n configsToAck.push(configIds.ReadNonMovementSettings.Time);\\n break;\\n case '56': //Fall down sensibility\\n // '00001100'\\n var fallStatus = hexToBin(value.substring(0, 2));\\n var enalbleDisable = '';\\n //if (fallStatus.substring(4, 5) == '1') {\\n if (fallStatus.substring(0, 1) == '1') {\\n var sensibility = 'Enable, '\\n enalbleDisable = '1'\\n } else {\\n var sensibility = 'Disable, '\\n };\\n if (fallStatus.substring(5, 6) == '1') {\\n sensibility += 'Dial, '\\n } else {\\n sensibility += 'No Dial, '\\n };\\n var imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-FALLALERT;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n var sesibityOptionValue = hexToDecimal(value.substring(1, 2));\\n sensibility += sesibityOptionValue;\\n AddValue(codeValues, \\\"sensibility\\\", sensibility);\\n //AddValue(configsToUpdate, configIds.ReadAlertSettings.FallSettings, sensibility);\\n AddValue(configsToUpdate, configIds.ReadFallSettings.EnableDisableFallSettings, enalbleDisable);\\n AddValue(configsToUpdate, configIds.ReadFallSettings.Sensitivity, sesibityOptionValue);\\n //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\n configsToAck.push(configIds.ReadFallSettings.EnableDisableFallSettings);\\n configsToAck.push(configIds.ReadFallSettings.Sensitivity);\\n break;\\n case '73': //BeaconList\\n var beaconNumber = hexToDecimal(value.substring(1, 2));\\n var beaconStatus = hexToBin(value.substring(0, 1));\\n beaconStatus = hexToAscii(value.substring(30, value.length));\\n //beaconStatus = changeEndianness(value.substring(30, value.length));\\n //homeBeacon += 'B' + (beaconNumber + 1) + ': ' + beaconStatus + ', ';\\n homeBeacon += beaconStatus + ', ';\\n AddValue(codeValues, \\\"homeBeacon\\\", homeBeacon);\\n messageForReceiver = (`Watch;ACK-GDATA;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\n configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\n break;\\n case '4A': //Wifi Network List\\n var wifiSSIDLenght = hexToDecimal(value.substring(2, 4));\\n var wifiPasswordLenght = hexToDecimal(value.substring(4, 6));\\n var wifiIndex = hexToDecimal(value.substring(1, 2));\\n //var wifiStatus = hexToDecimal(value.substring(0, 1));\\n var wifiStatus = value.substring(0, 1);\\n /*var enalbleDisable = wifiSSID = wifiPassword = homeWifi = '';\\n /var homeWifi = '';\\n if (wifiIndex == '0') { // Only first Wifi of the list\\n if (wifiStatus == '8') {\\n homeWifi += ' Enable, '\\n enalbleDisable = '1';\\n } else {\\n homeWifi += ' Disable, '\\n //enalbleDisable = '0';\\n };*/\\n if ((wifiStatus == '8') || (wifiStatus == 'C')) { // 8 == ON OR C== ON and Connected\\n var wifiSSID = hexToAscii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\n var wifiPassword = hexToAscii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\n var imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-WIFI;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n //homeWiFi += 'W' + (wifiIndex + 1) + ': ' + wifiSSID + ', ' + wifiPassword + ';';\\n homeWiFi += wifiSSID + ', ' + wifiPassword + ';';\\n AddValue(codeValues, \\\"wifi\\\", homeWiFi);\\n AddValue(configsToUpdate, configIds.ReadWiFiList.WiFiList, homeWiFi);\\n configsToAck.push(configIds.ReadWiFiList.WiFiList);\\n }\\n //AddValue(configsToUpdate, configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings, enalbleDisable);\\n //AddValue(configsToUpdate, configIds.ReadWiFiSettings.SSID, wifiSSID);\\n //AddValue(configsToUpdate, configIds.ReadWiFiSettings.Password, wifiPassword);\\n //configsToAck.push(configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings);\\n //configsToAck.push(configIds.ReadWiFiSettings.SSID);\\n //configsToAck.push(configIds.ReadWiFiSettings.Password);\\n break;\\n case '21': // Speed Dial Settings\\n // [Value]:53 84 {\\\"call1Button\\\":{\\\"mode\\\":0,\\\"feedBack\\\":3,\\\"task\\\":2,\\\"time\\\":20,\\\"status\\\":1}}\\n var status = hexToBin(value.substring(2, 4)); //always pass 2 HEXs to this function\\n var alertSetting = '';\\n var enalbleDisable = '';\\n if (status.substring(0, 1) == '1') {\\n alertSetting = 'Enable, '\\n enalbleDisable = '1'\\n } else {\\n alertSetting = 'Disable, '\\n //enableDisable = '0';\\n };\\n //var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\n //alertSetting += time;\\n imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-SPEED;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"speed\\\", alertSetting);\\n //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\n AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\n //AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\n //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\n configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\n //configsToAck.push(configIds.ReadNonMovementSettings.Time);\\n break;\\n }\\n }\\n }\\n if (command == '03') {\\n while (index < total_length + 16) {\\n var keyLengthHex = message.substring(index, index = index + 2);\\n var keyLength = 2 * hexToDecimal(keyLengthHex);\\n var key = message.substring(index, index = index + 2);\\n var value = message.substring(index, index = index + keyLength - 2);\\n debug('key = ' + key);\\n debug('value = ' + value);\\n switch (key) {\\n case '01': // Device ID\\n var imei = hexToAscii(value);\\n // create long connection if it is needed\\n if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\n //return;\\n }\\n break;\\n //CustomID is not provided so far with command type 03.. commented in the mean time\\n /* case '03':\\n //update customID to check if belongs to this type of device\\n customID = value;\\n if (value != '04') {\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n AddValue(codeValues, \\\"customID\\\", value);\\n return\\n } else {\\n if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\n }\\n AddValue(codeValues, \\\"customID\\\", value);\\n general += 'customID:' + value + ',';\\n break;\\n }\\n break; */\\n case '10': // Heartbeat\\n var heartbeat = hexToAscii(value);\\n event_time = moment.utc().unix();\\n if (index < total_length + 16) {\\n var keyLengthHex = message.substring(index, index = index + 2);\\n keyLength = 2 * hexToDecimal(keyLengthHex);\\n key = message.substring(index, index = index + 2);\\n if (key == '24') {\\n // debug('key: ' + key) //comment those out\\n value = message.substring(index, index = index + keyLength - 2);\\n // debug(value)\\n var timestampHex = value.substring(0, 8);\\n // debug('timestampt hex: ' + timestampHex)\\n timestampHex = changeEndianness(timestampHex);\\n timestamp = hexToDecimal(timestampHex);\\n event_time = timestamp;\\n // debug(event_time)\\n var statusHex = changeEndianness(value.substring(8, 16));\\n // debug(statusHex)\\n var statusInt = hexToDecimal(statusHex);\\n var statusDevice = '';\\n if ((statusInt & 1) == 1) {\\n statusDevice += 'GPS,';\\n }\\n if ((statusInt & 2) == 2) {\\n statusDevice += 'WIFISource,';\\n }\\n if ((statusInt & 4) == 4) {\\n statusDevice += 'CellTower,';\\n }\\n if ((statusInt & 8) == 8) {\\n statusDevice += 'BLELocation,';\\n }\\n if ((statusInt & 16) == 16) {\\n statusDevice += 'Charging,';\\n }\\n if ((statusInt & 32) == 32) {\\n statusDevice += 'FUllyCharged,';\\n }\\n if ((statusInt & 64) == 64) {\\n statusDevice += 'Reboot,';\\n }\\n if ((statusInt & 128) == 128) {\\n statusDevice += 'HistoricalData,';\\n }\\n if ((statusInt & 256) == 256) {\\n statusDevice += 'AGPSDataValid,';\\n }\\n if ((statusInt & 512) == 512) {\\n statusDevice += 'Motion,';\\n }\\n if ((statusInt & 1024) == 1024) {\\n statusDevice += 'SmartLocating,';\\n }\\n if ((statusInt & 2048) == 2048) {\\n statusDevice += 'BeaconLocation,';\\n }\\n if ((statusInt & 4096) == 4096) {\\n statusDevice += 'BLEConnected,';\\n }\\n statusDevice = statusDevice.slice(0, -1);\\n // debug('statusHex:' + statusHex)\\n statusHex = (statusHex);\\n statusHex = hexToBin(statusHex);\\n statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\n // debug(statusHex)\\n battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\n // debug(battery_percentage)\\n // debug(battery_percentage)\\n // debug(statusHex.substring(8, 13))\\n cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\n // debug(cellNetworkSignal)\\n workMode = parseInt(statusHex.substring(13, 16), 2);\\n // debug(workMode)\\n general += 'statusDevice:' + statusDevice + ';';\\n if (battery_percentage) {\\n general += 'battery:' + battery_percentage + ';';\\n }\\n if (cellNetworkSignal) {\\n general += 'cellNetworkSignal:' + cellNetworkSignal + ';';\\n }\\n if (workMode) {\\n general += 'workMode:' + workMode + ';';\\n }\\n }\\n }\\n // revisar\\n var gen_location = '0';\\n //CustomID is not provided so far with command type 03.. commented in the mean time\\n /*if (customID != '04') {\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n AddValue(codeValues, \\\"customID\\\", value);\\n return\\n }*/\\n //messageForReceiver = (`Eview-HTB;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};SIGNAL=${cellNetworkSignal};WM=${workMode};SL=${systemLanguage};GENERAL=${general}`);\\n messageForReceiver = (`Watch-HTB;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n //messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n case '12': // Device requesting timestamp\\n timestamp = moment.utc().unix();\\n timestampHex = decimalToHex(timestamp);\\n timestampHex = changeEndianness(timestampHex);\\n keyLengthHex = ('00' + decimalToHex(1 + (timestampHex.length) / 2)).slice(-2);\\n // respond to device with the timestamp of the server\\n messageBody = messageBody + keyLengthHex + key + timestampHex;\\n messageForReceiver = `Eview;${imei};${sequenceID};Get timestamp`;\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n break;\\n case '21': //Cell Towers\\n var mccHex = value.substring(0, 2);\\n var mncHex = value.substring(2, 3);\\n var mcc = hexToDecimal(mccHex);\\n var mnc = hexToDecimal(mncHex);\\n var numTowers = (keyLength - 4) / 5;\\n var cellTowers = hexToAscii(value);\\n messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n case '22': // WIFI locations \\n location_type = 'WIFI';\\n var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\n //location_time = timestamp;\\n var wifiTowers = value;\\n general += 'wifiTowers:';\\n var indexWifi = 0;\\n var bssid_array = [];\\n gen_location = '';\\n for (let i = 0; i < numWifi; i++) {\\n gen_location += wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\n indexWifi += 14;\\n }\\n gen_location = gen_location.slice(0, -1);\\n general += gen_location;\\n //CustomID is not provided so far with command type 03\\n /*if (customID != '04') {\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n AddValue(codeValues, \\\"customID\\\", value);\\n return\\n }*/\\n if (alarmCode) {\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};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 = (`Watch-ACK;${imei};${message}`); // ${sequenceID}; add ${sequenceID}; 19-07\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n var value = message.substring(index, index = index + keyLength - 2);\\n if (typeof configIds !== 'undefined' && configIds && configIds.ConfigureDevice && configIds.ConfigureDevice.LastConfigured) { // when is defined\\n AddValue(configsToUpdate, configIds.ConfigureDevice.LastConfigured, moment().format('YYYY/MM/DD, HH:mm:ss'));\\n configsToAck.push(configIds.ConfigureDevice.LastConfigured);\\n }\\n //}\\n }\\n if (command == 'FE') {\\n while (index < total_length + 16) {\\n var keyLength = message.substring(index, index = index + 2);\\n keyLength = 2 * hexToDecimal(keyLength);\\n var key = message.substring(index, index = index + 2);\\n var value = message.substring(index, index = index + keyLength - 2);\\n }\\n }\\n // prepare the ACK msg and change config if it is needed\\n lengthAck = messageBody.length / 2;\\n lengthAck = ('0000' + decimalToHex(lengthAck)).slice(-4);\\n lengthAck = lengthAck.toString().substring(2, 4) + lengthAck.toString().substring(0, 2);\\n ////////////checksum CRC 16\\n var checksumAck = byteStringToByteArray(messageBody);\\n checksumAck = crc16byte(checksumAck);\\n checksumAck = decimalToHex(checksumAck);\\n checksumAck = ('0000' + checksumAck).slice(-4);\\n checksumAck = checksumAck.toString().substring(2, 4) + checksumAck.toString().substring(0, 2);\\n prefix = prefix + lengthAck + checksumAck + sequenceID;\\n // To send ACK to the device previous to internal msg with parts\\n if (needsAck == true) {\\n if (messageBody.length <= 2) {\\n ack = 'AB00030008C7' + sequenceID + '7F0100'; // change AB10030008C7 to AB00030008C7\\n } else {\\n ack = prefix + messageBody;\\n }\\n AddValue(codeValues, 'imei', imei);\\n AddValue(codeValues, 'ack', ack);\\n }\\n } else { // checksum was invalid - print out useful debug info and bet quess at imei \\n AddValue(codeValues, \\\"error\\\", \\\"checksum failed for message\\\");\\n AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n i = rawFromBytes.search('3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]');\\n if (i >= 0) {\\n imei = hexToAscii(rawFromBytes.substring(i, i + 30));\\n AddValue(codeValues, \\\"imei\\\", imei);\\n }\\n }\\n }\\n // Auxiliary functions\\n function buildDataToReceiver(codeValues, configsToAck = [], configsToUpdate = [], configsToSend = []) {\\n const dataToReceiver = {\\n values: codeValues\\n };\\n if (configsToAck.length > 0) {\\n dataToReceiver.configsToAck = configsToAck;\\n }\\n if (configsToUpdate.length > 0) {\\n dataToReceiver.configsToUpdate = configsToUpdate;\\n }\\n if (configsToSend.length > 0) {\\n dataToReceiver.configsToSend = configsToSend;\\n }\\n return dataToReceiver;\\n }\\n\\n function AddValue(codeValueArray, p1, p2) { // push code value pair into array\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n codeValueArray.push(cvpair);\\n }\\n // convert functions\\n function asciiToHex(str) { // ascii to hex \\n return [...str].map(char => char.charCodeAt(0).toString(16).padStart(2, '0')).join('');\\n }\\n\\n function byteStringToByteArray(str) { // convierte una cadena hexadecimal en un array de bytes (number[])\\n const bytes = [];\\n for (let i = 0; i < str.length; i += 2) {\\n const byte = parseInt(str.substring(i, i + 2), 16);\\n if (!isNaN(byte) && byte >= 0 && byte <= 255) {\\n bytes.push(byte);\\n }\\n }\\n return bytes;\\n }\\n\\n function decimalToHex(x) {\\n return Number(x).toString(16).toUpperCase();\\n }\\n\\n function hexToBin(hex) { // convierte un valor hexadecimal a su representación binaria, y asegura que tenga al menos 8 bits \\n const bin = parseInt(hex, 16).toString(2);\\n return bin.padStart(hex.length * 4, '0');\\n }\\n\\n function hexToAscii(hex) {\\n if (hex.length % 2 !== 0) {\\n throw new Error(\\\"Hex string length must be even\\\");\\n }\\n let ascii = '';\\n for (let i = 0; i < hex.length; i += 2) {\\n const byte = hex.substr(i, 2);\\n const charCode = parseInt(byte, 16);\\n if (charCode !== 0) { // remove null character (\\\\u0000)\\n ascii += String.fromCharCode(charCode);\\n }\\n }\\n return ascii;\\n //return hex.match(/.{2}/g).map(byte => String.fromCharCode(parseInt(byte, 16))).join('');\\n }\\n\\n function hexToDecimalSigned(hex) { // hex to decimal\\n if (hex.length % 2 !== 0) {\\n hex = '0' + hex;\\n }\\n const num = parseInt(hex, 16);\\n const bits = hex.length * 4;\\n const maxVal = 2 ** bits;\\n return num >= maxVal / 2 ? num - maxVal : num;\\n }\\n\\n function hexToDecimal(hex) {\\n return parseInt(hex, 16);\\n }\\n // CheckSum and debug functions\\n function changeEndianness(hexString) { // changeEndianness\\n if (hexString.length === 0) { //if string is empty or not defined\\n return \\\"\\\";\\n }\\n if (hexString.length % 2 !== 0) {\\n throw new Error(\\\"Hex string length must be even\\\");\\n }\\n return hexString.match(/.{2}/g) // divide in bytes (2 chars)\\n .reverse() // reverse the order\\n .join('');\\n }\\n\\n function calculateCheckSum(payloadData) { // calcula el CRC16 sobre una cadena hexadecimal y devuelve el valor con el endianness invertido\\n const bytes = byteStringToByteArray(payloadData);\\n const crc = crc16byte(bytes);\\n const hex = crc.toString(16).padStart(4, '0').toUpperCase();\\n return changeEndianness(hex);\\n }\\n\\n function crc16byte(byteArray) { // calcula el CRC-16 sobre un array de bytes usando una tabla precalculada (crcTable)\\n let crc = 0x0000;\\n for (const byte of byteArray) {\\n if (byte < 0 || byte > 255 || !Number.isInteger(byte)) {\\n throw new RangeError(\\\"Invalid byte value in input array\\\");\\n }\\n const index = (byte ^ (crc >> 8)) & 0xFF;\\n crc = crcTable[index] ^ (crc << 8);\\n }\\n return crc & 0xFFFF;\\n }\\n\\n function debug(...args) { // write debug info to console log, if localTesting\\n if (localTesting) {\\n console.debug('[DEBUG]', ...args);\\n }\\n }\\n /*\\n function sendMessageToLocalhostNoWait(str) { // sends message to system, closing connection after\\n var server;\\n if (localTesting) {\\n console.log('local testing - sending to protocol-dev server the message ... '); // port 5878\\n console.log(str);\\n server = '52.174.17.77';\\n } else {\\n server = '127.0.0.1';\\n }\\n var c = net.createConnection(5878, server);\\n c.on('error', function(error) {\\n c = net.createConnection(5878, server);\\n });\\n c.write(`${str}`);\\n c.end();\\n }*/\\n function sendMessageToLocalhostNoWait(message) {\\n const server = localTesting ? '52.174.17.77' : '127.0.0.1';\\n //const port = localTesting ? '5878' : ''; //Protocol-dev\\n const port = '5678'; //acceptance-dev\\n if (localTesting) {\\n console.debug('[DEBUG] Sending message to test server:', message);\\n }\\n const client = net.createConnection(port, server, () => {\\n client.write(message);\\n client.end();\\n });\\n client.on('error', (err) => {\\n console.error(`[ERROR] Failed to send message to ${server}:${port}:`, err.message);\\n });\\n client.on('end', () => {\\n if (localTesting) {\\n console.debug('[DEBUG] Connection closed');\\n }\\n });\\n }\\n}\\n// params is not defined locally -> export as module\\nif (typeof(params) === 'undefined') {\\n module.exports = {\\n execute_ops\\n }\\n} else { // on server use local defined vars\\n let return_values = execute_ops(moment, msg, net, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\n // define global returns\\n msg = return_values;\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1749108422},{"Type":1,"NewValue":"{\"Id\":437,\"Name\":\"Access TEC Care Watch\",\"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 // Watch protocol - please see variables and typical values in order below\\n // Watch-CYC;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;SIGNAL=<>;WM=<>;GENERAL=<>\\n // Watch-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\n //\\n // Author: Juanmi Navarro\\n // Created: 01/01/0000\\n // Last modified: 20/05/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', 'Watch');\\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 = (`Watch-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 //<>,<>,<> \\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 //<>,<>,<> \\n if (mac2) {\\n AddValue(codeValues, 'beacon_mac', mac2);\\n var simpleQuery2 = [{\\n 'code': 'Mac',\\n 'value': mac2,\\n }];\\n var simpleQueryLabel2 = {\\n 'table': 'beacons',\\n 'select': 'Name',\\n 'query': simpleQuery2\\n };\\n var labels2 = [];\\n labels2.push(JSON.stringify(simpleQueryLabel2));\\n AddValue(codeValues, 'oysta_labels', JSON.stringify(labels2));\\n }\\n if (params.beacon_major) {\\n AddValue(codeValues, 'beacon_major', params.beacon_major);\\n } else {\\n AddValue(codeValues, 'beacon_major', 0);\\n }\\n if (params.beacon_minor) {\\n AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\n } else {\\n AddValue(codeValues, 'beacon_minor', 0);\\n }\\n //AddValue(codeValues,'oysta_labels', label);\\n //AddValue(codeValues,'oysta_value', mac);\\n if (location_time) {\\n AddValue(codeValues, 'location_time', location_time);\\n }\\n }\\n /* meter mas tarde... \\n if (params.smart_data !== 'undefined') {\\n var gen_location = params.smart_data.split(',')\\n var latitude = gen_location[0]\\n var longitude = gen_location[1]\\n var location_accuracy = gen_location[2]\\n var altitude = gen_location[3]\\n AddValue(codeValues,'latitude', latitude);\\n AddValue(codeValues,'longitude', longitude);\\n AddValue(codeValues,'altitude', altitude);\\n AddValue(codeValues,'location_accuracy', location_accuracy);\\n }\\n */\\n /*else if ((params.event_time) && (params.event_time == '')) {\\n var event_time = moment.utc().unix();\\n AddValue(codeValues,'event_time', event_time);\\n } revisar mas adelante*/\\n // to parse SMS info from the device\\n switch (messageTypeLocalCode) {\\n case 'COMM-SMS': // SMS message sent in\\n if (params.data.startsWith('Device location request')) {\\n configsToAck.push(configIds.Controls.RealTimeLocate);\\n } else if (params.data.startsWith('Set IP ok')) {\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\n } else if (params.data.startsWith('IMEI:')) {\\n configsToAck.push(configIds.Controls.GetFirmwareVersion);\\n } else if (params.data.startsWith('Set IP ok')) {\\n configsToAck.push(configIds.Controls.ClearBufferedMessages);\\n } else if (params.data.startsWith('flush ok')) {\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\n } else if (params.data.startsWith('Set Watch-')) {\\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 = (`Watch-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 = (`Watch;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 = (`Watch;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 = (`Watch-RTL;${params.imei};${location_time};${location_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n break;\\n }\\n if (!params.event_time && !event_time) { // if params.event_time undefined - set it to now. \\n var event_time = moment.utc().unix();\\n AddValue(codeValues, 'event_time', event_time);\\n }\\n // if (!params.location_time && !location_time) { // if params.location_time undefined - set it to now. \\n // var location_time = moment.utc().unix();\\n // AddValue(codeValues, 'location_time', location_time);\\n //}\\n }\\n // send data msg to kibana\\n const data = buildDataToReceiver(codeValues, configsToAck, configsToUpdate, configsToSend);\\n console.log(data);\\n return data\\n // end of main operation\\n // define functions used in operation\\n // decode global msg\\n function decoder(str) { // decode rawdata\\n // CARE Decoder\\n AddValue(codeValues, 'Message : ', str);\\n var message = str;\\n // need to check if checksum is correct for possible msg corruption 10/03/23\\n var checksum = message.substring(8, 12);\\n var messageBody = message.substring(16, message.length);\\n debug('message =' + message);\\n debug('checksum =' + checksum);\\n debug('calculateCheckSum =' + calculateCheckSum(messageBody));\\n if (calculateCheckSum(messageBody) == checksum) { // payload is valid\\n debug(\\\"message has valid checksum\\\");\\n var messageBody = command; // update value for the ACK\\n debug('command =' + command);\\n if (command == '01') {\\n while (index < total_length + 16) {\\n // gen_location = '0'; //cambiado 30/09\\n var keyLengthHex = message.substring(index, index = index + 2);\\n var keyLength = 2 * hexToDecimal(keyLengthHex);\\n var key = message.substring(index, index = index + 2);\\n var value = message.substring(index, index = index + keyLength - 2);\\n debug('key = ' + key);\\n debug('value = ' + value);\\n switch (key) {\\n //Device ID\\n case '01':\\n var imei = hexToAscii(value);\\n // create long connection if it is needed\\n if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\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\\n if ((alarmCodeExtInt & 1) == 1) {\\n var alarm = 'ALF-C';\\n }\\n // Welfare Check-out\\n else if ((alarmCodeExtInt & 2) == 2) {\\n var alarm = 'ALA-C';\\n }\\n // Standard Alerts\\n //Battery low\\n else if ((alarmCodeInt & 1) == 1) {\\n var alarm = 'BATL';\\n }\\n //Overspeed\\n else if ((alarmCodeInt & 2) == 2) {\\n var alarm = 'ALSP';\\n }\\n //Fall\\n else if ((alarmCodeInt & 4) == 4) {\\n var alarm = 'ALF';\\n }\\n //Tilt\\n else if ((alarmCodeInt & 8) == 8) {\\n var alarm = 'Tilt';\\n } else if ((alarmCodeInt & 16) == 16) {\\n if ((alarmCodeInt & 16777216) == 16777216) {\\n var alarm = 'Geo1-IN';\\n } else {\\n var alarm = 'Geo1-OUT';\\n }\\n } else if ((alarmCodeInt & 32) == 32) {\\n if ((alarmCodeInt & 33554432) == 33554432) {\\n var alarm = 'Geo2-IN';\\n } else {\\n var alarm = 'Geo2-OUT';\\n }\\n } else if ((alarmCodeInt & 64) == 64) {\\n if ((alarmCodeInt & 67108864) == 67108864) {\\n var alarm = 'Geo3-IN';\\n } else {\\n var alarm = 'Geo3-OUT';\\n }\\n } else if ((alarmCodeInt & 128) == 128) {\\n if ((alarmCodeInt & 134217728) == 134217728) {\\n var alarm = 'Geo4-IN';\\n } else {\\n var alarm = 'Geo4-OUT';\\n }\\n }\\n //Power Off\\n else if ((alarmCodeInt & 256) == 256) {\\n var alarm = 'PWRF';\\n }\\n //Power On\\n else if ((alarmCodeInt & 512) == 512) {\\n var alarm = 'PWRN';\\n }\\n //Motion\\n else if ((alarmCodeInt & 1024) == 1024) {\\n var alarm = 'ALMOV';\\n }\\n //No Motion\\n else if ((alarmCodeInt & 2048) == 2048) {\\n var alarm = 'ALNM';\\n }\\n //SOS\\n else if ((alarmCodeInt & 4096) == 4096) {\\n var alarm = 'ALSOS';\\n } else if ((alarmCodeInt & 8192) == 8192) {\\n var alarm = 'Side1';\\n } else if ((alarmCodeInt & 16384) == 16384) {\\n var alarm = 'Side2';\\n }\\n //Battery charging\\n else if ((alarmCodeInt & 32768) == 32768) {\\n var alarm = 'BATCN';\\n }\\n //Battery no charging\\n else if ((alarmCodeInt & 65536) == 65536) {\\n var alarm = 'BATCF';\\n }\\n //SOS Ending\\n // Temporary Commented until we know exactly how it works. 22/09/2022\\n else if ((alarmCodeInt & 131072) == 131072) {\\n var alarm = 'SOSEnding';\\n info = 'Alarm Finished';\\n }\\n //Amber Alert EC03 only\\n else if ((alarmCodeInt & 262144) == 262144) {\\n var alarm = 'ALAO';\\n }\\n // welfare Alert check-in ALA-O\\n else if ((alarmCodeInt & 524288) == 524288) {\\n var alarm = 'ALA-O';\\n }\\n // Amber alert Ending ALA-C\\n else if ((alarmCodeInt & 1048576) == 1048576) {\\n var alarm = 'ALA-C';\\n }\\n // Amber alert Ending ALA-C\\n //else if ((alarmCodeInt & 1048576) == 1048576) {\\n // var alarm = 'ALA-C';\\n //}\\n // Fall-Down Alert ending\\n else if ((alarmCodeInt & 2097152) == 2097152) {\\n var alarm = 'ALF-C';\\n }\\n // welfare Alert Ending ALA\\n else if ((alarmCodeInt & 4194304) == 4194304) {\\n var alarm = 'ALA';\\n }\\n // Beacon absent Alert 11/10/22. Need to be added in msg types\\n //else if ((alarmCodeInt & 16777216) == 16777216) {\\n // var alarm = 'BEA';\\n //}\\n general += 'alarm:' + alarm + ',';\\n break;\\n //Custom ID\\n case '03':\\n // in value is customID.... '06' for Watch Care\\n // if ((imei != '860470063029395') && (imei != '860470063035947')) {\\n //update customID to check if belongs to this type of device\\n //value = hexToAscii(value);\\n customID = value;\\n if (value != '3036') {\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n AddValue(codeValues, \\\"customID\\\", value);\\n // exit decoder\\n // const data = buildDataToReceiver(codeValues, configsToAck, configsToUpdate, configsToSend);\\n // console.log(data);\\n return // data\\n } else {\\n if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\n //return;\\n }\\n AddValue(codeValues, \\\"customID\\\", value);\\n general += 'customID:' + value + ',';\\n break;\\n }\\n //Historical Data Completed\\n case '10': // indica q se han terminado de enviar todos los datos historicos.\\n var histData = true;\\n break;\\n //GPS location\\n case '20':\\n location_type = 'GPS';\\n var latitudeHex = value.substring(0, 8);\\n var longitudeHex = value.substring(8, 16);\\n var speedHex = value.substring(16, 20);\\n var directionHex = value.substring(20, 24);\\n var altitudeHex = value.substring(24, 28);\\n var location_accuracyHex = value.substring(28, 32);\\n var mileageHex = value.substring(32, 40);\\n var satellitesHex = value.substring(40, 42);\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n speed = ((hexToDecimal(changeEndianness(speedHex))) / 3.6).toFixed(2); //date 14-02-2023 in m/s\\n var direction = hexToDecimal(changeEndianness(directionHex));\\n var altitude = hexToDecimal(changeEndianness(altitudeHex)); // in meters\\n //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\n // Range: 0.5 to 99.9 \\n location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\n //var mileage = hexToDecimal(changeEndianness(mileageHex)) this is in km/h we need m/s\\n var mileage = hexToDecimal(changeEndianness(mileageHex)); // in meters date 14-02-2023\\n var satellites = hexToDecimal(satellitesHex);\\n // location_time = timestamp;\\n //<>,<>,<>,<>,<>\\n gps_data = `${latitude},${longitude},${location_accuracy},${speed},${direction},${altitude},${satellites},${mileage}`;\\n general += 'gps location (lat):' + latitude + ', (long):' + longitude + ',';\\n break;\\n //WIFI Towers\\n case '22':\\n location_type = 'WIFI';\\n var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\n //location_time = timestamp;\\n var wifiTowers = value;\\n general += 'wifiTowers:';\\n var indexWifi = 0;\\n var bssid_array = [];\\n wifi_data = '';\\n for (let i = 0; i < numWifi; i++) {\\n wifi_data += hexToDecimalSigned(wifiTowers.substring(indexWifi, indexWifi + 2)) + ',' + wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\n indexWifi += 14;\\n }\\n wifi_data = wifi_data.slice(0, -1);\\n general += wifi_data;\\n break;\\n //BLE Location Added 10/10/22\\n case '23':\\n location_type = 'BLE';\\n var mac = value.substring(0, 12);\\n var latitudeHex = value.substring(12, 20);\\n var longitudeHex = value.substring(20, 28);\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n var address = hexToAscii(value.substring(28, value.length));\\n var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\n // add : format in MAC\\n mac = mac.match(/.{1,2}/g).join(':');\\n // location_time = timestamp;\\n ble_data = `${latitude},${longitude},${mac},${address}`;\\n general += 'BLE location (lat):' + latitude + ', (long):' + longitude + ',';\\n break;\\n //General Data , status_data\\n case '24':\\n //var general = 'true'\\n if (customID != '3036') {\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n AddValue(codeValues, \\\"customID\\\", customID);\\n return\\n }\\n if (alarmCode) {\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\n }\\n //else {\\n // messageForReceiver = (`CareWatch-CYC;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};`);\\n //}\\n // reset variables\\n //alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\n var timestampHex = value.substring(0, 8);\\n timestampHex = changeEndianness(timestampHex);\\n timestamp = hexToDecimal(timestampHex);\\n location_time = timestamp;\\n event_time = timestamp;\\n // HardCode to fix possible issue in protocol\\n //event_time = moment.utc().unix();\\n // end of hard code\\n var statusHex = changeEndianness(value.substring(8, 16));\\n var statusInt = hexToDecimal(statusHex);\\n var statusDevice = '';\\n if ((statusInt & 1) == 1) {\\n statusDevice += 'GPS,';\\n }\\n if ((statusInt & 2) == 2) {\\n statusDevice += 'WIFISource,';\\n }\\n if ((statusInt & 4) == 4) {\\n statusDevice += 'CellTower,';\\n }\\n if ((statusInt & 8) == 8) {\\n statusDevice += 'BLELocation,';\\n }\\n //params.BatteryStatus.BatteryStatus = '1';\\n if ((statusInt & 16) == 16) {\\n statusDevice += 'Charging,';\\n // var alarm = 'BATCN';\\n //configs.BatteryStatus.BatteryStatus = '1';\\n /* if (configs.BatteryStatus.BatteryStatus !== '1') {\\n hasConfigs = true;\\n var batteryStatus = '1';\\n var alarm = 'BATCN';\\n let configsToUpdate = [];\\n configsToUpdate.push({\\n 'code': configIds.BatteryStatus.BatteryStatus,\\n 'value': batteryStatus\\n });\\n }*/\\n }\\n if ((statusInt & 32) == 32) {\\n statusDevice += 'FUllyCharged,';\\n //var alarm = 'BATF';\\n // configs.BatteryStatus.BatteryStatus = '3';\\n /* if (configs.BatteryStatus.BatteryStatus !== '3') {\\n hasConfigs = true;\\n var batteryStatus = '3';\\n var alarm = 'BATF';\\n let configsToUpdate = [];\\n configsToUpdate.push({\\n 'code': configIds.BatteryStatus.BatteryStatus,\\n 'value': batteryStatus\\n });\\n }*/\\n }\\n /* if (!((statusInt & 32) == 32) & !((statusInt & 16) == 16)) {\\n statusDevice += 'Not Charging,';\\n var alarm = 'BATCF';\\n //configs.BatteryStatus.BatteryStatus = '2';\\n if (configs.BatteryStatus.BatteryStatus !== '2') {\\n var batteryStatus = '2';\\n var alarm = 'BATCF';\\n let configsToUpdate = [];\\n configsToUpdate.push({\\n 'code': configIds.BatteryStatus.BatteryStatus,\\n 'value': batteryStatus\\n });\\n }\\n }*/\\n if ((statusInt & 64) == 64) {\\n statusDevice += 'Reboot,';\\n }\\n if ((statusInt & 128) == 128) {\\n statusDevice += 'HistoricalData,';\\n }\\n if ((statusInt & 256) == 256) {\\n statusDevice += 'AGPSDataValid,';\\n }\\n if ((statusInt & 512) == 512) {\\n statusDevice += 'Motion,';\\n }\\n if ((statusInt & 1024) == 1024) {\\n statusDevice += 'SmartLocating,';\\n }\\n if ((statusInt & 2048) == 2048) { //isHome\\n statusDevice += 'BeaconLocation,';\\n }\\n if ((statusInt & 4096) == 4096) {\\n statusDevice += 'BLEConnected,';\\n }\\n if ((statusInt & 16384) == 16384) {\\n statusDevice += 'HomeWiFi,';\\n }\\n statusDevice = statusDevice.slice(0, -1);\\n status_data = statusDevice; //to oysta template\\n //statusHex = (statusHex);\\n statusHex = hexToBin(statusHex);\\n statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\n battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\n cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\n workMode = parseInt(statusHex.substring(13, 16), 2);\\n general += 'statusDevice:' + statusDevice + ',';\\n if (battery_percentage) {\\n general += 'battery:' + battery_percentage + ',';\\n }\\n if (cellNetworkSignal) {\\n general += 'cellNetworkSignal:' + cellNetworkSignal + ',';\\n }\\n if (workMode) {\\n general += 'workMode:' + workMode + ',';\\n }\\n //messageForReceiver = (`CareWatch-CYC;${imei};${i};${event_time};${battery_percentage}`);\\n break;\\n //Call Records\\n case '25':\\n //Needed?\\n break;\\n //BLE Location 2\\n case '26':\\n //I don't understand\\n //messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n //Smart Location\\n case '27':\\n location_type = 'SMART';\\n var latitudeHex = value.substring(0, 8);\\n var longitudeHex = value.substring(8, 16);\\n var location_accuracyHex = value.substring(16, 20);\\n var altitudeHex = value.substring(20, 24);\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n var altitude = hexToDecimal(changeEndianness(altitudeHex));\\n //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\n //04/08/2022 se quita el multiplicador por 5 pq ya viene el valor en metros\\n location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\n //location_time = timestamp;\\n smart_data = `${latitude},${longitude},${location_accuracy},${altitude}`;\\n general += 'smart location (lat):' + latitude + ', (long):' + longitude + ',';\\n break;\\n //Beacon Location Added 11/10/22\\n case '28':\\n location_type = 'BEACON';\\n // var alarm = 'EBZI';\\n var latitudeHex = '00';\\n var longitudeHex = '00';\\n var descr = 'empty';\\n var flag = hexToDecimal(value.substring(0, 1));\\n var beacId = hexToDecimal(value.substring(1, 2));\\n // msg includes descrip\\n if ((flag & 4) == 4) {\\n descr = hexToAscii(value.substring(18, value.length));\\n }\\n // msg includes lat/lon\\n if ((flag & 8) == 8) {\\n latitudeHex = value.substring(18, 26);\\n longitudeHex = value.substring(26, 34);\\n }\\n // msg includes lat/lon and description\\n if ((flag & 12) == 12) {\\n latitudeHex = value.substring(18, 26);\\n longitudeHex = value.substring(26, 34);\\n descr = hexToAscii(value.substring(34, value.length));\\n }\\n var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\n // add : format in MAC\\n mac = mac.match(/.{1,2}/g).join(':');\\n var rssiHex = value.substring(14, 16);\\n var rssi1Hex = value.substring(16, 18);\\n rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\n rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\n // var latitudeHex = value.substring(18, 26);\\n // var longitudeHex = value.substring(26, 34);\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n //location_time = timestamp;\\n beacon_data = `${latitude},${longitude},${mac},${descr}`;\\n general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (listIndex):' + beacId + ',';\\n break;\\n // Beacon V2\\n case '2C':\\n location_type = 'BEACON';\\n // var alarm = 'EBZI';\\n var latitudeHex = '00';\\n var longitudeHex = '00';\\n var descr = 'empty';\\n var flag = hexToDecimal(value.substring(0, 1));\\n var beacId = hexToDecimal(value.substring(1, 2));\\n // msg includes descrip\\n if ((flag & 4) == 4) {\\n let desc_leng = hexToDecimal(value.substring(20, 22));\\n descr = hexToAscii(value.substring(22, 22 + (2 * desc_leng)));\\n //descr = hexToAscii(value.substring(18, value.length));\\n }\\n // msg includes lat/lon\\n if ((flag & 8) == 8) {\\n latitudeHex = value.substring(18, 26);\\n longitudeHex = value.substring(26, 34);\\n }\\n // msg includes lat/lon and description\\n if ((flag & 12) == 12) {\\n latitudeHex = value.substring(20, 28);\\n longitudeHex = value.substring(28, 36);\\n let desc_leng = hexToDecimal(value.substring(36, 38));\\n descr = hexToAscii(value.substring(38, 38 + (2 * desc_leng)));\\n }\\n var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\n // add : format in MAC\\n mac = mac.match(/.{1,2}/g).join(':');\\n var rssiHex = value.substring(14, 16);\\n var rssi1Hex = value.substring(16, 18);\\n rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\n rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\n var battery_beacon = hexToDecimal(value.substring(18, 20));\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n //location_time = timestamp;\\n beacon_data = `${latitude},${longitude},${mac},${descr}`;\\n general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (battery):' + battery_beacon + ', (listIndex):' + beacId + ',';\\n break;\\n //Cell Towers Note\\n case '29':\\n location_type = 'LBS';\\n lbs_data = '';\\n var mccHex = changeEndianness(value.substring(0, 4));\\n var mncHex = value.substring(4, 6);\\n var mcc = hexToDecimal(mccHex);\\n lbs_data += mcc + ',';\\n var mnc = hexToDecimal(mncHex);\\n lbs_data += mnc + ',';\\n var indexLbs = 6;\\n var numTowers = (hexToDecimal(keyLengthHex) - 4) / 7;\\n for (let i = 0; i < numTowers; i++) {\\n var rxlHex = changeEndianness(value.substring(indexLbs, indexLbs + 2));\\n var rxl = hexToDecimal(rxlHex);\\n var lacHex = changeEndianness(value.substring(indexLbs + 2, indexLbs + 6));\\n var lac = hexToDecimal(lacHex);\\n var cellTowers = hexToDecimal(changeEndianness(value.substring(indexLbs + 6, indexLbs + 14)));\\n lbs_data += rxl + ',' + lac + ',' + cellTowers + ',';\\n indexLbs += 14;\\n }\\n lbs_data = lbs_data.slice(0, -1);\\n general += lbs_data;\\n break;\\n case '30':\\n //G-sensor.\\n //value = hexToAscii(value);\\n //if (value != '06') {\\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 = (`Watch-${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 //value = hexToAscii(value);\\n //if (value != '06') {\\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 = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n }\\n break;\\n //BLE Connected . For Flic button\\n case '62':\\n location_type = 'BLE';\\n //var alarm = 'EBZI'; \\n //var latitudeHex = '00';\\n //var longitudeHex = '00';\\n //var descr = 'empty';\\n var flag = hexToDecimal(value.substring(0, 2)); // 0= Disconnected, 1= Connected\\n var mac = value.substring(2, 14); // No hace falta darle la vuelta\\n // add : format in MAC\\n mac = mac.match(/.{1,2}/g).join(':');\\n var batLevel = hexToDecimal(value.substring(14, 16)); // 0-100\\n //location_time = timestamp;\\n ble_data = `${flag},${batLevel},${mac}`;\\n general += 'BLE location (State):' + flag + ', (bat):' + batLevel + ', (mac):' + mac + ',';\\n break;\\n }\\n }\\n if (alarmCode) {\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};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 = (`Watch;ACK-FIRM;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\n //AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\n configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\n //configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\n //messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n case '1A':\\n //no ACK need\\n var fwVersion = hexToAscii(value);\\n imei = serverParams.Imei;\\n AddValue(codeValues, \\\"imei\\\", imei);\\n AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\n messageForReceiver = (`Watch;ACK-FIRM;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\n //AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\n configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\n //configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\n break;\\n //IMEI\\n case '03':\\n var imei = hexToDecimal(value);\\n // harcode to avoid conflicts with Rio protocol\\n //if ((imei != '860470063029395') && (imei != '860470063035947')) {\\n // AddValue(codeValues, \\\"error\\\", \\\"device imei is not in this protocol\\\");\\n // AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n //AddValue(codeValues, \\\"IMEI\\\", imei);\\n // return\\n //}\\n if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\n //return;\\n }\\n messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n //ICCID\\n case '04':\\n var iccid = hexToDecimal(value);\\n messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n //BLE-MAC\\n case '05':\\n var bleMac = hexToDecimal(value);\\n messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n //Run Time\\n case '07':\\n var runTime = hexToDecimal(value);\\n messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n case '10': // Ringer Volume\\n var volume = hexToDecimal(value);\\n imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-VOL;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"Volume\\\", volume);\\n AddValue(configsToUpdate, configIds.ReadSystemSettings.Volume, volume);\\n configsToAck.push(configIds.ReadSystemSettings.Volume);\\n break;\\n case '0A': //Performance mode\\n //var workMode = hexToDecimal(value);\\n //messageBody = messageBody + keyLengthHex + key + value;\\n //AddValue(codeValues, \\\"WorkMode\\\", workMode);\\n //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\n //configsToAck.push(configIds.ReadPerformance`Settings.Mode);\\n //var workMode = hexToAscii(value.substring(0, value.length));\\n //var workMode = hexToDecimal(value);\\n //var workMode = hexToAscii(value.substring(0, value.length));\\n var workMode = 1234; // + value + \\\"end\\\";\\n //var workModeVal = 9;\\n //workMode = 'test10';\\n imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-MODE;${imei};`);\\n AddValue(codeValues, \\\"Mode\\\", workMode);\\n AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\n configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n //AddValue(codeValues, \\\"performanceMode\\\", performanceMode);\\n //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, performanceMode);\\n // configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\n break;\\n case '1B':\\n //Decimal o ascii?\\n var gsmModule = hexToDecimal(value);\\n messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n case '1F':\\n //System Language\\n var systemLanguage = hexToAscii(value.substring(0, value.length));\\n imei = serverParams.Imei;\\n //messageBody = messageBody + keyLengthHex + key + value;\\n messageForReceiver = (`Watch;ACK-LANG;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"SystemLanguage\\\", systemLanguage);\\n AddValue(configsToUpdate, configIds.ReadSystemSettings.SystemLanguage, systemLanguage);\\n configsToAck.push(configIds.ReadSystemSettings.SystemLanguage);\\n break;\\n case '33': // phone option\\n // [Value]:83 0B 00 00 {\\\"phoneOption\\\":{\\\"flag_value\\\":2947,\\\"s3\\\":1,\\\"s4\\\":0,\\\"s5\\\":1,\\\"s6\\\":0,\\\"callIncoming\\\":0,\\\"rings\\\":3,\\\"s7\\\":0,\\\"toneID\\\":0,\\\"s1\\\":1,\\\"s2\\\":1}}\\n var statusPhone = hexToBin(value.substring(0, 2)); // To find autoanswer setup\\n if (statusPhone.substring(0, 1) == '1') { // 1 Enable\\n var auto = 'true';\\n } else var auto = 'false';\\n statusPhone = hexToBin(value.substring(2, 4)); // To find allow list setup\\n if (statusPhone.substring(7, 8) == '1') { // 1 Enable\\n allow = 'true';\\n } else var allow = 'false';\\n //statusPhone = hexToBin(value.substring(0, 2)) + hexToBin(value.substring(2, 4));\\n //AddValue(configsToUpdate, configIds.ReadSystemSettings.Statusphone, statusPhone);\\n AddValue(configsToUpdate, configIds.ReadSystemSettings.AllowList, allow);\\n AddValue(configsToUpdate, configIds.ReadSystemSettings.AutoAnswer, auto);\\n //configsToAck.push(configIds.ReadSystemSettings.Statusphone);\\n configsToAck.push(configIds.ReadSystemSettings.AllowList);\\n configsToAck.push(configIds.ReadSystemSettings.AutoAnswer);\\n break;\\n case '34': //ContactList with name\\n var contactNumber = value.substring(1, 2);\\n var telLength = hexToDecimal(value.substring(2, 4));\\n var tel = '';\\n switch (contactNumber) {\\n // Emergency Number\\n case '0':\\n tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\n AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\n AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\n configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\n break;\\n // Speed Dial Number\\n //case '1':\\n // tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\n // AddValue(codeValues, \\\"SpeedDialNumber\\\", tel);\\n // AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.SpeedDialNumber, tel);\\n // configsToAck.push(configIds.ReadSpeedDialSettings.SpeedDialNumber);\\n // break;\\n // Gateway Number\\n case '9': //00447781482635,Esendex UK 0034627177148,Esendex Spain 00447507288240,Esendex UK Acceptance\\n tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\n if (tel.includes('447781482635') || tel.includes('00447781482635')) {\\n tel = 'Esendex UK'\\n } else if (tel.includes('34627177148') || tel.includes('0034627177148')) {\\n tel = 'Esendex Spain'\\n } else if (tel.includes('447507288240') || tel.includes('00447507288240')) {\\n tel = 'Esendex UK Acceptance'\\n } else {\\n tel = 'Default'\\n }\\n AddValue(codeValues, \\\"SMSGateway\\\", tel);\\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\n configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\n break;\\n default:\\n tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\n if (tel.length < 6) {\\n contacts += '';\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\n break;\\n }\\n //contacts += 'A' + (contactNumber - 1) + ': ' + tel + ', ';\\n contacts += tel + ', ';\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\n break;\\n }\\n break;\\n case '40': // APN\\n //no ACK need\\n AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'));\\n configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\n var apn = hexToAscii(value.substring(0, value.length));\\n imei = serverParams.Imei;\\n break;\\n case '41': // APN Username\\n //no ACK need\\n //apn = apn + ',' + hexToAscii(value.substring(0, value.length));\\n break;\\n case '42': // APN Password\\n //no ACK need\\n //apn = apn + ',' + hexToAscii(value.substring(0, value.length));\\n messageForReceiver = (`Watch;ACK-GDATA;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"apn\\\", apn);\\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.APN, apn);\\n configsToAck.push(configIds.ReadCommunicationSettings.APN);\\n break;\\n case '43': //Server Details\\n //52.232.85.255,5678 production 52.174.17.77,5678 acceptance\\n var serverDetails = hexToAscii(value.substring(6, value.length)) + ':' + hexToDecimal(value.substring(4, 6) + value.substring(2, 4));\\n if (serverDetails.includes('52.232.85.255:5678')) {\\n serverDetails = 'Production'\\n } else if (serverDetails.includes('52.174.17.77:5678')) {\\n serverDetails = 'Acceptance'\\n } else if (serverDetails.includes('52.174.17.77:5778')) {\\n serverDetails = 'Protocol-Import'\\n } else if (serverDetails.includes('52.174.17.77:5878')) {\\n serverDetails = 'Protocol-Dev'\\n } else {\\n serverDetails = 'Default'\\n }\\n AddValue(codeValues, \\\"server\\\", serverDetails);\\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.Server, serverDetails);\\n configsToAck.push(configIds.ReadCommunicationSettings.Server);\\n break;\\n case '44': //time interval - work mode intervals\\n imei = serverParams.Imei;\\n messageForReceiver = (`Watch;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 '46': //HeartRate\\n // '10 0E 00 80'\\n var HeartRateStatus = hexToBin(value.substring(6, 8));\\n var enalbleDisable = '';\\n if (HeartRateStatus.substring(0, 1) == '1') {\\n var hrate = 'Enable, '\\n enalbleDisable = '1'\\n } else {\\n var hrate = 'Disable, '\\n };\\n var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6)));\\n hrate += detectingInterval;\\n AddValue(codeValues, \\\"hrate\\\", hrate);\\n var imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings, enalbleDisable);\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\n configsToAck.push(configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings);\\n configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\n break;\\n case '47': // Custom Id\\n imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-CUSTID;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"customeid\\\", value);\\n AddValue(configsToUpdate, configIds.ReadState.CustomId, hexToAscii(value)); //now it comes \\\"3036\\\"\\n configsToAck.push(configIds.ReadState.CustomId);\\n break;\\n case '53': // Non motion alert\\n //2B020080\\n var status = hexToBin(value.substring(6, 8));\\n var alertSetting = '';\\n var enableDisable = '';\\n if (status.substring(0, 1) == '1') {\\n alertSetting = 'Enable, '\\n enableDisable = '1';\\n } else {\\n alertSetting = 'Disable, '\\n };\\n //if (status.substring(5, 6) == '1') {\\n // alertSetting += 'Dial, '\\n //} else {\\n // alertSetting += 'No Dial, '\\n //};\\n var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\n alertSetting += time;\\n imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-NOMOTION;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"nomotion\\\", alertSetting);\\n //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings, enableDisable);\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\n //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\n configsToAck.push(configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings);\\n configsToAck.push(configIds.ReadNonMovementSettings.Time);\\n break;\\n case '56': //Fall down sensibility\\n // '00001100'\\n var fallStatus = hexToBin(value.substring(0, 2));\\n var enalbleDisable = '';\\n //if (fallStatus.substring(4, 5) == '1') {\\n if (fallStatus.substring(0, 1) == '1') {\\n var sensibility = 'Enable, '\\n enalbleDisable = '1'\\n } else {\\n var sensibility = 'Disable, '\\n };\\n if (fallStatus.substring(5, 6) == '1') {\\n sensibility += 'Dial, '\\n } else {\\n sensibility += 'No Dial, '\\n };\\n var imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-FALLALERT;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n var sesibityOptionValue = hexToDecimal(value.substring(1, 2));\\n sensibility += sesibityOptionValue;\\n AddValue(codeValues, \\\"sensibility\\\", sensibility);\\n //AddValue(configsToUpdate, configIds.ReadAlertSettings.FallSettings, sensibility);\\n AddValue(configsToUpdate, configIds.ReadFallSettings.EnableDisableFallSettings, enalbleDisable);\\n AddValue(configsToUpdate, configIds.ReadFallSettings.Sensitivity, sesibityOptionValue);\\n //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\n configsToAck.push(configIds.ReadFallSettings.EnableDisableFallSettings);\\n configsToAck.push(configIds.ReadFallSettings.Sensitivity);\\n break;\\n case '73': //BeaconList\\n var beaconNumber = hexToDecimal(value.substring(1, 2));\\n var beaconStatus = hexToBin(value.substring(0, 1));\\n beaconStatus = hexToAscii(value.substring(30, value.length));\\n //beaconStatus = changeEndianness(value.substring(30, value.length));\\n //homeBeacon += 'B' + (beaconNumber + 1) + ': ' + beaconStatus + ', ';\\n homeBeacon += beaconStatus + ', ';\\n AddValue(codeValues, \\\"homeBeacon\\\", homeBeacon);\\n messageForReceiver = (`Watch;ACK-GDATA;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\n configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\n break;\\n case '4A': //Wifi Network List\\n var wifiSSIDLenght = hexToDecimal(value.substring(2, 4));\\n var wifiPasswordLenght = hexToDecimal(value.substring(4, 6));\\n var wifiIndex = hexToDecimal(value.substring(1, 2));\\n //var wifiStatus = hexToDecimal(value.substring(0, 1));\\n var wifiStatus = value.substring(0, 1);\\n /*var enalbleDisable = wifiSSID = wifiPassword = homeWifi = '';\\n /var homeWifi = '';\\n if (wifiIndex == '0') { // Only first Wifi of the list\\n if (wifiStatus == '8') {\\n homeWifi += ' Enable, '\\n enalbleDisable = '1';\\n } else {\\n homeWifi += ' Disable, '\\n //enalbleDisable = '0';\\n };*/\\n if ((wifiStatus == '8') || (wifiStatus == 'C')) { // 8 == ON OR C== ON and Connected\\n var wifiSSID = hexToAscii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\n var wifiPassword = hexToAscii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\n var imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-WIFI;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n //homeWiFi += 'W' + (wifiIndex + 1) + ': ' + wifiSSID + ', ' + wifiPassword + ';';\\n homeWiFi += wifiSSID + ', ' + wifiPassword + ';';\\n AddValue(codeValues, \\\"wifi\\\", homeWiFi);\\n AddValue(configsToUpdate, configIds.ReadWiFiList.WiFiList, homeWiFi);\\n configsToAck.push(configIds.ReadWiFiList.WiFiList);\\n }\\n //AddValue(configsToUpdate, configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings, enalbleDisable);\\n //AddValue(configsToUpdate, configIds.ReadWiFiSettings.SSID, wifiSSID);\\n //AddValue(configsToUpdate, configIds.ReadWiFiSettings.Password, wifiPassword);\\n //configsToAck.push(configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings);\\n //configsToAck.push(configIds.ReadWiFiSettings.SSID);\\n //configsToAck.push(configIds.ReadWiFiSettings.Password);\\n break;\\n case '21': // Speed Dial Settings\\n // [Value]:53 84 {\\\"call1Button\\\":{\\\"mode\\\":0,\\\"feedBack\\\":3,\\\"task\\\":2,\\\"time\\\":20,\\\"status\\\":1}}\\n var status = hexToBin(value.substring(2, 4)); //always pass 2 HEXs to this function\\n var alertSetting = '';\\n var enalbleDisable = '';\\n if (status.substring(0, 1) == '1') {\\n alertSetting = 'Enable, '\\n enalbleDisable = '1'\\n } else {\\n alertSetting = 'Disable, '\\n //enableDisable = '0';\\n };\\n //var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\n //alertSetting += time;\\n imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-SPEED;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"speed\\\", alertSetting);\\n //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\n AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\n //AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\n //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\n configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\n //configsToAck.push(configIds.ReadNonMovementSettings.Time);\\n break;\\n }\\n }\\n }\\n if (command == '03') {\\n while (index < total_length + 16) {\\n var keyLengthHex = message.substring(index, index = index + 2);\\n var keyLength = 2 * hexToDecimal(keyLengthHex);\\n var key = message.substring(index, index = index + 2);\\n var value = message.substring(index, index = index + keyLength - 2);\\n debug('key = ' + key);\\n debug('value = ' + value);\\n switch (key) {\\n case '01': // Device ID\\n var imei = hexToAscii(value);\\n // create long connection if it is needed\\n if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\n //return;\\n }\\n break;\\n //CustomID is not provided so far with command type 03.. commented in the mean time\\n /* case '03':\\n //update customID to check if belongs to this type of device\\n customID = value;\\n if (value != '04') {\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n AddValue(codeValues, \\\"customID\\\", value);\\n return\\n } else {\\n if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\n }\\n AddValue(codeValues, \\\"customID\\\", value);\\n general += 'customID:' + value + ',';\\n break;\\n }\\n break; */\\n case '10': // Heartbeat\\n var heartbeat = hexToAscii(value);\\n event_time = moment.utc().unix();\\n if (index < total_length + 16) {\\n var keyLengthHex = message.substring(index, index = index + 2);\\n keyLength = 2 * hexToDecimal(keyLengthHex);\\n key = message.substring(index, index = index + 2);\\n if (key == '24') {\\n // debug('key: ' + key) //comment those out\\n value = message.substring(index, index = index + keyLength - 2);\\n // debug(value)\\n var timestampHex = value.substring(0, 8);\\n // debug('timestampt hex: ' + timestampHex)\\n timestampHex = changeEndianness(timestampHex);\\n timestamp = hexToDecimal(timestampHex);\\n event_time = timestamp;\\n // debug(event_time)\\n var statusHex = changeEndianness(value.substring(8, 16));\\n // debug(statusHex)\\n var statusInt = hexToDecimal(statusHex);\\n var statusDevice = '';\\n if ((statusInt & 1) == 1) {\\n statusDevice += 'GPS,';\\n }\\n if ((statusInt & 2) == 2) {\\n statusDevice += 'WIFISource,';\\n }\\n if ((statusInt & 4) == 4) {\\n statusDevice += 'CellTower,';\\n }\\n if ((statusInt & 8) == 8) {\\n statusDevice += 'BLELocation,';\\n }\\n if ((statusInt & 16) == 16) {\\n statusDevice += 'Charging,';\\n }\\n if ((statusInt & 32) == 32) {\\n statusDevice += 'FUllyCharged,';\\n }\\n if ((statusInt & 64) == 64) {\\n statusDevice += 'Reboot,';\\n }\\n if ((statusInt & 128) == 128) {\\n statusDevice += 'HistoricalData,';\\n }\\n if ((statusInt & 256) == 256) {\\n statusDevice += 'AGPSDataValid,';\\n }\\n if ((statusInt & 512) == 512) {\\n statusDevice += 'Motion,';\\n }\\n if ((statusInt & 1024) == 1024) {\\n statusDevice += 'SmartLocating,';\\n }\\n if ((statusInt & 2048) == 2048) {\\n statusDevice += 'BeaconLocation,';\\n }\\n if ((statusInt & 4096) == 4096) {\\n statusDevice += 'BLEConnected,';\\n }\\n statusDevice = statusDevice.slice(0, -1);\\n // debug('statusHex:' + statusHex)\\n statusHex = (statusHex);\\n statusHex = hexToBin(statusHex);\\n statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\n // debug(statusHex)\\n battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\n // debug(battery_percentage)\\n // debug(battery_percentage)\\n // debug(statusHex.substring(8, 13))\\n cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\n // debug(cellNetworkSignal)\\n workMode = parseInt(statusHex.substring(13, 16), 2);\\n // debug(workMode)\\n general += 'statusDevice:' + statusDevice + ';';\\n if (battery_percentage) {\\n general += 'battery:' + battery_percentage + ';';\\n }\\n if (cellNetworkSignal) {\\n general += 'cellNetworkSignal:' + cellNetworkSignal + ';';\\n }\\n if (workMode) {\\n general += 'workMode:' + workMode + ';';\\n }\\n }\\n }\\n // revisar\\n var gen_location = '0';\\n //CustomID is not provided so far with command type 03.. commented in the mean time\\n /*if (customID != '04') {\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n AddValue(codeValues, \\\"customID\\\", value);\\n return\\n }*/\\n //messageForReceiver = (`Eview-HTB;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};SIGNAL=${cellNetworkSignal};WM=${workMode};SL=${systemLanguage};GENERAL=${general}`);\\n messageForReceiver = (`Watch-HTB;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n //messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n case '12': // Device requesting timestamp\\n timestamp = moment.utc().unix();\\n timestampHex = decimalToHex(timestamp);\\n timestampHex = changeEndianness(timestampHex);\\n keyLengthHex = ('00' + decimalToHex(1 + (timestampHex.length) / 2)).slice(-2);\\n // respond to device with the timestamp of the server\\n messageBody = messageBody + keyLengthHex + key + timestampHex;\\n messageForReceiver = `Eview;${imei};${sequenceID};Get timestamp`;\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n break;\\n case '21': //Cell Towers\\n var mccHex = value.substring(0, 2);\\n var mncHex = value.substring(2, 3);\\n var mcc = hexToDecimal(mccHex);\\n var mnc = hexToDecimal(mncHex);\\n var numTowers = (keyLength - 4) / 5;\\n var cellTowers = hexToAscii(value);\\n messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n case '22': // WIFI locations \\n location_type = 'WIFI';\\n var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\n //location_time = timestamp;\\n var wifiTowers = value;\\n general += 'wifiTowers:';\\n var indexWifi = 0;\\n var bssid_array = [];\\n gen_location = '';\\n for (let i = 0; i < numWifi; i++) {\\n gen_location += wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\n indexWifi += 14;\\n }\\n gen_location = gen_location.slice(0, -1);\\n general += gen_location;\\n //CustomID is not provided so far with command type 03\\n /*if (customID != '04') {\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n AddValue(codeValues, \\\"customID\\\", value);\\n return\\n }*/\\n if (alarmCode) {\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};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 = (`Watch-ACK;${imei};${message}`); // ${sequenceID}; add ${sequenceID}; 19-07\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n var value = message.substring(index, index = index + keyLength - 2);\\n if (typeof configIds !== 'undefined' && configIds && configIds.ConfigureDevice && configIds.ConfigureDevice.LastConfigured) { // when is defined\\n AddValue(configsToUpdate, configIds.ConfigureDevice.LastConfigured, moment().format('YYYY/MM/DD, HH:mm:ss'));\\n configsToAck.push(configIds.ConfigureDevice.LastConfigured);\\n }\\n //}\\n }\\n if (command == 'FE') {\\n while (index < total_length + 16) {\\n var keyLength = message.substring(index, index = index + 2);\\n keyLength = 2 * hexToDecimal(keyLength);\\n var key = message.substring(index, index = index + 2);\\n var value = message.substring(index, index = index + keyLength - 2);\\n }\\n }\\n // prepare the ACK msg and change config if it is needed\\n lengthAck = messageBody.length / 2;\\n lengthAck = ('0000' + decimalToHex(lengthAck)).slice(-4);\\n lengthAck = lengthAck.toString().substring(2, 4) + lengthAck.toString().substring(0, 2);\\n ////////////checksum CRC 16\\n var checksumAck = byteStringToByteArray(messageBody);\\n checksumAck = crc16byte(checksumAck);\\n checksumAck = decimalToHex(checksumAck);\\n checksumAck = ('0000' + checksumAck).slice(-4);\\n checksumAck = checksumAck.toString().substring(2, 4) + checksumAck.toString().substring(0, 2);\\n prefix = prefix + lengthAck + checksumAck + sequenceID;\\n // To send ACK to the device previous to internal msg with parts\\n if (needsAck == true) {\\n if (messageBody.length <= 2) {\\n ack = 'AB00030008C7' + sequenceID + '7F0100'; // change AB10030008C7 to AB00030008C7\\n } else {\\n ack = prefix + messageBody;\\n }\\n AddValue(codeValues, 'imei', imei);\\n AddValue(codeValues, 'ack', ack);\\n }\\n } else { // checksum was invalid - print out useful debug info and bet quess at imei \\n AddValue(codeValues, \\\"error\\\", \\\"checksum failed for message\\\");\\n AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n i = rawFromBytes.search('3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]');\\n if (i >= 0) {\\n imei = hexToAscii(rawFromBytes.substring(i, i + 30));\\n AddValue(codeValues, \\\"imei\\\", imei);\\n }\\n }\\n }\\n // Auxiliary functions\\n function buildDataToReceiver(codeValues, configsToAck = [], configsToUpdate = [], configsToSend = []) {\\n const dataToReceiver = {\\n values: codeValues\\n };\\n if (configsToAck.length > 0) {\\n dataToReceiver.configsToAck = configsToAck;\\n }\\n if (configsToUpdate.length > 0) {\\n dataToReceiver.configsToUpdate = configsToUpdate;\\n }\\n if (configsToSend.length > 0) {\\n dataToReceiver.configsToSend = configsToSend;\\n }\\n return dataToReceiver;\\n }\\n\\n function AddValue(codeValueArray, p1, p2) { // push code value pair into array\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n codeValueArray.push(cvpair);\\n }\\n // convert functions\\n function asciiToHex(str) { // ascii to hex \\n return [...str].map(char => char.charCodeAt(0).toString(16).padStart(2, '0')).join('');\\n }\\n\\n function byteStringToByteArray(str) { // convierte una cadena hexadecimal en un array de bytes (number[])\\n const bytes = [];\\n for (let i = 0; i < str.length; i += 2) {\\n const byte = parseInt(str.substring(i, i + 2), 16);\\n if (!isNaN(byte) && byte >= 0 && byte <= 255) {\\n bytes.push(byte);\\n }\\n }\\n return bytes;\\n }\\n\\n function decimalToHex(x) {\\n return Number(x).toString(16).toUpperCase();\\n }\\n\\n function hexToBin(hex) { // convierte un valor hexadecimal a su representación binaria, y asegura que tenga al menos 8 bits \\n const bin = parseInt(hex, 16).toString(2);\\n return bin.padStart(hex.length * 4, '0');\\n }\\n\\n function hexToAscii(hex) {\\n if (hex.length % 2 !== 0) {\\n throw new Error(\\\"Hex string length must be even\\\");\\n }\\n let ascii = '';\\n for (let i = 0; i < hex.length; i += 2) {\\n const byte = hex.substr(i, 2);\\n const charCode = parseInt(byte, 16);\\n if (charCode !== 0) { // remove null character (\\\\u0000)\\n ascii += String.fromCharCode(charCode);\\n }\\n }\\n return ascii;\\n //return hex.match(/.{2}/g).map(byte => String.fromCharCode(parseInt(byte, 16))).join('');\\n }\\n\\n function hexToDecimalSigned(hex) { // hex to decimal\\n if (hex.length % 2 !== 0) {\\n hex = '0' + hex;\\n }\\n const num = parseInt(hex, 16);\\n const bits = hex.length * 4;\\n const maxVal = 2 ** bits;\\n return num >= maxVal / 2 ? num - maxVal : num;\\n }\\n\\n function hexToDecimal(hex) {\\n return parseInt(hex, 16);\\n }\\n // CheckSum and debug functions\\n function changeEndianness(hexString) { // changeEndianness\\n if (hexString.length === 0) { //if string is empty or not defined\\n return \\\"\\\";\\n }\\n if (hexString.length % 2 !== 0) {\\n throw new Error(\\\"Hex string length must be even\\\");\\n }\\n return hexString.match(/.{2}/g) // divide in bytes (2 chars)\\n .reverse() // reverse the order\\n .join('');\\n }\\n\\n function calculateCheckSum(payloadData) { // calcula el CRC16 sobre una cadena hexadecimal y devuelve el valor con el endianness invertido\\n const bytes = byteStringToByteArray(payloadData);\\n const crc = crc16byte(bytes);\\n const hex = crc.toString(16).padStart(4, '0').toUpperCase();\\n return changeEndianness(hex);\\n }\\n\\n function crc16byte(byteArray) { // calcula el CRC-16 sobre un array de bytes usando una tabla precalculada (crcTable)\\n let crc = 0x0000;\\n for (const byte of byteArray) {\\n if (byte < 0 || byte > 255 || !Number.isInteger(byte)) {\\n throw new RangeError(\\\"Invalid byte value in input array\\\");\\n }\\n const index = (byte ^ (crc >> 8)) & 0xFF;\\n crc = crcTable[index] ^ (crc << 8);\\n }\\n return crc & 0xFFFF;\\n }\\n\\n function debug(...args) { // write debug info to console log, if localTesting\\n if (localTesting) {\\n console.debug('[DEBUG]', ...args);\\n }\\n }\\n /*\\n function sendMessageToLocalhostNoWait(str) { // sends message to system, closing connection after\\n var server;\\n if (localTesting) {\\n console.log('local testing - sending to protocol-dev server the message ... '); // port 5878\\n console.log(str);\\n server = '52.174.17.77';\\n } else {\\n server = '127.0.0.1';\\n }\\n var c = net.createConnection(5878, server);\\n c.on('error', function(error) {\\n c = net.createConnection(5878, server);\\n });\\n c.write(`${str}`);\\n c.end();\\n }*/\\n function sendMessageToLocalhostNoWait(message) {\\n const server = localTesting ? '52.174.17.77' : '127.0.0.1';\\n //const port = localTesting ? '5878' : ''; //Protocol-dev\\n const port = '5678'; //acceptance-dev\\n if (localTesting) {\\n console.debug('[DEBUG] Sending message to test server:', message);\\n }\\n const client = net.createConnection(port, server, () => {\\n client.write(message);\\n client.end();\\n });\\n client.on('error', (err) => {\\n console.error(`[ERROR] Failed to send message to ${server}:${port}:`, err.message);\\n });\\n client.on('end', () => {\\n if (localTesting) {\\n console.debug('[DEBUG] Connection closed');\\n }\\n });\\n }\\n}\\n// params is not defined locally -> export as module\\nif (typeof(params) === 'undefined') {\\n module.exports = {\\n execute_ops\\n }\\n} else { // on server use local defined vars\\n let return_values = execute_ops(moment, msg, net, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\n // define global returns\\n msg = return_values;\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1749579157},{"Type":1,"NewValue":"{\"Id\":437,\"Name\":\"Access TEC Care Watch\",\"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 // Watch protocol - please see variables and typical values in order below\\n // Watch-CYC;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;SIGNAL=<>;WM=<>;GENERAL=<>\\n // Watch-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\n //\\n // Author: Juanmi Navarro\\n // Created: 01/01/0000\\n // Last modified: 20/05/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', 'Watch');\\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 = (`Watch-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 //<>,<>,<> \\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 //<>,<>,<> \\n if (mac2) {\\n AddValue(codeValues, 'beacon_mac', mac2);\\n var simpleQuery2 = [{\\n 'code': 'Mac',\\n 'value': mac2,\\n }];\\n var simpleQueryLabel2 = {\\n 'table': 'beacons',\\n 'select': 'Name',\\n 'query': simpleQuery2\\n };\\n var labels2 = [];\\n labels2.push(JSON.stringify(simpleQueryLabel2));\\n AddValue(codeValues, 'oysta_labels', JSON.stringify(labels2));\\n }\\n if (params.beacon_major) {\\n AddValue(codeValues, 'beacon_major', params.beacon_major);\\n } else {\\n AddValue(codeValues, 'beacon_major', 0);\\n }\\n if (params.beacon_minor) {\\n AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\n } else {\\n AddValue(codeValues, 'beacon_minor', 0);\\n }\\n //AddValue(codeValues,'oysta_labels', label);\\n //AddValue(codeValues,'oysta_value', mac);\\n if (location_time) {\\n AddValue(codeValues, 'location_time', location_time);\\n }\\n }\\n /* meter mas tarde... \\n if (params.smart_data !== 'undefined') {\\n var gen_location = params.smart_data.split(',')\\n var latitude = gen_location[0]\\n var longitude = gen_location[1]\\n var location_accuracy = gen_location[2]\\n var altitude = gen_location[3]\\n AddValue(codeValues,'latitude', latitude);\\n AddValue(codeValues,'longitude', longitude);\\n AddValue(codeValues,'altitude', altitude);\\n AddValue(codeValues,'location_accuracy', location_accuracy);\\n }\\n */\\n /*else if ((params.event_time) && (params.event_time == '')) {\\n var event_time = moment.utc().unix();\\n AddValue(codeValues,'event_time', event_time);\\n } revisar mas adelante*/\\n // to parse SMS info from the device\\n switch (messageTypeLocalCode) {\\n case 'COMM-SMS': // SMS message sent in\\n if (params.data.startsWith('Device location request')) {\\n configsToAck.push(configIds.Controls.RealTimeLocate);\\n } else if (params.data.startsWith('Set IP ok')) {\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\n } else if (params.data.startsWith('IMEI:')) {\\n configsToAck.push(configIds.Controls.GetFirmwareVersion);\\n } else if (params.data.startsWith('Set IP ok')) {\\n configsToAck.push(configIds.Controls.ClearBufferedMessages);\\n } else if (params.data.startsWith('flush ok')) {\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\n } else if (params.data.startsWith('Set Watch-')) {\\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 = (`Watch-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 = (`Watch;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 = (`Watch;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 = (`Watch-RTL;${params.imei};${location_time};${location_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n break;\\n }\\n if (!params.event_time && !event_time) { // if params.event_time undefined - set it to now. \\n var event_time = moment.utc().unix();\\n AddValue(codeValues, 'event_time', event_time);\\n }\\n // if (!params.location_time && !location_time) { // if params.location_time undefined - set it to now. \\n // var location_time = moment.utc().unix();\\n // AddValue(codeValues, 'location_time', location_time);\\n //}\\n }\\n // send data msg to kibana\\n const data = buildDataToReceiver(codeValues, configsToAck, configsToUpdate, configsToSend);\\n console.log(data);\\n return data\\n // end of main operation\\n // define functions used in operation\\n // decode global msg\\n function decoder(str) { // decode rawdata\\n // CARE Decoder\\n AddValue(codeValues, 'Message : ', str);\\n var message = str;\\n // need to check if checksum is correct for possible msg corruption 10/03/23\\n var checksum = message.substring(8, 12);\\n var messageBody = message.substring(16, message.length);\\n debug('message =' + message);\\n debug('checksum =' + checksum);\\n debug('calculateCheckSum =' + calculateCheckSum(messageBody));\\n if (calculateCheckSum(messageBody) == checksum) { // payload is valid\\n debug(\\\"message has valid checksum\\\");\\n var messageBody = command; // update value for the ACK\\n debug('command =' + command);\\n if (command == '01') {\\n while (index < total_length + 16) {\\n // gen_location = '0'; //cambiado 30/09\\n var keyLengthHex = message.substring(index, index = index + 2);\\n var keyLength = 2 * hexToDecimal(keyLengthHex);\\n var key = message.substring(index, index = index + 2);\\n var value = message.substring(index, index = index + keyLength - 2);\\n debug('key = ' + key);\\n debug('value = ' + value);\\n switch (key) {\\n //Device ID\\n case '01':\\n var imei = hexToAscii(value);\\n // create long connection if it is needed\\n if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\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\\n if ((alarmCodeExtInt & 1) == 1) {\\n var alarm = 'ALF-C';\\n }\\n // Welfare Check-out\\n else if ((alarmCodeExtInt & 2) == 2) {\\n var alarm = 'ALA-C';\\n }\\n // Standard Alerts\\n //Battery low\\n else if ((alarmCodeInt & 1) == 1) {\\n var alarm = 'BATL';\\n }\\n //Overspeed\\n else if ((alarmCodeInt & 2) == 2) {\\n var alarm = 'ALSP';\\n }\\n //Fall\\n else if ((alarmCodeInt & 4) == 4) {\\n var alarm = 'ALF';\\n }\\n //Tilt\\n else if ((alarmCodeInt & 8) == 8) {\\n var alarm = 'Tilt';\\n } else if ((alarmCodeInt & 16) == 16) {\\n if ((alarmCodeInt & 16777216) == 16777216) {\\n var alarm = 'Geo1-IN';\\n } else {\\n var alarm = 'Geo1-OUT';\\n }\\n } else if ((alarmCodeInt & 32) == 32) {\\n if ((alarmCodeInt & 33554432) == 33554432) {\\n var alarm = 'Geo2-IN';\\n } else {\\n var alarm = 'Geo2-OUT';\\n }\\n } else if ((alarmCodeInt & 64) == 64) {\\n if ((alarmCodeInt & 67108864) == 67108864) {\\n var alarm = 'Geo3-IN';\\n } else {\\n var alarm = 'Geo3-OUT';\\n }\\n } else if ((alarmCodeInt & 128) == 128) {\\n if ((alarmCodeInt & 134217728) == 134217728) {\\n var alarm = 'Geo4-IN';\\n } else {\\n var alarm = 'Geo4-OUT';\\n }\\n }\\n //Power Off\\n else if ((alarmCodeInt & 256) == 256) {\\n var alarm = 'PWRF';\\n }\\n //Power On\\n else if ((alarmCodeInt & 512) == 512) {\\n var alarm = 'PWRN';\\n }\\n //Motion\\n else if ((alarmCodeInt & 1024) == 1024) {\\n var alarm = 'ALMOV';\\n }\\n //No Motion\\n else if ((alarmCodeInt & 2048) == 2048) {\\n var alarm = 'ALNM';\\n }\\n //SOS\\n else if ((alarmCodeInt & 4096) == 4096) {\\n var alarm = 'ALSOS';\\n } else if ((alarmCodeInt & 8192) == 8192) {\\n var alarm = 'Side1';\\n } else if ((alarmCodeInt & 16384) == 16384) {\\n var alarm = 'Side2';\\n }\\n //Battery charging\\n else if ((alarmCodeInt & 32768) == 32768) {\\n var alarm = 'BATCN';\\n }\\n //Battery no charging\\n else if ((alarmCodeInt & 65536) == 65536) {\\n var alarm = 'BATCF';\\n }\\n //SOS Ending\\n // Temporary Commented until we know exactly how it works. 22/09/2022\\n else if ((alarmCodeInt & 131072) == 131072) {\\n var alarm = 'SOSEnding';\\n info = 'Alarm Finished';\\n }\\n //Amber Alert EC03 only\\n else if ((alarmCodeInt & 262144) == 262144) {\\n var alarm = 'ALAO';\\n }\\n // welfare Alert check-in ALA-O\\n else if ((alarmCodeInt & 524288) == 524288) {\\n var alarm = 'ALA-O';\\n }\\n // Amber alert Ending ALA-C\\n else if ((alarmCodeInt & 1048576) == 1048576) {\\n var alarm = 'ALA-C';\\n }\\n // Amber alert Ending ALA-C\\n //else if ((alarmCodeInt & 1048576) == 1048576) {\\n // var alarm = 'ALA-C';\\n //}\\n // Fall-Down Alert ending\\n else if ((alarmCodeInt & 2097152) == 2097152) {\\n var alarm = 'ALF-C';\\n }\\n // welfare Alert Ending ALA\\n else if ((alarmCodeInt & 4194304) == 4194304) {\\n var alarm = 'ALA';\\n }\\n // Beacon absent Alert 11/10/22. Need to be added in msg types\\n //else if ((alarmCodeInt & 16777216) == 16777216) {\\n // var alarm = 'BEA';\\n //}\\n general += 'alarm:' + alarm + ',';\\n break;\\n //Custom ID\\n case '03':\\n // in value is customID.... '06' for Watch Care\\n // if ((imei != '860470063029395') && (imei != '860470063035947')) {\\n //update customID to check if belongs to this type of device\\n //value = hexToAscii(value);\\n customID = value;\\n if (value != '3036') {\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n AddValue(codeValues, \\\"customID\\\", value);\\n // exit decoder\\n // const data = buildDataToReceiver(codeValues, configsToAck, configsToUpdate, configsToSend);\\n // console.log(data);\\n return // data\\n } else {\\n if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\n //return;\\n }\\n AddValue(codeValues, \\\"customID\\\", value);\\n general += 'customID:' + value + ',';\\n break;\\n }\\n //Historical Data Completed\\n case '10': // indica q se han terminado de enviar todos los datos historicos.\\n var histData = true;\\n break;\\n //GPS location\\n case '20':\\n location_type = 'GPS';\\n var latitudeHex = value.substring(0, 8);\\n var longitudeHex = value.substring(8, 16);\\n var speedHex = value.substring(16, 20);\\n var directionHex = value.substring(20, 24);\\n var altitudeHex = value.substring(24, 28);\\n var location_accuracyHex = value.substring(28, 32);\\n var mileageHex = value.substring(32, 40);\\n var satellitesHex = value.substring(40, 42);\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n speed = ((hexToDecimal(changeEndianness(speedHex))) / 3.6).toFixed(2); //date 14-02-2023 in m/s\\n var direction = hexToDecimal(changeEndianness(directionHex));\\n var altitude = hexToDecimal(changeEndianness(altitudeHex)); // in meters\\n //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\n // Range: 0.5 to 99.9 \\n location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\n //var mileage = hexToDecimal(changeEndianness(mileageHex)) this is in km/h we need m/s\\n var mileage = hexToDecimal(changeEndianness(mileageHex)); // in meters date 14-02-2023\\n var satellites = hexToDecimal(satellitesHex);\\n // location_time = timestamp;\\n //<>,<>,<>,<>,<>\\n gps_data = `${latitude},${longitude},${location_accuracy},${speed},${direction},${altitude},${satellites},${mileage}`;\\n general += 'gps location (lat):' + latitude + ', (long):' + longitude + ',';\\n break;\\n //WIFI Towers\\n case '22':\\n location_type = 'WIFI';\\n var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\n //location_time = timestamp;\\n var wifiTowers = value;\\n general += 'wifiTowers:';\\n var indexWifi = 0;\\n var bssid_array = [];\\n wifi_data = '';\\n for (let i = 0; i < numWifi; i++) {\\n wifi_data += hexToDecimalSigned(wifiTowers.substring(indexWifi, indexWifi + 2)) + ',' + wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\n indexWifi += 14;\\n }\\n wifi_data = wifi_data.slice(0, -1);\\n general += wifi_data;\\n break;\\n //BLE Location Added 10/10/22\\n case '23':\\n location_type = 'BLE';\\n var mac = value.substring(0, 12);\\n var latitudeHex = value.substring(12, 20);\\n var longitudeHex = value.substring(20, 28);\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n var address = hexToAscii(value.substring(28, value.length));\\n var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\n // add : format in MAC\\n mac = mac.match(/.{1,2}/g).join(':');\\n // location_time = timestamp;\\n ble_data = `${latitude},${longitude},${mac},${address}`;\\n general += 'BLE location (lat):' + latitude + ', (long):' + longitude + ',';\\n break;\\n //General Data , status_data\\n case '24':\\n //var general = 'true'\\n if (customID != '3036') {\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n AddValue(codeValues, \\\"customID\\\", customID);\\n return\\n }\\n if (alarmCode) {\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\n }\\n //else {\\n // messageForReceiver = (`CareWatch-CYC;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};`);\\n //}\\n // reset variables\\n //alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\n var timestampHex = value.substring(0, 8);\\n timestampHex = changeEndianness(timestampHex);\\n timestamp = hexToDecimal(timestampHex);\\n location_time = timestamp;\\n event_time = timestamp;\\n // HardCode to fix possible issue in protocol\\n //event_time = moment.utc().unix();\\n // end of hard code\\n var statusHex = changeEndianness(value.substring(8, 16));\\n var statusInt = hexToDecimal(statusHex);\\n var statusDevice = '';\\n if ((statusInt & 1) == 1) {\\n statusDevice += 'GPS,';\\n }\\n if ((statusInt & 2) == 2) {\\n statusDevice += 'WIFISource,';\\n }\\n if ((statusInt & 4) == 4) {\\n statusDevice += 'CellTower,';\\n }\\n if ((statusInt & 8) == 8) {\\n statusDevice += 'BLELocation,';\\n }\\n //params.BatteryStatus.BatteryStatus = '1';\\n if ((statusInt & 16) == 16) {\\n statusDevice += 'Charging,';\\n // var alarm = 'BATCN';\\n //configs.BatteryStatus.BatteryStatus = '1';\\n /* if (configs.BatteryStatus.BatteryStatus !== '1') {\\n hasConfigs = true;\\n var batteryStatus = '1';\\n var alarm = 'BATCN';\\n let configsToUpdate = [];\\n configsToUpdate.push({\\n 'code': configIds.BatteryStatus.BatteryStatus,\\n 'value': batteryStatus\\n });\\n }*/\\n }\\n if ((statusInt & 32) == 32) {\\n statusDevice += 'FUllyCharged,';\\n //var alarm = 'BATF';\\n // configs.BatteryStatus.BatteryStatus = '3';\\n /* if (configs.BatteryStatus.BatteryStatus !== '3') {\\n hasConfigs = true;\\n var batteryStatus = '3';\\n var alarm = 'BATF';\\n let configsToUpdate = [];\\n configsToUpdate.push({\\n 'code': configIds.BatteryStatus.BatteryStatus,\\n 'value': batteryStatus\\n });\\n }*/\\n }\\n /* if (!((statusInt & 32) == 32) & !((statusInt & 16) == 16)) {\\n statusDevice += 'Not Charging,';\\n var alarm = 'BATCF';\\n //configs.BatteryStatus.BatteryStatus = '2';\\n if (configs.BatteryStatus.BatteryStatus !== '2') {\\n var batteryStatus = '2';\\n var alarm = 'BATCF';\\n let configsToUpdate = [];\\n configsToUpdate.push({\\n 'code': configIds.BatteryStatus.BatteryStatus,\\n 'value': batteryStatus\\n });\\n }\\n }*/\\n if ((statusInt & 64) == 64) {\\n statusDevice += 'Reboot,';\\n }\\n if ((statusInt & 128) == 128) {\\n statusDevice += 'HistoricalData,';\\n }\\n if ((statusInt & 256) == 256) {\\n statusDevice += 'AGPSDataValid,';\\n }\\n if ((statusInt & 512) == 512) {\\n statusDevice += 'Motion,';\\n }\\n if ((statusInt & 1024) == 1024) {\\n statusDevice += 'SmartLocating,';\\n }\\n if ((statusInt & 2048) == 2048) { //isHome\\n statusDevice += 'BeaconLocation,';\\n }\\n if ((statusInt & 4096) == 4096) {\\n statusDevice += 'BLEConnected,';\\n }\\n if ((statusInt & 16384) == 16384) {\\n statusDevice += 'HomeWiFi,';\\n }\\n statusDevice = statusDevice.slice(0, -1);\\n status_data = statusDevice; //to oysta template\\n //statusHex = (statusHex);\\n statusHex = hexToBin(statusHex);\\n statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\n battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\n cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\n workMode = parseInt(statusHex.substring(13, 16), 2);\\n general += 'statusDevice:' + statusDevice + ',';\\n if (battery_percentage) {\\n general += 'battery:' + battery_percentage + ',';\\n }\\n if (cellNetworkSignal) {\\n general += 'cellNetworkSignal:' + cellNetworkSignal + ',';\\n }\\n if (workMode) {\\n general += 'workMode:' + workMode + ',';\\n }\\n //messageForReceiver = (`CareWatch-CYC;${imei};${i};${event_time};${battery_percentage}`);\\n break;\\n //Call Records\\n case '25':\\n //Needed?\\n break;\\n //BLE Location 2\\n case '26':\\n //I don't understand\\n //messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n //Smart Location\\n case '27':\\n location_type = 'SMART';\\n var latitudeHex = value.substring(0, 8);\\n var longitudeHex = value.substring(8, 16);\\n var location_accuracyHex = value.substring(16, 20);\\n var altitudeHex = value.substring(20, 24);\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n var altitude = hexToDecimal(changeEndianness(altitudeHex));\\n //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\n //04/08/2022 se quita el multiplicador por 5 pq ya viene el valor en metros\\n location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\n //location_time = timestamp;\\n smart_data = `${latitude},${longitude},${location_accuracy},${altitude}`;\\n general += 'smart location (lat):' + latitude + ', (long):' + longitude + ',';\\n break;\\n //Beacon Location Added 11/10/22\\n case '28':\\n location_type = 'BEACON';\\n // var alarm = 'EBZI';\\n var latitudeHex = '00';\\n var longitudeHex = '00';\\n var descr = 'empty';\\n var flag = hexToDecimal(value.substring(0, 1));\\n var beacId = hexToDecimal(value.substring(1, 2));\\n // msg includes descrip\\n if ((flag & 4) == 4) {\\n descr = hexToAscii(value.substring(18, value.length));\\n }\\n // msg includes lat/lon\\n if ((flag & 8) == 8) {\\n latitudeHex = value.substring(18, 26);\\n longitudeHex = value.substring(26, 34);\\n }\\n // msg includes lat/lon and description\\n if ((flag & 12) == 12) {\\n latitudeHex = value.substring(18, 26);\\n longitudeHex = value.substring(26, 34);\\n descr = hexToAscii(value.substring(34, value.length));\\n }\\n var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\n // add : format in MAC\\n mac = mac.match(/.{1,2}/g).join(':');\\n var rssiHex = value.substring(14, 16);\\n var rssi1Hex = value.substring(16, 18);\\n rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\n rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\n // var latitudeHex = value.substring(18, 26);\\n // var longitudeHex = value.substring(26, 34);\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n //location_time = timestamp;\\n beacon_data = `${latitude},${longitude},${mac},${descr}`;\\n general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (listIndex):' + beacId + ',';\\n break;\\n // Beacon V2\\n case '2C':\\n location_type = 'BEACON';\\n // var alarm = 'EBZI';\\n var latitudeHex = '00';\\n var longitudeHex = '00';\\n var descr = 'empty';\\n var flag = hexToDecimal(value.substring(0, 1));\\n var beacId = hexToDecimal(value.substring(1, 2));\\n // msg includes descrip\\n if ((flag & 4) == 4) {\\n let desc_leng = hexToDecimal(value.substring(20, 22));\\n descr = hexToAscii(value.substring(22, 22 + (2 * desc_leng)));\\n //descr = hexToAscii(value.substring(18, value.length));\\n }\\n // msg includes lat/lon\\n if ((flag & 8) == 8) {\\n latitudeHex = value.substring(18, 26);\\n longitudeHex = value.substring(26, 34);\\n }\\n // msg includes lat/lon and description\\n if ((flag & 12) == 12) {\\n latitudeHex = value.substring(20, 28);\\n longitudeHex = value.substring(28, 36);\\n let desc_leng = hexToDecimal(value.substring(36, 38));\\n descr = hexToAscii(value.substring(38, 38 + (2 * desc_leng)));\\n }\\n var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\n // add : format in MAC\\n mac = mac.match(/.{1,2}/g).join(':');\\n var rssiHex = value.substring(14, 16);\\n var rssi1Hex = value.substring(16, 18);\\n rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\n rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\n var battery_beacon = hexToDecimal(value.substring(18, 20));\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n //location_time = timestamp;\\n beacon_data = `${latitude},${longitude},${mac},${descr}`;\\n general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (battery):' + battery_beacon + ', (listIndex):' + beacId + ',';\\n break;\\n //Cell Towers Note\\n case '29':\\n location_type = 'LBS';\\n lbs_data = '';\\n var mccHex = changeEndianness(value.substring(0, 4));\\n var mncHex = value.substring(4, 6);\\n var mcc = hexToDecimal(mccHex);\\n lbs_data += mcc + ',';\\n var mnc = hexToDecimal(mncHex);\\n lbs_data += mnc + ',';\\n var indexLbs = 6;\\n var numTowers = (hexToDecimal(keyLengthHex) - 4) / 7;\\n for (let i = 0; i < numTowers; i++) {\\n var rxlHex = changeEndianness(value.substring(indexLbs, indexLbs + 2));\\n var rxl = hexToDecimal(rxlHex);\\n var lacHex = changeEndianness(value.substring(indexLbs + 2, indexLbs + 6));\\n var lac = hexToDecimal(lacHex);\\n var cellTowers = hexToDecimal(changeEndianness(value.substring(indexLbs + 6, indexLbs + 14)));\\n lbs_data += rxl + ',' + lac + ',' + cellTowers + ',';\\n indexLbs += 14;\\n }\\n lbs_data = lbs_data.slice(0, -1);\\n general += lbs_data;\\n break;\\n case '30':\\n //G-sensor.\\n //value = hexToAscii(value);\\n //if (value != '06') {\\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 = (`Watch-${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 //value = hexToAscii(value);\\n //if (value != '06') {\\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 = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n }\\n break;\\n //BLE Connected . For Flic button\\n case '62':\\n location_type = 'BLE';\\n //var alarm = 'EBZI'; \\n //var latitudeHex = '00';\\n //var longitudeHex = '00';\\n //var descr = 'empty';\\n var flag = hexToDecimal(value.substring(0, 2)); // 0= Disconnected, 1= Connected\\n var mac = value.substring(2, 14); // No hace falta darle la vuelta\\n // add : format in MAC\\n mac = mac.match(/.{1,2}/g).join(':');\\n var batLevel = hexToDecimal(value.substring(14, 16)); // 0-100\\n //location_time = timestamp;\\n ble_data = `${flag},${batLevel},${mac}`;\\n general += 'BLE location (State):' + flag + ', (bat):' + batLevel + ', (mac):' + mac + ',';\\n break;\\n }\\n }\\n if (alarmCode) {\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};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 = (`Watch;ACK-FIRM;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\n //AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\n configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\n //configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\n //messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n case '1A':\\n //no ACK need\\n var fwVersion = hexToAscii(value);\\n imei = serverParams.Imei;\\n AddValue(codeValues, \\\"imei\\\", imei);\\n AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\n messageForReceiver = (`Watch;ACK-FIRM;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\n //AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\n configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\n //configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\n break;\\n //IMEI\\n case '03':\\n var imei = hexToDecimal(value);\\n // harcode to avoid conflicts with Rio protocol\\n //if ((imei != '860470063029395') && (imei != '860470063035947')) {\\n // AddValue(codeValues, \\\"error\\\", \\\"device imei is not in this protocol\\\");\\n // AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n //AddValue(codeValues, \\\"IMEI\\\", imei);\\n // return\\n //}\\n if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\n //return;\\n }\\n messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n //ICCID\\n case '04':\\n var iccid = hexToDecimal(value);\\n messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n //BLE-MAC\\n case '05':\\n var bleMac = hexToDecimal(value);\\n messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n //Run Time\\n case '07':\\n var runTime = hexToDecimal(value);\\n messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n case '10': // Ringer Volume\\n var volume = hexToDecimal(value);\\n imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-VOL;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"Volume\\\", volume);\\n AddValue(configsToUpdate, configIds.ReadSystemSettings.Volume, volume);\\n configsToAck.push(configIds.ReadSystemSettings.Volume);\\n break;\\n case '0A': //Performance mode\\n //var workMode = hexToDecimal(value);\\n //messageBody = messageBody + keyLengthHex + key + value;\\n //AddValue(codeValues, \\\"WorkMode\\\", workMode);\\n //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\n //configsToAck.push(configIds.ReadPerformance`Settings.Mode);\\n //var workMode = hexToAscii(value.substring(0, value.length));\\n //var workMode = hexToDecimal(value);\\n //var workMode = hexToAscii(value.substring(0, value.length));\\n var workMode = 1234; // + value + \\\"end\\\";\\n //var workModeVal = 9;\\n //workMode = 'test10';\\n imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-MODE;${imei};`);\\n AddValue(codeValues, \\\"Mode\\\", workMode);\\n AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\n configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n //AddValue(codeValues, \\\"performanceMode\\\", performanceMode);\\n //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, performanceMode);\\n // configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\n break;\\n case '1B':\\n //Decimal o ascii?\\n var gsmModule = hexToDecimal(value);\\n messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n case '1F':\\n //System Language\\n var systemLanguage = hexToAscii(value.substring(0, value.length));\\n imei = serverParams.Imei;\\n //messageBody = messageBody + keyLengthHex + key + value;\\n messageForReceiver = (`Watch;ACK-LANG;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"SystemLanguage\\\", systemLanguage);\\n AddValue(configsToUpdate, configIds.ReadSystemSettings.SystemLanguage, systemLanguage);\\n configsToAck.push(configIds.ReadSystemSettings.SystemLanguage);\\n break;\\n case '33': // phone option\\n // [Value]:83 0B 00 00 {\\\"phoneOption\\\":{\\\"flag_value\\\":2947,\\\"s3\\\":1,\\\"s4\\\":0,\\\"s5\\\":1,\\\"s6\\\":0,\\\"callIncoming\\\":0,\\\"rings\\\":3,\\\"s7\\\":0,\\\"toneID\\\":0,\\\"s1\\\":1,\\\"s2\\\":1}}\\n var statusPhone = hexToBin(value.substring(0, 2)); // To find autoanswer setup\\n if (statusPhone.substring(0, 1) == '1') { // 1 Enable\\n var auto = 'true';\\n } else var auto = 'false';\\n statusPhone = hexToBin(value.substring(2, 4)); // To find allow list setup\\n if (statusPhone.substring(7, 8) == '1') { // 1 Enable\\n allow = 'true';\\n } else var allow = 'false';\\n //statusPhone = hexToBin(value.substring(0, 2)) + hexToBin(value.substring(2, 4));\\n //AddValue(configsToUpdate, configIds.ReadSystemSettings.Statusphone, statusPhone);\\n AddValue(configsToUpdate, configIds.ReadSystemSettings.AllowList, allow);\\n AddValue(configsToUpdate, configIds.ReadSystemSettings.AutoAnswer, auto);\\n //configsToAck.push(configIds.ReadSystemSettings.Statusphone);\\n configsToAck.push(configIds.ReadSystemSettings.AllowList);\\n configsToAck.push(configIds.ReadSystemSettings.AutoAnswer);\\n break;\\n case '34': //ContactList with name\\n var contactNumber = value.substring(1, 2);\\n var telLength = hexToDecimal(value.substring(2, 4));\\n var tel = '';\\n switch (contactNumber) {\\n // Emergency Number\\n case '0':\\n tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\n AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\n AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\n configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\n break;\\n // Speed Dial Number\\n //case '1':\\n // tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\n // AddValue(codeValues, \\\"SpeedDialNumber\\\", tel);\\n // AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.SpeedDialNumber, tel);\\n // configsToAck.push(configIds.ReadSpeedDialSettings.SpeedDialNumber);\\n // break;\\n // Gateway Number\\n case '9': //00447781482635,Esendex UK 0034627177148,Esendex Spain 00447507288240,Esendex UK Acceptance\\n tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\n if (tel.includes('447781482635') || tel.includes('00447781482635')) {\\n tel = 'Esendex UK'\\n } else if (tel.includes('34627177148') || tel.includes('0034627177148')) {\\n tel = 'Esendex Spain'\\n } else if (tel.includes('447507288240') || tel.includes('00447507288240')) {\\n tel = 'Esendex UK Acceptance'\\n } else {\\n tel = 'Default'\\n }\\n AddValue(codeValues, \\\"SMSGateway\\\", tel);\\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\n configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\n break;\\n default:\\n tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\n if (tel.length < 6) {\\n contacts += '';\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\n break;\\n }\\n //contacts += 'A' + (contactNumber - 1) + ': ' + tel + ', ';\\n contacts += tel + ', ';\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\n break;\\n }\\n break;\\n case '40': // APN\\n //no ACK need\\n AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'));\\n configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\n var apn = hexToAscii(value.substring(0, value.length));\\n imei = serverParams.Imei;\\n break;\\n case '41': // APN Username\\n //no ACK need\\n //apn = apn + ',' + hexToAscii(value.substring(0, value.length));\\n break;\\n case '42': // APN Password\\n //no ACK need\\n //apn = apn + ',' + hexToAscii(value.substring(0, value.length));\\n messageForReceiver = (`Watch;ACK-GDATA;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"apn\\\", apn);\\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.APN, apn);\\n configsToAck.push(configIds.ReadCommunicationSettings.APN);\\n break;\\n case '43': //Server Details\\n //52.232.85.255,5678 production 52.174.17.77,5678 acceptance\\n var serverDetails = hexToAscii(value.substring(6, value.length)) + ':' + hexToDecimal(value.substring(4, 6) + value.substring(2, 4));\\n if (serverDetails.includes('52.232.85.255:5678')) {\\n serverDetails = 'Production'\\n } else if (serverDetails.includes('52.174.17.77:5678')) {\\n serverDetails = 'Acceptance'\\n } else if (serverDetails.includes('52.174.17.77:5778')) {\\n serverDetails = 'Protocol-Import'\\n } else if (serverDetails.includes('52.174.17.77:5878')) {\\n serverDetails = 'Protocol-Dev'\\n } else {\\n serverDetails = 'Default'\\n }\\n AddValue(codeValues, \\\"server\\\", serverDetails);\\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.Server, serverDetails);\\n configsToAck.push(configIds.ReadCommunicationSettings.Server);\\n break;\\n case '44': //time interval - work mode intervals\\n imei = serverParams.Imei;\\n messageForReceiver = (`Watch;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 '46': //HeartRate\\n // '10 0E 00 80'\\n var HeartRateStatus = hexToBin(value.substring(6, 8));\\n var enalbleDisable = '';\\n if (HeartRateStatus.substring(0, 1) == '1') {\\n var hrate = 'Enable, '\\n enalbleDisable = '1'\\n } else {\\n var hrate = 'Disable, '\\n };\\n var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\n hrate += detectingInterval;\\n AddValue(codeValues, \\\"hrate\\\", hrate);\\n var imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings, enalbleDisable);\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\n configsToAck.push(configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings);\\n configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\n break;\\n case '47': // Custom Id\\n imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-CUSTID;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"customeid\\\", value);\\n AddValue(configsToUpdate, configIds.ReadState.CustomId, hexToAscii(value)); //now it comes \\\"3036\\\"\\n configsToAck.push(configIds.ReadState.CustomId);\\n break;\\n case '53': // Non motion alert\\n //2B020080\\n var status = hexToBin(value.substring(6, 8));\\n var alertSetting = '';\\n var enableDisable = '';\\n if (status.substring(0, 1) == '1') {\\n alertSetting = 'Enable, '\\n enableDisable = '1';\\n } else {\\n alertSetting = 'Disable, '\\n };\\n //if (status.substring(5, 6) == '1') {\\n // alertSetting += 'Dial, '\\n //} else {\\n // alertSetting += 'No Dial, '\\n //};\\n var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\n alertSetting += time;\\n imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-NOMOTION;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"nomotion\\\", alertSetting);\\n //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings, enableDisable);\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\n //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\n configsToAck.push(configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings);\\n configsToAck.push(configIds.ReadNonMovementSettings.Time);\\n break;\\n case '56': //Fall down sensibility\\n // '00001100'\\n var fallStatus = hexToBin(value.substring(0, 2));\\n var enalbleDisable = '';\\n //if (fallStatus.substring(4, 5) == '1') {\\n if (fallStatus.substring(0, 1) == '1') {\\n var sensibility = 'Enable, '\\n enalbleDisable = '1'\\n } else {\\n var sensibility = 'Disable, '\\n };\\n if (fallStatus.substring(5, 6) == '1') {\\n sensibility += 'Dial, '\\n } else {\\n sensibility += 'No Dial, '\\n };\\n var imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-FALLALERT;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n var sesibityOptionValue = hexToDecimal(value.substring(1, 2));\\n sensibility += sesibityOptionValue;\\n AddValue(codeValues, \\\"sensibility\\\", sensibility);\\n //AddValue(configsToUpdate, configIds.ReadAlertSettings.FallSettings, sensibility);\\n AddValue(configsToUpdate, configIds.ReadFallSettings.EnableDisableFallSettings, enalbleDisable);\\n AddValue(configsToUpdate, configIds.ReadFallSettings.Sensitivity, sesibityOptionValue);\\n //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\n configsToAck.push(configIds.ReadFallSettings.EnableDisableFallSettings);\\n configsToAck.push(configIds.ReadFallSettings.Sensitivity);\\n break;\\n case '73': //BeaconList\\n var beaconNumber = hexToDecimal(value.substring(1, 2));\\n var beaconStatus = hexToBin(value.substring(0, 1));\\n beaconStatus = hexToAscii(value.substring(30, value.length));\\n //beaconStatus = changeEndianness(value.substring(30, value.length));\\n //homeBeacon += 'B' + (beaconNumber + 1) + ': ' + beaconStatus + ', ';\\n homeBeacon += beaconStatus + ', ';\\n AddValue(codeValues, \\\"homeBeacon\\\", homeBeacon);\\n messageForReceiver = (`Watch;ACK-GDATA;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\n configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\n break;\\n case '4A': //Wifi Network List\\n var wifiSSIDLenght = hexToDecimal(value.substring(2, 4));\\n var wifiPasswordLenght = hexToDecimal(value.substring(4, 6));\\n var wifiIndex = hexToDecimal(value.substring(1, 2));\\n //var wifiStatus = hexToDecimal(value.substring(0, 1));\\n var wifiStatus = value.substring(0, 1);\\n /*var enalbleDisable = wifiSSID = wifiPassword = homeWifi = '';\\n /var homeWifi = '';\\n if (wifiIndex == '0') { // Only first Wifi of the list\\n if (wifiStatus == '8') {\\n homeWifi += ' Enable, '\\n enalbleDisable = '1';\\n } else {\\n homeWifi += ' Disable, '\\n //enalbleDisable = '0';\\n };*/\\n if ((wifiStatus == '8') || (wifiStatus == 'C')) { // 8 == ON OR C== ON and Connected\\n var wifiSSID = hexToAscii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\n var wifiPassword = hexToAscii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\n var imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-WIFI;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n //homeWiFi += 'W' + (wifiIndex + 1) + ': ' + wifiSSID + ', ' + wifiPassword + ';';\\n homeWiFi += wifiSSID + ', ' + wifiPassword + ';';\\n AddValue(codeValues, \\\"wifi\\\", homeWiFi);\\n AddValue(configsToUpdate, configIds.ReadWiFiList.WiFiList, homeWiFi);\\n configsToAck.push(configIds.ReadWiFiList.WiFiList);\\n }\\n //AddValue(configsToUpdate, configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings, enalbleDisable);\\n //AddValue(configsToUpdate, configIds.ReadWiFiSettings.SSID, wifiSSID);\\n //AddValue(configsToUpdate, configIds.ReadWiFiSettings.Password, wifiPassword);\\n //configsToAck.push(configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings);\\n //configsToAck.push(configIds.ReadWiFiSettings.SSID);\\n //configsToAck.push(configIds.ReadWiFiSettings.Password);\\n break;\\n case '21': // Speed Dial Settings\\n // [Value]:53 84 {\\\"call1Button\\\":{\\\"mode\\\":0,\\\"feedBack\\\":3,\\\"task\\\":2,\\\"time\\\":20,\\\"status\\\":1}}\\n var status = hexToBin(value.substring(2, 4)); //always pass 2 HEXs to this function\\n var alertSetting = '';\\n var enalbleDisable = '';\\n if (status.substring(0, 1) == '1') {\\n alertSetting = 'Enable, '\\n enalbleDisable = '1'\\n } else {\\n alertSetting = 'Disable, '\\n //enableDisable = '0';\\n };\\n //var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\n //alertSetting += time;\\n imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-SPEED;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"speed\\\", alertSetting);\\n //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\n AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\n //AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\n //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\n configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\n //configsToAck.push(configIds.ReadNonMovementSettings.Time);\\n break;\\n }\\n }\\n }\\n if (command == '03') {\\n while (index < total_length + 16) {\\n var keyLengthHex = message.substring(index, index = index + 2);\\n var keyLength = 2 * hexToDecimal(keyLengthHex);\\n var key = message.substring(index, index = index + 2);\\n var value = message.substring(index, index = index + keyLength - 2);\\n debug('key = ' + key);\\n debug('value = ' + value);\\n switch (key) {\\n case '01': // Device ID\\n var imei = hexToAscii(value);\\n // create long connection if it is needed\\n if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\n //return;\\n }\\n break;\\n //CustomID is not provided so far with command type 03.. commented in the mean time\\n /* case '03':\\n //update customID to check if belongs to this type of device\\n customID = value;\\n if (value != '04') {\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n AddValue(codeValues, \\\"customID\\\", value);\\n return\\n } else {\\n if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\n }\\n AddValue(codeValues, \\\"customID\\\", value);\\n general += 'customID:' + value + ',';\\n break;\\n }\\n break; */\\n case '10': // Heartbeat\\n var heartbeat = hexToAscii(value);\\n event_time = moment.utc().unix();\\n if (index < total_length + 16) {\\n var keyLengthHex = message.substring(index, index = index + 2);\\n keyLength = 2 * hexToDecimal(keyLengthHex);\\n key = message.substring(index, index = index + 2);\\n if (key == '24') {\\n // debug('key: ' + key) //comment those out\\n value = message.substring(index, index = index + keyLength - 2);\\n // debug(value)\\n var timestampHex = value.substring(0, 8);\\n // debug('timestampt hex: ' + timestampHex)\\n timestampHex = changeEndianness(timestampHex);\\n timestamp = hexToDecimal(timestampHex);\\n event_time = timestamp;\\n // debug(event_time)\\n var statusHex = changeEndianness(value.substring(8, 16));\\n // debug(statusHex)\\n var statusInt = hexToDecimal(statusHex);\\n var statusDevice = '';\\n if ((statusInt & 1) == 1) {\\n statusDevice += 'GPS,';\\n }\\n if ((statusInt & 2) == 2) {\\n statusDevice += 'WIFISource,';\\n }\\n if ((statusInt & 4) == 4) {\\n statusDevice += 'CellTower,';\\n }\\n if ((statusInt & 8) == 8) {\\n statusDevice += 'BLELocation,';\\n }\\n if ((statusInt & 16) == 16) {\\n statusDevice += 'Charging,';\\n }\\n if ((statusInt & 32) == 32) {\\n statusDevice += 'FUllyCharged,';\\n }\\n if ((statusInt & 64) == 64) {\\n statusDevice += 'Reboot,';\\n }\\n if ((statusInt & 128) == 128) {\\n statusDevice += 'HistoricalData,';\\n }\\n if ((statusInt & 256) == 256) {\\n statusDevice += 'AGPSDataValid,';\\n }\\n if ((statusInt & 512) == 512) {\\n statusDevice += 'Motion,';\\n }\\n if ((statusInt & 1024) == 1024) {\\n statusDevice += 'SmartLocating,';\\n }\\n if ((statusInt & 2048) == 2048) {\\n statusDevice += 'BeaconLocation,';\\n }\\n if ((statusInt & 4096) == 4096) {\\n statusDevice += 'BLEConnected,';\\n }\\n statusDevice = statusDevice.slice(0, -1);\\n // debug('statusHex:' + statusHex)\\n statusHex = (statusHex);\\n statusHex = hexToBin(statusHex);\\n statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\n // debug(statusHex)\\n battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\n // debug(battery_percentage)\\n // debug(battery_percentage)\\n // debug(statusHex.substring(8, 13))\\n cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\n // debug(cellNetworkSignal)\\n workMode = parseInt(statusHex.substring(13, 16), 2);\\n // debug(workMode)\\n general += 'statusDevice:' + statusDevice + ';';\\n if (battery_percentage) {\\n general += 'battery:' + battery_percentage + ';';\\n }\\n if (cellNetworkSignal) {\\n general += 'cellNetworkSignal:' + cellNetworkSignal + ';';\\n }\\n if (workMode) {\\n general += 'workMode:' + workMode + ';';\\n }\\n }\\n }\\n // revisar\\n var gen_location = '0';\\n //CustomID is not provided so far with command type 03.. commented in the mean time\\n /*if (customID != '04') {\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n AddValue(codeValues, \\\"customID\\\", value);\\n return\\n }*/\\n //messageForReceiver = (`Eview-HTB;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};SIGNAL=${cellNetworkSignal};WM=${workMode};SL=${systemLanguage};GENERAL=${general}`);\\n messageForReceiver = (`Watch-HTB;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n //messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n case '12': // Device requesting timestamp\\n timestamp = moment.utc().unix();\\n timestampHex = decimalToHex(timestamp);\\n timestampHex = changeEndianness(timestampHex);\\n keyLengthHex = ('00' + decimalToHex(1 + (timestampHex.length) / 2)).slice(-2);\\n // respond to device with the timestamp of the server\\n messageBody = messageBody + keyLengthHex + key + timestampHex;\\n messageForReceiver = `Eview;${imei};${sequenceID};Get timestamp`;\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n break;\\n case '21': //Cell Towers\\n var mccHex = value.substring(0, 2);\\n var mncHex = value.substring(2, 3);\\n var mcc = hexToDecimal(mccHex);\\n var mnc = hexToDecimal(mncHex);\\n var numTowers = (keyLength - 4) / 5;\\n var cellTowers = hexToAscii(value);\\n messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n case '22': // WIFI locations \\n location_type = 'WIFI';\\n var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\n //location_time = timestamp;\\n var wifiTowers = value;\\n general += 'wifiTowers:';\\n var indexWifi = 0;\\n var bssid_array = [];\\n gen_location = '';\\n for (let i = 0; i < numWifi; i++) {\\n gen_location += wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\n indexWifi += 14;\\n }\\n gen_location = gen_location.slice(0, -1);\\n general += gen_location;\\n //CustomID is not provided so far with command type 03\\n /*if (customID != '04') {\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n AddValue(codeValues, \\\"customID\\\", value);\\n return\\n }*/\\n if (alarmCode) {\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};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 = (`Watch-ACK;${imei};${message}`); // ${sequenceID}; add ${sequenceID}; 19-07\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n var value = message.substring(index, index = index + keyLength - 2);\\n if (typeof configIds !== 'undefined' && configIds && configIds.ConfigureDevice && configIds.ConfigureDevice.LastConfigured) { // when is defined\\n AddValue(configsToUpdate, configIds.ConfigureDevice.LastConfigured, moment().format('YYYY/MM/DD, HH:mm:ss'));\\n configsToAck.push(configIds.ConfigureDevice.LastConfigured);\\n }\\n //}\\n }\\n if (command == 'FE') {\\n while (index < total_length + 16) {\\n var keyLength = message.substring(index, index = index + 2);\\n keyLength = 2 * hexToDecimal(keyLength);\\n var key = message.substring(index, index = index + 2);\\n var value = message.substring(index, index = index + keyLength - 2);\\n }\\n }\\n // prepare the ACK msg and change config if it is needed\\n lengthAck = messageBody.length / 2;\\n lengthAck = ('0000' + decimalToHex(lengthAck)).slice(-4);\\n lengthAck = lengthAck.toString().substring(2, 4) + lengthAck.toString().substring(0, 2);\\n ////////////checksum CRC 16\\n var checksumAck = byteStringToByteArray(messageBody);\\n checksumAck = crc16byte(checksumAck);\\n checksumAck = decimalToHex(checksumAck);\\n checksumAck = ('0000' + checksumAck).slice(-4);\\n checksumAck = checksumAck.toString().substring(2, 4) + checksumAck.toString().substring(0, 2);\\n prefix = prefix + lengthAck + checksumAck + sequenceID;\\n // To send ACK to the device previous to internal msg with parts\\n if (needsAck == true) {\\n if (messageBody.length <= 2) {\\n ack = 'AB00030008C7' + sequenceID + '7F0100'; // change AB10030008C7 to AB00030008C7\\n } else {\\n ack = prefix + messageBody;\\n }\\n AddValue(codeValues, 'imei', imei);\\n AddValue(codeValues, 'ack', ack);\\n }\\n } else { // checksum was invalid - print out useful debug info and bet quess at imei \\n AddValue(codeValues, \\\"error\\\", \\\"checksum failed for message\\\");\\n AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n i = rawFromBytes.search('3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]');\\n if (i >= 0) {\\n imei = hexToAscii(rawFromBytes.substring(i, i + 30));\\n AddValue(codeValues, \\\"imei\\\", imei);\\n }\\n }\\n }\\n // Auxiliary functions\\n function buildDataToReceiver(codeValues, configsToAck = [], configsToUpdate = [], configsToSend = []) {\\n const dataToReceiver = {\\n values: codeValues\\n };\\n if (configsToAck.length > 0) {\\n dataToReceiver.configsToAck = configsToAck;\\n }\\n if (configsToUpdate.length > 0) {\\n dataToReceiver.configsToUpdate = configsToUpdate;\\n }\\n if (configsToSend.length > 0) {\\n dataToReceiver.configsToSend = configsToSend;\\n }\\n return dataToReceiver;\\n }\\n\\n function AddValue(codeValueArray, p1, p2) { // push code value pair into array\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n codeValueArray.push(cvpair);\\n }\\n // convert functions\\n function asciiToHex(str) { // ascii to hex \\n return [...str].map(char => char.charCodeAt(0).toString(16).padStart(2, '0')).join('');\\n }\\n\\n function byteStringToByteArray(str) { // convierte una cadena hexadecimal en un array de bytes (number[])\\n const bytes = [];\\n for (let i = 0; i < str.length; i += 2) {\\n const byte = parseInt(str.substring(i, i + 2), 16);\\n if (!isNaN(byte) && byte >= 0 && byte <= 255) {\\n bytes.push(byte);\\n }\\n }\\n return bytes;\\n }\\n\\n function decimalToHex(x) {\\n return Number(x).toString(16).toUpperCase();\\n }\\n\\n function hexToBin(hex) { // convierte un valor hexadecimal a su representación binaria, y asegura que tenga al menos 8 bits \\n const bin = parseInt(hex, 16).toString(2);\\n return bin.padStart(hex.length * 4, '0');\\n }\\n\\n function hexToAscii(hex) {\\n if (hex.length % 2 !== 0) {\\n throw new Error(\\\"Hex string length must be even\\\");\\n }\\n let ascii = '';\\n for (let i = 0; i < hex.length; i += 2) {\\n const byte = hex.substr(i, 2);\\n const charCode = parseInt(byte, 16);\\n if (charCode !== 0) { // remove null character (\\\\u0000)\\n ascii += String.fromCharCode(charCode);\\n }\\n }\\n return ascii;\\n //return hex.match(/.{2}/g).map(byte => String.fromCharCode(parseInt(byte, 16))).join('');\\n }\\n\\n function hexToDecimalSigned(hex) { // hex to decimal\\n if (hex.length % 2 !== 0) {\\n hex = '0' + hex;\\n }\\n const num = parseInt(hex, 16);\\n const bits = hex.length * 4;\\n const maxVal = 2 ** bits;\\n return num >= maxVal / 2 ? num - maxVal : num;\\n }\\n\\n function hexToDecimal(hex) {\\n return parseInt(hex, 16);\\n }\\n // CheckSum and debug functions\\n function changeEndianness(hexString) { // changeEndianness\\n if (hexString.length === 0) { //if string is empty or not defined\\n return \\\"\\\";\\n }\\n if (hexString.length % 2 !== 0) {\\n throw new Error(\\\"Hex string length must be even\\\");\\n }\\n return hexString.match(/.{2}/g) // divide in bytes (2 chars)\\n .reverse() // reverse the order\\n .join('');\\n }\\n\\n function calculateCheckSum(payloadData) { // calcula el CRC16 sobre una cadena hexadecimal y devuelve el valor con el endianness invertido\\n const bytes = byteStringToByteArray(payloadData);\\n const crc = crc16byte(bytes);\\n const hex = crc.toString(16).padStart(4, '0').toUpperCase();\\n return changeEndianness(hex);\\n }\\n\\n function crc16byte(byteArray) { // calcula el CRC-16 sobre un array de bytes usando una tabla precalculada (crcTable)\\n let crc = 0x0000;\\n for (const byte of byteArray) {\\n if (byte < 0 || byte > 255 || !Number.isInteger(byte)) {\\n throw new RangeError(\\\"Invalid byte value in input array\\\");\\n }\\n const index = (byte ^ (crc >> 8)) & 0xFF;\\n crc = crcTable[index] ^ (crc << 8);\\n }\\n return crc & 0xFFFF;\\n }\\n\\n function debug(...args) { // write debug info to console log, if localTesting\\n if (localTesting) {\\n console.debug('[DEBUG]', ...args);\\n }\\n }\\n /*\\n function sendMessageToLocalhostNoWait(str) { // sends message to system, closing connection after\\n var server;\\n if (localTesting) {\\n console.log('local testing - sending to protocol-dev server the message ... '); // port 5878\\n console.log(str);\\n server = '52.174.17.77';\\n } else {\\n server = '127.0.0.1';\\n }\\n var c = net.createConnection(5878, server);\\n c.on('error', function(error) {\\n c = net.createConnection(5878, server);\\n });\\n c.write(`${str}`);\\n c.end();\\n }*/\\n function sendMessageToLocalhostNoWait(message) {\\n const server = localTesting ? '52.174.17.77' : '127.0.0.1';\\n //const port = localTesting ? '5878' : ''; //Protocol-dev\\n const port = '5678'; //acceptance-dev\\n if (localTesting) {\\n console.debug('[DEBUG] Sending message to test server:', message);\\n }\\n const client = net.createConnection(port, server, () => {\\n client.write(message);\\n client.end();\\n });\\n client.on('error', (err) => {\\n console.error(`[ERROR] Failed to send message to ${server}:${port}:`, err.message);\\n });\\n client.on('end', () => {\\n if (localTesting) {\\n console.debug('[DEBUG] Connection closed');\\n }\\n });\\n }\\n}\\n// params is not defined locally -> export as module\\nif (typeof(params) === 'undefined') {\\n module.exports = {\\n execute_ops\\n }\\n} else { // on server use local defined vars\\n let return_values = execute_ops(moment, msg, net, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\n // define global returns\\n msg = return_values;\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1749579352},{"Type":1,"NewValue":"{\"Id\":437,\"Name\":\"Access TEC Care Watch\",\"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 // Watch protocol - please see variables and typical values in order below\\n // Watch-CYC;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;SIGNAL=<>;WM=<>;GENERAL=<>\\n // Watch-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\n //\\n // Author: Juanmi Navarro\\n // Created: 01/01/0000\\n // Last modified: 20/05/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', 'Watch');\\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 = (`Watch-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 //<>,<>,<> \\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 //<>,<>,<> \\n if (mac2) {\\n AddValue(codeValues, 'beacon_mac', mac2);\\n var simpleQuery2 = [{\\n 'code': 'Mac',\\n 'value': mac2,\\n }];\\n var simpleQueryLabel2 = {\\n 'table': 'beacons',\\n 'select': 'Name',\\n 'query': simpleQuery2\\n };\\n var labels2 = [];\\n labels2.push(JSON.stringify(simpleQueryLabel2));\\n AddValue(codeValues, 'oysta_labels', JSON.stringify(labels2));\\n }\\n if (params.beacon_major) {\\n AddValue(codeValues, 'beacon_major', params.beacon_major);\\n } else {\\n AddValue(codeValues, 'beacon_major', 0);\\n }\\n if (params.beacon_minor) {\\n AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\n } else {\\n AddValue(codeValues, 'beacon_minor', 0);\\n }\\n //AddValue(codeValues,'oysta_labels', label);\\n //AddValue(codeValues,'oysta_value', mac);\\n if (location_time) {\\n AddValue(codeValues, 'location_time', location_time);\\n }\\n }\\n /* meter mas tarde... \\n if (params.smart_data !== 'undefined') {\\n var gen_location = params.smart_data.split(',')\\n var latitude = gen_location[0]\\n var longitude = gen_location[1]\\n var location_accuracy = gen_location[2]\\n var altitude = gen_location[3]\\n AddValue(codeValues,'latitude', latitude);\\n AddValue(codeValues,'longitude', longitude);\\n AddValue(codeValues,'altitude', altitude);\\n AddValue(codeValues,'location_accuracy', location_accuracy);\\n }\\n */\\n /*else if ((params.event_time) && (params.event_time == '')) {\\n var event_time = moment.utc().unix();\\n AddValue(codeValues,'event_time', event_time);\\n } revisar mas adelante*/\\n // to parse SMS info from the device\\n switch (messageTypeLocalCode) {\\n case 'COMM-SMS': // SMS message sent in\\n if (params.data.startsWith('Device location request')) {\\n configsToAck.push(configIds.Controls.RealTimeLocate);\\n } else if (params.data.startsWith('Set IP ok')) {\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\n } else if (params.data.startsWith('IMEI:')) {\\n configsToAck.push(configIds.Controls.GetFirmwareVersion);\\n } else if (params.data.startsWith('Set IP ok')) {\\n configsToAck.push(configIds.Controls.ClearBufferedMessages);\\n } else if (params.data.startsWith('flush ok')) {\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\n } else if (params.data.startsWith('Set Watch-')) {\\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 = (`Watch-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 = (`Watch;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 = (`Watch;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 = (`Watch-RTL;${params.imei};${location_time};${location_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n break;\\n }\\n if (!params.event_time && !event_time) { // if params.event_time undefined - set it to now. \\n var event_time = moment.utc().unix();\\n AddValue(codeValues, 'event_time', event_time);\\n }\\n // if (!params.location_time && !location_time) { // if params.location_time undefined - set it to now. \\n // var location_time = moment.utc().unix();\\n // AddValue(codeValues, 'location_time', location_time);\\n //}\\n }\\n // send data msg to kibana\\n const data = buildDataToReceiver(codeValues, configsToAck, configsToUpdate, configsToSend);\\n console.log(data);\\n return data\\n // end of main operation\\n // define functions used in operation\\n // decode global msg\\n function decoder(str) { // decode rawdata\\n // CARE Decoder\\n AddValue(codeValues, 'Message : ', str);\\n var message = str;\\n // need to check if checksum is correct for possible msg corruption 10/03/23\\n var checksum = message.substring(8, 12);\\n var messageBody = message.substring(16, message.length);\\n debug('message =' + message);\\n debug('checksum =' + checksum);\\n debug('calculateCheckSum =' + calculateCheckSum(messageBody));\\n if (calculateCheckSum(messageBody) == checksum) { // payload is valid\\n debug(\\\"message has valid checksum\\\");\\n var messageBody = command; // update value for the ACK\\n debug('command =' + command);\\n if (command == '01') {\\n while (index < total_length + 16) {\\n // gen_location = '0'; //cambiado 30/09\\n var keyLengthHex = message.substring(index, index = index + 2);\\n var keyLength = 2 * hexToDecimal(keyLengthHex);\\n var key = message.substring(index, index = index + 2);\\n var value = message.substring(index, index = index + keyLength - 2);\\n debug('key = ' + key);\\n debug('value = ' + value);\\n switch (key) {\\n //Device ID\\n case '01':\\n var imei = hexToAscii(value);\\n // create long connection if it is needed\\n if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\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\\n if ((alarmCodeExtInt & 1) == 1) {\\n var alarm = 'ALF-C';\\n }\\n // Welfare Check-out\\n else if ((alarmCodeExtInt & 2) == 2) {\\n var alarm = 'ALA-C';\\n }\\n // Standard Alerts\\n //Battery low\\n else if ((alarmCodeInt & 1) == 1) {\\n var alarm = 'BATL';\\n }\\n //Overspeed\\n else if ((alarmCodeInt & 2) == 2) {\\n var alarm = 'ALSP';\\n }\\n //Fall\\n else if ((alarmCodeInt & 4) == 4) {\\n var alarm = 'ALF';\\n }\\n //Tilt\\n else if ((alarmCodeInt & 8) == 8) {\\n var alarm = 'Tilt';\\n } else if ((alarmCodeInt & 16) == 16) {\\n if ((alarmCodeInt & 16777216) == 16777216) {\\n var alarm = 'Geo1-IN';\\n } else {\\n var alarm = 'Geo1-OUT';\\n }\\n } else if ((alarmCodeInt & 32) == 32) {\\n if ((alarmCodeInt & 33554432) == 33554432) {\\n var alarm = 'Geo2-IN';\\n } else {\\n var alarm = 'Geo2-OUT';\\n }\\n } else if ((alarmCodeInt & 64) == 64) {\\n if ((alarmCodeInt & 67108864) == 67108864) {\\n var alarm = 'Geo3-IN';\\n } else {\\n var alarm = 'Geo3-OUT';\\n }\\n } else if ((alarmCodeInt & 128) == 128) {\\n if ((alarmCodeInt & 134217728) == 134217728) {\\n var alarm = 'Geo4-IN';\\n } else {\\n var alarm = 'Geo4-OUT';\\n }\\n }\\n //Power Off\\n else if ((alarmCodeInt & 256) == 256) {\\n var alarm = 'PWRF';\\n }\\n //Power On\\n else if ((alarmCodeInt & 512) == 512) {\\n var alarm = 'PWRN';\\n }\\n //Motion\\n else if ((alarmCodeInt & 1024) == 1024) {\\n var alarm = 'ALMOV';\\n }\\n //No Motion\\n else if ((alarmCodeInt & 2048) == 2048) {\\n var alarm = 'ALNM';\\n }\\n //SOS\\n else if ((alarmCodeInt & 4096) == 4096) {\\n var alarm = 'ALSOS';\\n } else if ((alarmCodeInt & 8192) == 8192) {\\n var alarm = 'Side1';\\n } else if ((alarmCodeInt & 16384) == 16384) {\\n var alarm = 'Side2';\\n }\\n //Battery charging\\n else if ((alarmCodeInt & 32768) == 32768) {\\n var alarm = 'BATCN';\\n }\\n //Battery no charging\\n else if ((alarmCodeInt & 65536) == 65536) {\\n var alarm = 'BATCF';\\n }\\n //SOS Ending\\n // Temporary Commented until we know exactly how it works. 22/09/2022\\n else if ((alarmCodeInt & 131072) == 131072) {\\n var alarm = 'SOSEnding';\\n info = 'Alarm Finished';\\n }\\n //Amber Alert EC03 only\\n else if ((alarmCodeInt & 262144) == 262144) {\\n var alarm = 'ALAO';\\n }\\n // welfare Alert check-in ALA-O\\n else if ((alarmCodeInt & 524288) == 524288) {\\n var alarm = 'ALA-O';\\n }\\n // Amber alert Ending ALA-C\\n else if ((alarmCodeInt & 1048576) == 1048576) {\\n var alarm = 'ALA-C';\\n }\\n // Amber alert Ending ALA-C\\n //else if ((alarmCodeInt & 1048576) == 1048576) {\\n // var alarm = 'ALA-C';\\n //}\\n // Fall-Down Alert ending\\n else if ((alarmCodeInt & 2097152) == 2097152) {\\n var alarm = 'ALF-C';\\n }\\n // welfare Alert Ending ALA\\n else if ((alarmCodeInt & 4194304) == 4194304) {\\n var alarm = 'ALA';\\n }\\n // Beacon absent Alert 11/10/22. Need to be added in msg types\\n //else if ((alarmCodeInt & 16777216) == 16777216) {\\n // var alarm = 'BEA';\\n //}\\n general += 'alarm:' + alarm + ',';\\n break;\\n //Custom ID\\n case '03':\\n // in value is customID.... '06' for Watch Care\\n // if ((imei != '860470063029395') && (imei != '860470063035947')) {\\n //update customID to check if belongs to this type of device\\n //value = hexToAscii(value);\\n customID = value;\\n if (value != '3036') {\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n AddValue(codeValues, \\\"customID\\\", value);\\n // exit decoder\\n // const data = buildDataToReceiver(codeValues, configsToAck, configsToUpdate, configsToSend);\\n // console.log(data);\\n return // data\\n } else {\\n if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\n //return;\\n }\\n AddValue(codeValues, \\\"customID\\\", value);\\n general += 'customID:' + value + ',';\\n break;\\n }\\n //Historical Data Completed\\n case '10': // indica q se han terminado de enviar todos los datos historicos.\\n var histData = true;\\n break;\\n //GPS location\\n case '20':\\n location_type = 'GPS';\\n var latitudeHex = value.substring(0, 8);\\n var longitudeHex = value.substring(8, 16);\\n var speedHex = value.substring(16, 20);\\n var directionHex = value.substring(20, 24);\\n var altitudeHex = value.substring(24, 28);\\n var location_accuracyHex = value.substring(28, 32);\\n var mileageHex = value.substring(32, 40);\\n var satellitesHex = value.substring(40, 42);\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n speed = ((hexToDecimal(changeEndianness(speedHex))) / 3.6).toFixed(2); //date 14-02-2023 in m/s\\n var direction = hexToDecimal(changeEndianness(directionHex));\\n var altitude = hexToDecimal(changeEndianness(altitudeHex)); // in meters\\n //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\n // Range: 0.5 to 99.9 \\n location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\n //var mileage = hexToDecimal(changeEndianness(mileageHex)) this is in km/h we need m/s\\n var mileage = hexToDecimal(changeEndianness(mileageHex)); // in meters date 14-02-2023\\n var satellites = hexToDecimal(satellitesHex);\\n // location_time = timestamp;\\n //<>,<>,<>,<>,<>\\n gps_data = `${latitude},${longitude},${location_accuracy},${speed},${direction},${altitude},${satellites},${mileage}`;\\n general += 'gps location (lat):' + latitude + ', (long):' + longitude + ',';\\n break;\\n //WIFI Towers\\n case '22':\\n location_type = 'WIFI';\\n var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\n //location_time = timestamp;\\n var wifiTowers = value;\\n general += 'wifiTowers:';\\n var indexWifi = 0;\\n var bssid_array = [];\\n wifi_data = '';\\n for (let i = 0; i < numWifi; i++) {\\n wifi_data += hexToDecimalSigned(wifiTowers.substring(indexWifi, indexWifi + 2)) + ',' + wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\n indexWifi += 14;\\n }\\n wifi_data = wifi_data.slice(0, -1);\\n general += wifi_data;\\n break;\\n //BLE Location Added 10/10/22\\n case '23':\\n location_type = 'BLE';\\n var mac = value.substring(0, 12);\\n var latitudeHex = value.substring(12, 20);\\n var longitudeHex = value.substring(20, 28);\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n var address = hexToAscii(value.substring(28, value.length));\\n var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\n // add : format in MAC\\n mac = mac.match(/.{1,2}/g).join(':');\\n // location_time = timestamp;\\n ble_data = `${latitude},${longitude},${mac},${address}`;\\n general += 'BLE location (lat):' + latitude + ', (long):' + longitude + ',';\\n break;\\n //General Data , status_data\\n case '24':\\n //var general = 'true'\\n if (customID != '3036') {\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n AddValue(codeValues, \\\"customID\\\", customID);\\n return\\n }\\n if (alarmCode) {\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\n }\\n //else {\\n // messageForReceiver = (`CareWatch-CYC;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};`);\\n //}\\n // reset variables\\n //alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\n var timestampHex = value.substring(0, 8);\\n timestampHex = changeEndianness(timestampHex);\\n timestamp = hexToDecimal(timestampHex);\\n location_time = timestamp;\\n event_time = timestamp;\\n // HardCode to fix possible issue in protocol\\n //event_time = moment.utc().unix();\\n // end of hard code\\n var statusHex = changeEndianness(value.substring(8, 16));\\n var statusInt = hexToDecimal(statusHex);\\n var statusDevice = '';\\n if ((statusInt & 1) == 1) {\\n statusDevice += 'GPS,';\\n }\\n if ((statusInt & 2) == 2) {\\n statusDevice += 'WIFISource,';\\n }\\n if ((statusInt & 4) == 4) {\\n statusDevice += 'CellTower,';\\n }\\n if ((statusInt & 8) == 8) {\\n statusDevice += 'BLELocation,';\\n }\\n //params.BatteryStatus.BatteryStatus = '1';\\n if ((statusInt & 16) == 16) {\\n statusDevice += 'Charging,';\\n // var alarm = 'BATCN';\\n //configs.BatteryStatus.BatteryStatus = '1';\\n /* if (configs.BatteryStatus.BatteryStatus !== '1') {\\n hasConfigs = true;\\n var batteryStatus = '1';\\n var alarm = 'BATCN';\\n let configsToUpdate = [];\\n configsToUpdate.push({\\n 'code': configIds.BatteryStatus.BatteryStatus,\\n 'value': batteryStatus\\n });\\n }*/\\n }\\n if ((statusInt & 32) == 32) {\\n statusDevice += 'FUllyCharged,';\\n //var alarm = 'BATF';\\n // configs.BatteryStatus.BatteryStatus = '3';\\n /* if (configs.BatteryStatus.BatteryStatus !== '3') {\\n hasConfigs = true;\\n var batteryStatus = '3';\\n var alarm = 'BATF';\\n let configsToUpdate = [];\\n configsToUpdate.push({\\n 'code': configIds.BatteryStatus.BatteryStatus,\\n 'value': batteryStatus\\n });\\n }*/\\n }\\n /* if (!((statusInt & 32) == 32) & !((statusInt & 16) == 16)) {\\n statusDevice += 'Not Charging,';\\n var alarm = 'BATCF';\\n //configs.BatteryStatus.BatteryStatus = '2';\\n if (configs.BatteryStatus.BatteryStatus !== '2') {\\n var batteryStatus = '2';\\n var alarm = 'BATCF';\\n let configsToUpdate = [];\\n configsToUpdate.push({\\n 'code': configIds.BatteryStatus.BatteryStatus,\\n 'value': batteryStatus\\n });\\n }\\n }*/\\n if ((statusInt & 64) == 64) {\\n statusDevice += 'Reboot,';\\n }\\n if ((statusInt & 128) == 128) {\\n statusDevice += 'HistoricalData,';\\n }\\n if ((statusInt & 256) == 256) {\\n statusDevice += 'AGPSDataValid,';\\n }\\n if ((statusInt & 512) == 512) {\\n statusDevice += 'Motion,';\\n }\\n if ((statusInt & 1024) == 1024) {\\n statusDevice += 'SmartLocating,';\\n }\\n if ((statusInt & 2048) == 2048) { //isHome\\n statusDevice += 'BeaconLocation,';\\n }\\n if ((statusInt & 4096) == 4096) {\\n statusDevice += 'BLEConnected,';\\n }\\n if ((statusInt & 16384) == 16384) {\\n statusDevice += 'HomeWiFi,';\\n }\\n statusDevice = statusDevice.slice(0, -1);\\n status_data = statusDevice; //to oysta template\\n //statusHex = (statusHex);\\n statusHex = hexToBin(statusHex);\\n statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\n battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\n cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\n workMode = parseInt(statusHex.substring(13, 16), 2);\\n general += 'statusDevice:' + statusDevice + ',';\\n if (battery_percentage) {\\n general += 'battery:' + battery_percentage + ',';\\n }\\n if (cellNetworkSignal) {\\n general += 'cellNetworkSignal:' + cellNetworkSignal + ',';\\n }\\n if (workMode) {\\n general += 'workMode:' + workMode + ',';\\n }\\n //messageForReceiver = (`CareWatch-CYC;${imei};${i};${event_time};${battery_percentage}`);\\n break;\\n //Call Records\\n case '25':\\n //Needed?\\n break;\\n //BLE Location 2\\n case '26':\\n //I don't understand\\n //messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n //Smart Location\\n case '27':\\n location_type = 'SMART';\\n var latitudeHex = value.substring(0, 8);\\n var longitudeHex = value.substring(8, 16);\\n var location_accuracyHex = value.substring(16, 20);\\n var altitudeHex = value.substring(20, 24);\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n var altitude = hexToDecimal(changeEndianness(altitudeHex));\\n //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\n //04/08/2022 se quita el multiplicador por 5 pq ya viene el valor en metros\\n location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\n //location_time = timestamp;\\n smart_data = `${latitude},${longitude},${location_accuracy},${altitude}`;\\n general += 'smart location (lat):' + latitude + ', (long):' + longitude + ',';\\n break;\\n //Beacon Location Added 11/10/22\\n case '28':\\n location_type = 'BEACON';\\n // var alarm = 'EBZI';\\n var latitudeHex = '00';\\n var longitudeHex = '00';\\n var descr = 'empty';\\n var flag = hexToDecimal(value.substring(0, 1));\\n var beacId = hexToDecimal(value.substring(1, 2));\\n // msg includes descrip\\n if ((flag & 4) == 4) {\\n descr = hexToAscii(value.substring(18, value.length));\\n }\\n // msg includes lat/lon\\n if ((flag & 8) == 8) {\\n latitudeHex = value.substring(18, 26);\\n longitudeHex = value.substring(26, 34);\\n }\\n // msg includes lat/lon and description\\n if ((flag & 12) == 12) {\\n latitudeHex = value.substring(18, 26);\\n longitudeHex = value.substring(26, 34);\\n descr = hexToAscii(value.substring(34, value.length));\\n }\\n var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\n // add : format in MAC\\n mac = mac.match(/.{1,2}/g).join(':');\\n var rssiHex = value.substring(14, 16);\\n var rssi1Hex = value.substring(16, 18);\\n rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\n rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\n // var latitudeHex = value.substring(18, 26);\\n // var longitudeHex = value.substring(26, 34);\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n //location_time = timestamp;\\n beacon_data = `${latitude},${longitude},${mac},${descr}`;\\n general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (listIndex):' + beacId + ',';\\n break;\\n // Beacon V2\\n case '2C':\\n location_type = 'BEACON';\\n // var alarm = 'EBZI';\\n var latitudeHex = '00';\\n var longitudeHex = '00';\\n var descr = 'empty';\\n var flag = hexToDecimal(value.substring(0, 1));\\n var beacId = hexToDecimal(value.substring(1, 2));\\n // msg includes descrip\\n if ((flag & 4) == 4) {\\n let desc_leng = hexToDecimal(value.substring(20, 22));\\n descr = hexToAscii(value.substring(22, 22 + (2 * desc_leng)));\\n //descr = hexToAscii(value.substring(18, value.length));\\n }\\n // msg includes lat/lon\\n if ((flag & 8) == 8) {\\n latitudeHex = value.substring(18, 26);\\n longitudeHex = value.substring(26, 34);\\n }\\n // msg includes lat/lon and description\\n if ((flag & 12) == 12) {\\n latitudeHex = value.substring(20, 28);\\n longitudeHex = value.substring(28, 36);\\n let desc_leng = hexToDecimal(value.substring(36, 38));\\n descr = hexToAscii(value.substring(38, 38 + (2 * desc_leng)));\\n }\\n var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\n // add : format in MAC\\n mac = mac.match(/.{1,2}/g).join(':');\\n var rssiHex = value.substring(14, 16);\\n var rssi1Hex = value.substring(16, 18);\\n rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\n rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\n var battery_beacon = hexToDecimal(value.substring(18, 20));\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n //location_time = timestamp;\\n beacon_data = `${latitude},${longitude},${mac},${descr}`;\\n general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (battery):' + battery_beacon + ', (listIndex):' + beacId + ',';\\n break;\\n //Cell Towers Note\\n case '29':\\n location_type = 'LBS';\\n lbs_data = '';\\n var mccHex = changeEndianness(value.substring(0, 4));\\n var mncHex = value.substring(4, 6);\\n var mcc = hexToDecimal(mccHex);\\n lbs_data += mcc + ',';\\n var mnc = hexToDecimal(mncHex);\\n lbs_data += mnc + ',';\\n var indexLbs = 6;\\n var numTowers = (hexToDecimal(keyLengthHex) - 4) / 7;\\n for (let i = 0; i < numTowers; i++) {\\n var rxlHex = changeEndianness(value.substring(indexLbs, indexLbs + 2));\\n var rxl = hexToDecimal(rxlHex);\\n var lacHex = changeEndianness(value.substring(indexLbs + 2, indexLbs + 6));\\n var lac = hexToDecimal(lacHex);\\n var cellTowers = hexToDecimal(changeEndianness(value.substring(indexLbs + 6, indexLbs + 14)));\\n lbs_data += rxl + ',' + lac + ',' + cellTowers + ',';\\n indexLbs += 14;\\n }\\n lbs_data = lbs_data.slice(0, -1);\\n general += lbs_data;\\n break;\\n case '30':\\n //G-sensor.\\n //value = hexToAscii(value);\\n //if (value != '06') {\\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 = (`Watch-${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 //value = hexToAscii(value);\\n //if (value != '06') {\\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 = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n }\\n break;\\n //BLE Connected . For Flic button\\n case '62':\\n location_type = 'BLE';\\n //var alarm = 'EBZI'; \\n //var latitudeHex = '00';\\n //var longitudeHex = '00';\\n //var descr = 'empty';\\n var flag = hexToDecimal(value.substring(0, 2)); // 0= Disconnected, 1= Connected\\n var mac = value.substring(2, 14); // No hace falta darle la vuelta\\n // add : format in MAC\\n mac = mac.match(/.{1,2}/g).join(':');\\n var batLevel = hexToDecimal(value.substring(14, 16)); // 0-100\\n //location_time = timestamp;\\n ble_data = `${flag},${batLevel},${mac}`;\\n general += 'BLE location (State):' + flag + ', (bat):' + batLevel + ', (mac):' + mac + ',';\\n break;\\n }\\n }\\n if (alarmCode) {\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};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 = (`Watch;ACK-FIRM;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\n //AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\n configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\n //configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\n //messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n case '1A':\\n //no ACK need\\n var fwVersion = hexToAscii(value);\\n imei = serverParams.Imei;\\n AddValue(codeValues, \\\"imei\\\", imei);\\n AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\n messageForReceiver = (`Watch;ACK-FIRM;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\n //AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\n configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\n //configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\n break;\\n //IMEI\\n case '03':\\n var imei = hexToDecimal(value);\\n // harcode to avoid conflicts with Rio protocol\\n //if ((imei != '860470063029395') && (imei != '860470063035947')) {\\n // AddValue(codeValues, \\\"error\\\", \\\"device imei is not in this protocol\\\");\\n // AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n //AddValue(codeValues, \\\"IMEI\\\", imei);\\n // return\\n //}\\n if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\n //return;\\n }\\n messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n //ICCID\\n case '04':\\n var iccid = hexToDecimal(value);\\n messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n //BLE-MAC\\n case '05':\\n var bleMac = hexToDecimal(value);\\n messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n //Run Time\\n case '07':\\n var runTime = hexToDecimal(value);\\n messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n case '10': // Ringer Volume\\n var volume = hexToDecimal(value);\\n imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-VOL;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"Volume\\\", volume);\\n AddValue(configsToUpdate, configIds.ReadSystemSettings.Volume, volume);\\n configsToAck.push(configIds.ReadSystemSettings.Volume);\\n break;\\n case '0A': //Performance mode\\n //var workMode = hexToDecimal(value);\\n //messageBody = messageBody + keyLengthHex + key + value;\\n //AddValue(codeValues, \\\"WorkMode\\\", workMode);\\n //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\n //configsToAck.push(configIds.ReadPerformance`Settings.Mode);\\n //var workMode = hexToAscii(value.substring(0, value.length));\\n //var workMode = hexToDecimal(value);\\n //var workMode = hexToAscii(value.substring(0, value.length));\\n var workMode = 1234; // + value + \\\"end\\\";\\n //var workModeVal = 9;\\n //workMode = 'test10';\\n imei = serverParams.Imei;\\n messageForReceiver = (`Watch;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 '0F': // Enable control.... Used for STEP COUNTING SETTINGS\\n // 'FF FF 21 80'\\n var StepStatus = hexToBin(value.substring(4, 6));\\n var enalbleDisable = '';\\n if (StepStatus.substring(7, 8) == '1') {\\n var step = 'Enable, '\\n enalbleDisable = '1'\\n } else {\\n var step = 'Disable, '\\n };\\n //var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\n //hrate += detectingInterval;\\n AddValue(codeValues, \\\"step\\\", step);\\n //var imei = serverParams.Imei;\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(configsToUpdate, configIds.ReadStepsSettings.EnableDisableReadStepsSettings, enalbleDisable);\\n //AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\n configsToAck.push(configIds.ReadStepsSettings.EnableDisableReadStepsSettings);\\n //configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\n break;\\n case '1B':\\n //Decimal o ascii?\\n var gsmModule = hexToDecimal(value);\\n messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n case '1F':\\n //System Language\\n var systemLanguage = hexToAscii(value.substring(0, value.length));\\n imei = serverParams.Imei;\\n //messageBody = messageBody + keyLengthHex + key + value;\\n messageForReceiver = (`Watch;ACK-LANG;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"SystemLanguage\\\", systemLanguage);\\n AddValue(configsToUpdate, configIds.ReadSystemSettings.SystemLanguage, systemLanguage);\\n configsToAck.push(configIds.ReadSystemSettings.SystemLanguage);\\n break;\\n case '33': // phone option\\n // [Value]:83 0B 00 00 {\\\"phoneOption\\\":{\\\"flag_value\\\":2947,\\\"s3\\\":1,\\\"s4\\\":0,\\\"s5\\\":1,\\\"s6\\\":0,\\\"callIncoming\\\":0,\\\"rings\\\":3,\\\"s7\\\":0,\\\"toneID\\\":0,\\\"s1\\\":1,\\\"s2\\\":1}}\\n var statusPhone = hexToBin(value.substring(0, 2)); // To find autoanswer setup\\n if (statusPhone.substring(0, 1) == '1') { // 1 Enable\\n var auto = 'true';\\n } else var auto = 'false';\\n statusPhone = hexToBin(value.substring(2, 4)); // To find allow list setup\\n if (statusPhone.substring(7, 8) == '1') { // 1 Enable\\n allow = 'true';\\n } else var allow = 'false';\\n //statusPhone = hexToBin(value.substring(0, 2)) + hexToBin(value.substring(2, 4));\\n //AddValue(configsToUpdate, configIds.ReadSystemSettings.Statusphone, statusPhone);\\n AddValue(configsToUpdate, configIds.ReadSystemSettings.AllowList, allow);\\n AddValue(configsToUpdate, configIds.ReadSystemSettings.AutoAnswer, auto);\\n //configsToAck.push(configIds.ReadSystemSettings.Statusphone);\\n configsToAck.push(configIds.ReadSystemSettings.AllowList);\\n configsToAck.push(configIds.ReadSystemSettings.AutoAnswer);\\n break;\\n case '34': //ContactList with name\\n var contactNumber = value.substring(1, 2);\\n var telLength = hexToDecimal(value.substring(2, 4));\\n var tel = '';\\n switch (contactNumber) {\\n // Emergency Number\\n case '0':\\n tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\n AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\n AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\n configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\n break;\\n // Speed Dial Number\\n //case '1':\\n // tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\n // AddValue(codeValues, \\\"SpeedDialNumber\\\", tel);\\n // AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.SpeedDialNumber, tel);\\n // configsToAck.push(configIds.ReadSpeedDialSettings.SpeedDialNumber);\\n // break;\\n // Gateway Number\\n case '9': //00447781482635,Esendex UK 0034627177148,Esendex Spain 00447507288240,Esendex UK Acceptance\\n tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\n if (tel.includes('447781482635') || tel.includes('00447781482635')) {\\n tel = 'Esendex UK'\\n } else if (tel.includes('34627177148') || tel.includes('0034627177148')) {\\n tel = 'Esendex Spain'\\n } else if (tel.includes('447507288240') || tel.includes('00447507288240')) {\\n tel = 'Esendex UK Acceptance'\\n } else {\\n tel = 'Default'\\n }\\n AddValue(codeValues, \\\"SMSGateway\\\", tel);\\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\n configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\n break;\\n default:\\n tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\n if (tel.length < 6) {\\n contacts += '';\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\n break;\\n }\\n //contacts += 'A' + (contactNumber - 1) + ': ' + tel + ', ';\\n contacts += tel + ', ';\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\n break;\\n }\\n break;\\n case '40': // APN\\n //no ACK need\\n AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'));\\n configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\n var apn = hexToAscii(value.substring(0, value.length));\\n imei = serverParams.Imei;\\n break;\\n case '41': // APN Username\\n //no ACK need\\n //apn = apn + ',' + hexToAscii(value.substring(0, value.length));\\n break;\\n case '42': // APN Password\\n //no ACK need\\n //apn = apn + ',' + hexToAscii(value.substring(0, value.length));\\n messageForReceiver = (`Watch;ACK-GDATA;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"apn\\\", apn);\\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.APN, apn);\\n configsToAck.push(configIds.ReadCommunicationSettings.APN);\\n break;\\n case '43': //Server Details\\n //52.232.85.255,5678 production 52.174.17.77,5678 acceptance\\n var serverDetails = hexToAscii(value.substring(6, value.length)) + ':' + hexToDecimal(value.substring(4, 6) + value.substring(2, 4));\\n if (serverDetails.includes('52.232.85.255:5678')) {\\n serverDetails = 'Production'\\n } else if (serverDetails.includes('52.174.17.77:5678')) {\\n serverDetails = 'Acceptance'\\n } else if (serverDetails.includes('52.174.17.77:5778')) {\\n serverDetails = 'Protocol-Import'\\n } else if (serverDetails.includes('52.174.17.77:5878')) {\\n serverDetails = 'Protocol-Dev'\\n } else {\\n serverDetails = 'Default'\\n }\\n AddValue(codeValues, \\\"server\\\", serverDetails);\\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.Server, serverDetails);\\n configsToAck.push(configIds.ReadCommunicationSettings.Server);\\n break;\\n case '44': //time interval - work mode intervals\\n imei = serverParams.Imei;\\n messageForReceiver = (`Watch;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 '46': //HeartRate\\n // '10 0E 00 80'\\n var HeartRateStatus = hexToBin(value.substring(6, 8));\\n var enalbleDisable = '';\\n if (HeartRateStatus.substring(0, 1) == '1') {\\n var hrate = 'Enable, '\\n enalbleDisable = '1'\\n } else {\\n var hrate = 'Disable, '\\n };\\n var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\n hrate += detectingInterval;\\n AddValue(codeValues, \\\"hrate\\\", hrate);\\n //var imei = serverParams.Imei;\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings, enalbleDisable);\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\n configsToAck.push(configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings);\\n configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\n break;\\n case '47': // Custom Id\\n imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-CUSTID;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"customeid\\\", value);\\n AddValue(configsToUpdate, configIds.ReadState.CustomId, hexToAscii(value)); //now it comes \\\"3036\\\"\\n configsToAck.push(configIds.ReadState.CustomId);\\n break;\\n case '53': // Non motion alert\\n //2B020080\\n var status = hexToBin(value.substring(6, 8));\\n var alertSetting = '';\\n var enableDisable = '';\\n if (status.substring(0, 1) == '1') {\\n alertSetting = 'Enable, '\\n enableDisable = '1';\\n } else {\\n alertSetting = 'Disable, '\\n };\\n //if (status.substring(5, 6) == '1') {\\n // alertSetting += 'Dial, '\\n //} else {\\n // alertSetting += 'No Dial, '\\n //};\\n var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\n alertSetting += time;\\n imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-NOMOTION;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"nomotion\\\", alertSetting);\\n //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings, enableDisable);\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\n //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\n configsToAck.push(configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings);\\n configsToAck.push(configIds.ReadNonMovementSettings.Time);\\n break;\\n case '56': //Fall down sensibility\\n // '00001100'\\n var fallStatus = hexToBin(value.substring(0, 2));\\n var enalbleDisable = '';\\n //if (fallStatus.substring(4, 5) == '1') {\\n if (fallStatus.substring(0, 1) == '1') {\\n var sensibility = 'Enable, '\\n enalbleDisable = '1'\\n } else {\\n var sensibility = 'Disable, '\\n };\\n if (fallStatus.substring(5, 6) == '1') {\\n sensibility += 'Dial, '\\n } else {\\n sensibility += 'No Dial, '\\n };\\n var imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-FALLALERT;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n var sesibityOptionValue = hexToDecimal(value.substring(1, 2));\\n sensibility += sesibityOptionValue;\\n AddValue(codeValues, \\\"sensibility\\\", sensibility);\\n //AddValue(configsToUpdate, configIds.ReadAlertSettings.FallSettings, sensibility);\\n AddValue(configsToUpdate, configIds.ReadFallSettings.EnableDisableFallSettings, enalbleDisable);\\n AddValue(configsToUpdate, configIds.ReadFallSettings.Sensitivity, sesibityOptionValue);\\n //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\n configsToAck.push(configIds.ReadFallSettings.EnableDisableFallSettings);\\n configsToAck.push(configIds.ReadFallSettings.Sensitivity);\\n break;\\n case '73': //BeaconList\\n var beaconNumber = hexToDecimal(value.substring(1, 2));\\n var beaconStatus = hexToBin(value.substring(0, 1));\\n beaconStatus = hexToAscii(value.substring(30, value.length));\\n //beaconStatus = changeEndianness(value.substring(30, value.length));\\n //homeBeacon += 'B' + (beaconNumber + 1) + ': ' + beaconStatus + ', ';\\n homeBeacon += beaconStatus + ', ';\\n AddValue(codeValues, \\\"homeBeacon\\\", homeBeacon);\\n messageForReceiver = (`Watch;ACK-GDATA;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\n configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\n break;\\n case '4A': //Wifi Network List\\n var wifiSSIDLenght = hexToDecimal(value.substring(2, 4));\\n var wifiPasswordLenght = hexToDecimal(value.substring(4, 6));\\n var wifiIndex = hexToDecimal(value.substring(1, 2));\\n //var wifiStatus = hexToDecimal(value.substring(0, 1));\\n var wifiStatus = value.substring(0, 1);\\n /*var enalbleDisable = wifiSSID = wifiPassword = homeWifi = '';\\n /var homeWifi = '';\\n if (wifiIndex == '0') { // Only first Wifi of the list\\n if (wifiStatus == '8') {\\n homeWifi += ' Enable, '\\n enalbleDisable = '1';\\n } else {\\n homeWifi += ' Disable, '\\n //enalbleDisable = '0';\\n };*/\\n if ((wifiStatus == '8') || (wifiStatus == 'C')) { // 8 == ON OR C== ON and Connected\\n var wifiSSID = hexToAscii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\n var wifiPassword = hexToAscii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\n var imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-WIFI;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n //homeWiFi += 'W' + (wifiIndex + 1) + ': ' + wifiSSID + ', ' + wifiPassword + ';';\\n homeWiFi += wifiSSID + ', ' + wifiPassword + ';';\\n AddValue(codeValues, \\\"wifi\\\", homeWiFi);\\n AddValue(configsToUpdate, configIds.ReadWiFiList.WiFiList, homeWiFi);\\n configsToAck.push(configIds.ReadWiFiList.WiFiList);\\n }\\n //AddValue(configsToUpdate, configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings, enalbleDisable);\\n //AddValue(configsToUpdate, configIds.ReadWiFiSettings.SSID, wifiSSID);\\n //AddValue(configsToUpdate, configIds.ReadWiFiSettings.Password, wifiPassword);\\n //configsToAck.push(configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings);\\n //configsToAck.push(configIds.ReadWiFiSettings.SSID);\\n //configsToAck.push(configIds.ReadWiFiSettings.Password);\\n break;\\n case '21': // Speed Dial Settings\\n // [Value]:53 84 {\\\"call1Button\\\":{\\\"mode\\\":0,\\\"feedBack\\\":3,\\\"task\\\":2,\\\"time\\\":20,\\\"status\\\":1}}\\n var status = hexToBin(value.substring(2, 4)); //always pass 2 HEXs to this function\\n var alertSetting = '';\\n var enalbleDisable = '';\\n if (status.substring(0, 1) == '1') {\\n alertSetting = 'Enable, '\\n enalbleDisable = '1'\\n } else {\\n alertSetting = 'Disable, '\\n //enableDisable = '0';\\n };\\n //var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\n //alertSetting += time;\\n imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-SPEED;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"speed\\\", alertSetting);\\n //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\n AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\n //AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\n //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\n configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\n //configsToAck.push(configIds.ReadNonMovementSettings.Time);\\n break;\\n }\\n }\\n }\\n if (command == '03') {\\n while (index < total_length + 16) {\\n var keyLengthHex = message.substring(index, index = index + 2);\\n var keyLength = 2 * hexToDecimal(keyLengthHex);\\n var key = message.substring(index, index = index + 2);\\n var value = message.substring(index, index = index + keyLength - 2);\\n debug('key = ' + key);\\n debug('value = ' + value);\\n switch (key) {\\n case '01': // Device ID\\n var imei = hexToAscii(value);\\n // create long connection if it is needed\\n if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\n //return;\\n }\\n break;\\n //CustomID is not provided so far with command type 03.. commented in the mean time\\n /* case '03':\\n //update customID to check if belongs to this type of device\\n customID = value;\\n if (value != '04') {\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n AddValue(codeValues, \\\"customID\\\", value);\\n return\\n } else {\\n if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\n }\\n AddValue(codeValues, \\\"customID\\\", value);\\n general += 'customID:' + value + ',';\\n break;\\n }\\n break; */\\n case '10': // Heartbeat\\n var heartbeat = hexToAscii(value);\\n event_time = moment.utc().unix();\\n if (index < total_length + 16) {\\n var keyLengthHex = message.substring(index, index = index + 2);\\n keyLength = 2 * hexToDecimal(keyLengthHex);\\n key = message.substring(index, index = index + 2);\\n if (key == '24') {\\n // debug('key: ' + key) //comment those out\\n value = message.substring(index, index = index + keyLength - 2);\\n // debug(value)\\n var timestampHex = value.substring(0, 8);\\n // debug('timestampt hex: ' + timestampHex)\\n timestampHex = changeEndianness(timestampHex);\\n timestamp = hexToDecimal(timestampHex);\\n event_time = timestamp;\\n // debug(event_time)\\n var statusHex = changeEndianness(value.substring(8, 16));\\n // debug(statusHex)\\n var statusInt = hexToDecimal(statusHex);\\n var statusDevice = '';\\n if ((statusInt & 1) == 1) {\\n statusDevice += 'GPS,';\\n }\\n if ((statusInt & 2) == 2) {\\n statusDevice += 'WIFISource,';\\n }\\n if ((statusInt & 4) == 4) {\\n statusDevice += 'CellTower,';\\n }\\n if ((statusInt & 8) == 8) {\\n statusDevice += 'BLELocation,';\\n }\\n if ((statusInt & 16) == 16) {\\n statusDevice += 'Charging,';\\n }\\n if ((statusInt & 32) == 32) {\\n statusDevice += 'FUllyCharged,';\\n }\\n if ((statusInt & 64) == 64) {\\n statusDevice += 'Reboot,';\\n }\\n if ((statusInt & 128) == 128) {\\n statusDevice += 'HistoricalData,';\\n }\\n if ((statusInt & 256) == 256) {\\n statusDevice += 'AGPSDataValid,';\\n }\\n if ((statusInt & 512) == 512) {\\n statusDevice += 'Motion,';\\n }\\n if ((statusInt & 1024) == 1024) {\\n statusDevice += 'SmartLocating,';\\n }\\n if ((statusInt & 2048) == 2048) {\\n statusDevice += 'BeaconLocation,';\\n }\\n if ((statusInt & 4096) == 4096) {\\n statusDevice += 'BLEConnected,';\\n }\\n statusDevice = statusDevice.slice(0, -1);\\n // debug('statusHex:' + statusHex)\\n statusHex = (statusHex);\\n statusHex = hexToBin(statusHex);\\n statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\n // debug(statusHex)\\n battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\n // debug(battery_percentage)\\n // debug(battery_percentage)\\n // debug(statusHex.substring(8, 13))\\n cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\n // debug(cellNetworkSignal)\\n workMode = parseInt(statusHex.substring(13, 16), 2);\\n // debug(workMode)\\n general += 'statusDevice:' + statusDevice + ';';\\n if (battery_percentage) {\\n general += 'battery:' + battery_percentage + ';';\\n }\\n if (cellNetworkSignal) {\\n general += 'cellNetworkSignal:' + cellNetworkSignal + ';';\\n }\\n if (workMode) {\\n general += 'workMode:' + workMode + ';';\\n }\\n }\\n }\\n // revisar\\n var gen_location = '0';\\n //CustomID is not provided so far with command type 03.. commented in the mean time\\n /*if (customID != '04') {\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n AddValue(codeValues, \\\"customID\\\", value);\\n return\\n }*/\\n //messageForReceiver = (`Eview-HTB;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};SIGNAL=${cellNetworkSignal};WM=${workMode};SL=${systemLanguage};GENERAL=${general}`);\\n messageForReceiver = (`Watch-HTB;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n //messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n case '12': // Device requesting timestamp\\n timestamp = moment.utc().unix();\\n timestampHex = decimalToHex(timestamp);\\n timestampHex = changeEndianness(timestampHex);\\n keyLengthHex = ('00' + decimalToHex(1 + (timestampHex.length) / 2)).slice(-2);\\n // respond to device with the timestamp of the server\\n messageBody = messageBody + keyLengthHex + key + timestampHex;\\n messageForReceiver = `Eview;${imei};${sequenceID};Get timestamp`;\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n break;\\n case '21': //Cell Towers\\n var mccHex = value.substring(0, 2);\\n var mncHex = value.substring(2, 3);\\n var mcc = hexToDecimal(mccHex);\\n var mnc = hexToDecimal(mncHex);\\n var numTowers = (keyLength - 4) / 5;\\n var cellTowers = hexToAscii(value);\\n messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n case '22': // WIFI locations \\n location_type = 'WIFI';\\n var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\n //location_time = timestamp;\\n var wifiTowers = value;\\n general += 'wifiTowers:';\\n var indexWifi = 0;\\n var bssid_array = [];\\n gen_location = '';\\n for (let i = 0; i < numWifi; i++) {\\n gen_location += wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\n indexWifi += 14;\\n }\\n gen_location = gen_location.slice(0, -1);\\n general += gen_location;\\n //CustomID is not provided so far with command type 03\\n /*if (customID != '04') {\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n AddValue(codeValues, \\\"customID\\\", value);\\n return\\n }*/\\n if (alarmCode) {\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};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 = (`Watch-ACK;${imei};${message}`); // ${sequenceID}; add ${sequenceID}; 19-07\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n var value = message.substring(index, index = index + keyLength - 2);\\n if (typeof configIds !== 'undefined' && configIds && configIds.ConfigureDevice && configIds.ConfigureDevice.LastConfigured) { // when is defined\\n AddValue(configsToUpdate, configIds.ConfigureDevice.LastConfigured, moment().format('YYYY/MM/DD, HH:mm:ss'));\\n configsToAck.push(configIds.ConfigureDevice.LastConfigured);\\n }\\n //}\\n }\\n if (command == 'FE') {\\n while (index < total_length + 16) {\\n var keyLength = message.substring(index, index = index + 2);\\n keyLength = 2 * hexToDecimal(keyLength);\\n var key = message.substring(index, index = index + 2);\\n var value = message.substring(index, index = index + keyLength - 2);\\n }\\n }\\n // prepare the ACK msg and change config if it is needed\\n lengthAck = messageBody.length / 2;\\n lengthAck = ('0000' + decimalToHex(lengthAck)).slice(-4);\\n lengthAck = lengthAck.toString().substring(2, 4) + lengthAck.toString().substring(0, 2);\\n ////////////checksum CRC 16\\n var checksumAck = byteStringToByteArray(messageBody);\\n checksumAck = crc16byte(checksumAck);\\n checksumAck = decimalToHex(checksumAck);\\n checksumAck = ('0000' + checksumAck).slice(-4);\\n checksumAck = checksumAck.toString().substring(2, 4) + checksumAck.toString().substring(0, 2);\\n prefix = prefix + lengthAck + checksumAck + sequenceID;\\n // To send ACK to the device previous to internal msg with parts\\n if (needsAck == true) {\\n if (messageBody.length <= 2) {\\n ack = 'AB00030008C7' + sequenceID + '7F0100'; // change AB10030008C7 to AB00030008C7\\n } else {\\n ack = prefix + messageBody;\\n }\\n AddValue(codeValues, 'imei', imei);\\n AddValue(codeValues, 'ack', ack);\\n }\\n } else { // checksum was invalid - print out useful debug info and bet quess at imei \\n AddValue(codeValues, \\\"error\\\", \\\"checksum failed for message\\\");\\n AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n i = rawFromBytes.search('3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]');\\n if (i >= 0) {\\n imei = hexToAscii(rawFromBytes.substring(i, i + 30));\\n AddValue(codeValues, \\\"imei\\\", imei);\\n }\\n }\\n }\\n // Auxiliary functions\\n function buildDataToReceiver(codeValues, configsToAck = [], configsToUpdate = [], configsToSend = []) {\\n const dataToReceiver = {\\n values: codeValues\\n };\\n if (configsToAck.length > 0) {\\n dataToReceiver.configsToAck = configsToAck;\\n }\\n if (configsToUpdate.length > 0) {\\n dataToReceiver.configsToUpdate = configsToUpdate;\\n }\\n if (configsToSend.length > 0) {\\n dataToReceiver.configsToSend = configsToSend;\\n }\\n return dataToReceiver;\\n }\\n\\n function AddValue(codeValueArray, p1, p2) { // push code value pair into array\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n codeValueArray.push(cvpair);\\n }\\n // convert functions\\n function asciiToHex(str) { // ascii to hex \\n return [...str].map(char => char.charCodeAt(0).toString(16).padStart(2, '0')).join('');\\n }\\n\\n function byteStringToByteArray(str) { // convierte una cadena hexadecimal en un array de bytes (number[])\\n const bytes = [];\\n for (let i = 0; i < str.length; i += 2) {\\n const byte = parseInt(str.substring(i, i + 2), 16);\\n if (!isNaN(byte) && byte >= 0 && byte <= 255) {\\n bytes.push(byte);\\n }\\n }\\n return bytes;\\n }\\n\\n function decimalToHex(x) {\\n return Number(x).toString(16).toUpperCase();\\n }\\n\\n function hexToBin(hex) { // convierte un valor hexadecimal a su representación binaria, y asegura que tenga al menos 8 bits \\n const bin = parseInt(hex, 16).toString(2);\\n return bin.padStart(hex.length * 4, '0');\\n }\\n\\n function hexToAscii(hex) {\\n if (hex.length % 2 !== 0) {\\n throw new Error(\\\"Hex string length must be even\\\");\\n }\\n let ascii = '';\\n for (let i = 0; i < hex.length; i += 2) {\\n const byte = hex.substr(i, 2);\\n const charCode = parseInt(byte, 16);\\n if (charCode !== 0) { // remove null character (\\\\u0000)\\n ascii += String.fromCharCode(charCode);\\n }\\n }\\n return ascii;\\n //return hex.match(/.{2}/g).map(byte => String.fromCharCode(parseInt(byte, 16))).join('');\\n }\\n\\n function hexToDecimalSigned(hex) { // hex to decimal\\n if (hex.length % 2 !== 0) {\\n hex = '0' + hex;\\n }\\n const num = parseInt(hex, 16);\\n const bits = hex.length * 4;\\n const maxVal = 2 ** bits;\\n return num >= maxVal / 2 ? num - maxVal : num;\\n }\\n\\n function hexToDecimal(hex) {\\n return parseInt(hex, 16);\\n }\\n // CheckSum and debug functions\\n function changeEndianness(hexString) { // changeEndianness\\n if (hexString.length === 0) { //if string is empty or not defined\\n return \\\"\\\";\\n }\\n if (hexString.length % 2 !== 0) {\\n throw new Error(\\\"Hex string length must be even\\\");\\n }\\n return hexString.match(/.{2}/g) // divide in bytes (2 chars)\\n .reverse() // reverse the order\\n .join('');\\n }\\n\\n function calculateCheckSum(payloadData) { // calcula el CRC16 sobre una cadena hexadecimal y devuelve el valor con el endianness invertido\\n const bytes = byteStringToByteArray(payloadData);\\n const crc = crc16byte(bytes);\\n const hex = crc.toString(16).padStart(4, '0').toUpperCase();\\n return changeEndianness(hex);\\n }\\n\\n function crc16byte(byteArray) { // calcula el CRC-16 sobre un array de bytes usando una tabla precalculada (crcTable)\\n let crc = 0x0000;\\n for (const byte of byteArray) {\\n if (byte < 0 || byte > 255 || !Number.isInteger(byte)) {\\n throw new RangeError(\\\"Invalid byte value in input array\\\");\\n }\\n const index = (byte ^ (crc >> 8)) & 0xFF;\\n crc = crcTable[index] ^ (crc << 8);\\n }\\n return crc & 0xFFFF;\\n }\\n\\n function debug(...args) { // write debug info to console log, if localTesting\\n if (localTesting) {\\n console.debug('[DEBUG]', ...args);\\n }\\n }\\n /*\\n function sendMessageToLocalhostNoWait(str) { // sends message to system, closing connection after\\n var server;\\n if (localTesting) {\\n console.log('local testing - sending to protocol-dev server the message ... '); // port 5878\\n console.log(str);\\n server = '52.174.17.77';\\n } else {\\n server = '127.0.0.1';\\n }\\n var c = net.createConnection(5878, server);\\n c.on('error', function(error) {\\n c = net.createConnection(5878, server);\\n });\\n c.write(`${str}`);\\n c.end();\\n }*/\\n function sendMessageToLocalhostNoWait(message) {\\n const server = localTesting ? '52.174.17.77' : '127.0.0.1';\\n //const port = localTesting ? '5878' : ''; //Protocol-dev\\n const port = '5678'; //acceptance-dev\\n if (localTesting) {\\n console.debug('[DEBUG] Sending message to test server:', message);\\n }\\n const client = net.createConnection(port, server, () => {\\n client.write(message);\\n client.end();\\n });\\n client.on('error', (err) => {\\n console.error(`[ERROR] Failed to send message to ${server}:${port}:`, err.message);\\n });\\n client.on('end', () => {\\n if (localTesting) {\\n console.debug('[DEBUG] Connection closed');\\n }\\n });\\n }\\n}\\n// params is not defined locally -> export as module\\nif (typeof(params) === 'undefined') {\\n module.exports = {\\n execute_ops\\n }\\n} else { // on server use local defined vars\\n let return_values = execute_ops(moment, msg, net, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\n // define global returns\\n msg = return_values;\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1749580364},{"Type":1,"NewValue":"{\"Id\":437,\"Name\":\"Access TEC Care Watch\",\"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 // Watch protocol - please see variables and typical values in order below\\r\\n // Watch-CYC;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;SIGNAL=<>;WM=<>;GENERAL=<>\\r\\n // Watch-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\r\\n //\\r\\n // Author: Juanmi Navarro\\r\\n // Created: 01/01/0000\\r\\n // Last modified: 20/05/2025\\r\\n //\\r\\n ///////////////////////////////////////////////////////////////////////////////\\r\\n if (typeof localTesting === \\\"undefined\\\") {\\r\\n let localTesting = \\\"False\\\";\\r\\n }\\r\\n const crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,\\r\\n 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,\\r\\n 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,\\r\\n 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,\\r\\n 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,\\r\\n 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,\\r\\n 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,\\r\\n 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,\\r\\n 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,\\r\\n 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,\\r\\n 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,\\r\\n 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,\\r\\n 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,\\r\\n 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,\\r\\n 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,\\r\\n 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,\\r\\n 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,\\r\\n 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,\\r\\n 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,\\r\\n 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,\\r\\n 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,\\r\\n 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n ];\\r\\n var codeValues = [];\\r\\n AddValue(codeValues, 'protocol_template', 'Watch');\\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 = (`Watch-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 //<>,<>,<> \\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 //<>,<>,<> \\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 Watch-')) {\\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 = (`Watch-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 = (`Watch;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 = (`Watch;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 = (`Watch-RTL;${params.imei};${location_time};${location_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n break;\\r\\n }\\r\\n if (!params.event_time && !event_time) { // if params.event_time undefined - set it to now. \\r\\n var event_time = moment.utc().unix();\\r\\n AddValue(codeValues, 'event_time', event_time);\\r\\n }\\r\\n // if (!params.location_time && !location_time) { // if params.location_time undefined - set it to now. \\r\\n // var location_time = moment.utc().unix();\\r\\n // AddValue(codeValues, 'location_time', location_time);\\r\\n //}\\r\\n }\\r\\n // send data msg to kibana\\r\\n const data = buildDataToReceiver(codeValues, configsToAck, configsToUpdate, configsToSend);\\r\\n console.log(data);\\r\\n return data\\r\\n // end of main operation\\r\\n // define functions used in operation\\r\\n // decode global msg\\r\\n function decoder(str) { // decode rawdata\\r\\n // CARE Decoder\\r\\n AddValue(codeValues, 'Message : ', str);\\r\\n var message = str;\\r\\n // need to check if checksum is correct for possible msg corruption 10/03/23\\r\\n var checksum = message.substring(8, 12);\\r\\n var messageBody = message.substring(16, message.length);\\r\\n debug('message =' + message);\\r\\n debug('checksum =' + checksum);\\r\\n debug('calculateCheckSum =' + calculateCheckSum(messageBody));\\r\\n if (calculateCheckSum(messageBody) == checksum) { // payload is valid\\r\\n debug(\\\"message has valid checksum\\\");\\r\\n var messageBody = command; // update value for the ACK\\r\\n debug('command =' + command);\\r\\n if (command == '01') {\\r\\n while (index < total_length + 16) {\\r\\n var keyLengthHex = message.substring(index, index = index + 2);\\r\\n var keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n var key = message.substring(index, index = index + 2);\\r\\n var value = message.substring(index, index = index + keyLength - 2);\\r\\n debug('key = ' + key);\\r\\n debug('value = ' + value);\\r\\n switch (key) {\\r\\n //Device ID\\r\\n case '01':\\r\\n var imei = hexToAscii(value);\\r\\n // create long connection if it is needed\\r\\n if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n //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\\r\\n if ((alarmCodeExtInt & 1) == 1) {\\r\\n var alarm = 'ALF-C';\\r\\n }\\r\\n // Welfare Check-out\\r\\n else if ((alarmCodeExtInt & 2) == 2) {\\r\\n var alarm = 'ALA-C';\\r\\n }\\r\\n // Standard Alerts\\r\\n //Battery low\\r\\n else if ((alarmCodeInt & 1) == 1) {\\r\\n var alarm = 'BATL';\\r\\n }\\r\\n //Overspeed\\r\\n else if ((alarmCodeInt & 2) == 2) {\\r\\n var alarm = 'ALSP';\\r\\n }\\r\\n //Fall\\r\\n else if ((alarmCodeInt & 4) == 4) {\\r\\n var alarm = 'ALF';\\r\\n }\\r\\n //Tilt\\r\\n else if ((alarmCodeInt & 8) == 8) {\\r\\n var alarm = 'Tilt';\\r\\n } else if ((alarmCodeInt & 16) == 16) {\\r\\n if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n var alarm = 'Geo1-IN';\\r\\n } else {\\r\\n var alarm = 'Geo1-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 32) == 32) {\\r\\n if ((alarmCodeInt & 33554432) == 33554432) {\\r\\n var alarm = 'Geo2-IN';\\r\\n } else {\\r\\n var alarm = 'Geo2-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 64) == 64) {\\r\\n if ((alarmCodeInt & 67108864) == 67108864) {\\r\\n var alarm = 'Geo3-IN';\\r\\n } else {\\r\\n var alarm = 'Geo3-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 128) == 128) {\\r\\n if ((alarmCodeInt & 134217728) == 134217728) {\\r\\n var alarm = 'Geo4-IN';\\r\\n } else {\\r\\n var alarm = 'Geo4-OUT';\\r\\n }\\r\\n }\\r\\n //Power Off\\r\\n else if ((alarmCodeInt & 256) == 256) {\\r\\n var alarm = 'PWRF';\\r\\n }\\r\\n //Power On\\r\\n else if ((alarmCodeInt & 512) == 512) {\\r\\n var alarm = 'PWRN';\\r\\n }\\r\\n //Motion\\r\\n else if ((alarmCodeInt & 1024) == 1024) {\\r\\n var alarm = 'ALMOV';\\r\\n }\\r\\n //No Motion\\r\\n else if ((alarmCodeInt & 2048) == 2048) {\\r\\n var alarm = 'ALNM';\\r\\n }\\r\\n //SOS\\r\\n else if ((alarmCodeInt & 4096) == 4096) {\\r\\n var alarm = 'ALSOS';\\r\\n } else if ((alarmCodeInt & 8192) == 8192) {\\r\\n var alarm = 'Side1';\\r\\n } else if ((alarmCodeInt & 16384) == 16384) {\\r\\n var alarm = 'Side2';\\r\\n }\\r\\n //Battery charging\\r\\n else if ((alarmCodeInt & 32768) == 32768) {\\r\\n var alarm = 'BATCN';\\r\\n }\\r\\n //Battery no charging\\r\\n else if ((alarmCodeInt & 65536) == 65536) {\\r\\n var alarm = 'BATCF';\\r\\n }\\r\\n //SOS Ending\\r\\n // Temporary Commented until we know exactly how it works. 22/09/2022\\r\\n else if ((alarmCodeInt & 131072) == 131072) {\\r\\n var alarm = 'SOSEnding';\\r\\n info = 'Alarm Finished';\\r\\n }\\r\\n //Amber Alert EC03 only\\r\\n else if ((alarmCodeInt & 262144) == 262144) {\\r\\n var alarm = 'ALAO';\\r\\n }\\r\\n // welfare Alert check-in ALA-O\\r\\n else if ((alarmCodeInt & 524288) == 524288) {\\r\\n var alarm = 'ALA-O';\\r\\n }\\r\\n // Amber alert Ending ALA-C\\r\\n else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n var alarm = 'ALA-C';\\r\\n }\\r\\n // Amber alert Ending ALA-C\\r\\n //else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n // var alarm = 'ALA-C';\\r\\n //}\\r\\n // Fall-Down Alert ending\\r\\n else if ((alarmCodeInt & 2097152) == 2097152) {\\r\\n var alarm = 'ALF-C';\\r\\n }\\r\\n // welfare Alert Ending ALA\\r\\n else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n var alarm = 'ALA';\\r\\n }\\r\\n // Beacon absent Alert 11/10/22. Need to be added in msg types\\r\\n //else if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n // var alarm = 'BEA';\\r\\n //}\\r\\n general += 'alarm:' + alarm + ',';\\r\\n break;\\r\\n //Custom ID\\r\\n case '03':\\r\\n customID = value;\\r\\n var allowedCID = ['3036', '06'];\\r\\n if (!allowedCID.includes(value)) {\\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 //<>,<>,<>,<>,<>\\r\\n gps_data = `${latitude},${longitude},${location_accuracy},${speed},${direction},${altitude},${satellites},${mileage}`;\\r\\n general += 'gps location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n break;\\r\\n //WIFI Towers\\r\\n case '22':\\r\\n location_type = 'WIFI';\\r\\n var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\r\\n //location_time = timestamp;\\r\\n var wifiTowers = value;\\r\\n general += 'wifiTowers:';\\r\\n var indexWifi = 0;\\r\\n var bssid_array = [];\\r\\n wifi_data = '';\\r\\n for (let i = 0; i < numWifi; i++) {\\r\\n wifi_data += hexToDecimalSigned(wifiTowers.substring(indexWifi, indexWifi + 2)) + ',' + wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\r\\n indexWifi += 14;\\r\\n }\\r\\n wifi_data = wifi_data.slice(0, -1);\\r\\n general += wifi_data;\\r\\n break;\\r\\n //BLE Location Added 10/10/22\\r\\n case '23':\\r\\n location_type = 'BLE';\\r\\n var mac = value.substring(0, 12);\\r\\n var latitudeHex = value.substring(12, 20);\\r\\n var longitudeHex = value.substring(20, 28);\\r\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n var address = hexToAscii(value.substring(28, value.length));\\r\\n var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n // add : format in MAC\\r\\n mac = mac.match(/.{1,2}/g).join(':');\\r\\n // location_time = timestamp;\\r\\n ble_data = `${latitude},${longitude},${mac},${address}`;\\r\\n general += 'BLE location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n break;\\r\\n //General Data , status_data\\r\\n case '24':\\r\\n //const allowedCID = ['3036', '06'];\\r\\n if (!allowedCID.includes(customID)) {\\r\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n AddValue(codeValues, \\\"customID\\\", customID);\\r\\n return\\r\\n }\\r\\n if (alarmCode) {\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n }\\r\\n //else {\\r\\n // messageForReceiver = (`CareWatch-CYC;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};`);\\r\\n //}\\r\\n // reset variables\\r\\n //alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n var timestampHex = value.substring(0, 8);\\r\\n timestampHex = changeEndianness(timestampHex);\\r\\n timestamp = hexToDecimal(timestampHex);\\r\\n location_time = timestamp;\\r\\n event_time = timestamp;\\r\\n // HardCode to fix possible issue in protocol\\r\\n //event_time = moment.utc().unix();\\r\\n // end of hard code\\r\\n var statusHex = changeEndianness(value.substring(8, 16));\\r\\n var statusInt = hexToDecimal(statusHex);\\r\\n var statusDevice = '';\\r\\n if ((statusInt & 1) == 1) {\\r\\n statusDevice += 'GPS,';\\r\\n }\\r\\n if ((statusInt & 2) == 2) {\\r\\n statusDevice += 'WIFISource,';\\r\\n }\\r\\n if ((statusInt & 4) == 4) {\\r\\n statusDevice += 'CellTower,';\\r\\n }\\r\\n if ((statusInt & 8) == 8) {\\r\\n statusDevice += 'BLELocation,';\\r\\n }\\r\\n //params.BatteryStatus.BatteryStatus = '1';\\r\\n if ((statusInt & 16) == 16) {\\r\\n statusDevice += 'Charging,';\\r\\n // var alarm = 'BATCN';\\r\\n //configs.BatteryStatus.BatteryStatus = '1';\\r\\n /* if (configs.BatteryStatus.BatteryStatus !== '1') {\\r\\n hasConfigs = true;\\r\\n var batteryStatus = '1';\\r\\n var alarm = 'BATCN';\\r\\n let configsToUpdate = [];\\r\\n configsToUpdate.push({\\r\\n 'code': configIds.BatteryStatus.BatteryStatus,\\r\\n 'value': batteryStatus\\r\\n });\\r\\n }*/\\r\\n }\\r\\n if ((statusInt & 32) == 32) {\\r\\n statusDevice += 'FUllyCharged,';\\r\\n //var alarm = 'BATF';\\r\\n // configs.BatteryStatus.BatteryStatus = '3';\\r\\n /* if (configs.BatteryStatus.BatteryStatus !== '3') {\\r\\n hasConfigs = true;\\r\\n var batteryStatus = '3';\\r\\n var alarm = 'BATF';\\r\\n let configsToUpdate = [];\\r\\n configsToUpdate.push({\\r\\n 'code': configIds.BatteryStatus.BatteryStatus,\\r\\n 'value': batteryStatus\\r\\n });\\r\\n }*/\\r\\n }\\r\\n /* if (!((statusInt & 32) == 32) & !((statusInt & 16) == 16)) {\\r\\n statusDevice += 'Not Charging,';\\r\\n var alarm = 'BATCF';\\r\\n //configs.BatteryStatus.BatteryStatus = '2';\\r\\n if (configs.BatteryStatus.BatteryStatus !== '2') {\\r\\n var batteryStatus = '2';\\r\\n var alarm = 'BATCF';\\r\\n let configsToUpdate = [];\\r\\n configsToUpdate.push({\\r\\n 'code': configIds.BatteryStatus.BatteryStatus,\\r\\n 'value': batteryStatus\\r\\n });\\r\\n }\\r\\n }*/\\r\\n if ((statusInt & 64) == 64) {\\r\\n statusDevice += 'Reboot,';\\r\\n }\\r\\n if ((statusInt & 128) == 128) {\\r\\n statusDevice += 'HistoricalData,';\\r\\n }\\r\\n if ((statusInt & 256) == 256) {\\r\\n statusDevice += 'AGPSDataValid,';\\r\\n }\\r\\n if ((statusInt & 512) == 512) {\\r\\n statusDevice += 'Motion,';\\r\\n }\\r\\n if ((statusInt & 1024) == 1024) {\\r\\n statusDevice += 'SmartLocating,';\\r\\n }\\r\\n if ((statusInt & 2048) == 2048) { //isHome\\r\\n statusDevice += 'BeaconLocation,';\\r\\n }\\r\\n if ((statusInt & 4096) == 4096) {\\r\\n statusDevice += 'BLEConnected,';\\r\\n }\\r\\n if ((statusInt & 16384) == 16384) {\\r\\n statusDevice += 'HomeWiFi,';\\r\\n }\\r\\n statusDevice = statusDevice.slice(0, -1);\\r\\n status_data = statusDevice; //to oysta template\\r\\n //statusHex = (statusHex);\\r\\n statusHex = hexToBin(statusHex);\\r\\n statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\r\\n battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\r\\n cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\r\\n workMode = parseInt(statusHex.substring(13, 16), 2);\\r\\n general += 'statusDevice:' + statusDevice + ',';\\r\\n if (battery_percentage) {\\r\\n general += 'battery:' + battery_percentage + ',';\\r\\n }\\r\\n if (cellNetworkSignal) {\\r\\n general += 'cellNetworkSignal:' + cellNetworkSignal + ',';\\r\\n }\\r\\n if (workMode) {\\r\\n general += 'workMode:' + workMode + ',';\\r\\n }\\r\\n //messageForReceiver = (`CareWatch-CYC;${imei};${i};${event_time};${battery_percentage}`);\\r\\n break;\\r\\n //Call Records\\r\\n case '25':\\r\\n //Needed?\\r\\n break;\\r\\n //BLE Location 2\\r\\n case '26':\\r\\n //I don't understand\\r\\n //messageBody = messageBody + keyLengthHex + key + value;\\r\\n break;\\r\\n //Smart Location\\r\\n case '27':\\r\\n location_type = 'SMART';\\r\\n var latitudeHex = value.substring(0, 8);\\r\\n var longitudeHex = value.substring(8, 16);\\r\\n var location_accuracyHex = value.substring(16, 20);\\r\\n var altitudeHex = value.substring(20, 24);\\r\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n var altitude = hexToDecimal(changeEndianness(altitudeHex));\\r\\n //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\r\\n //04/08/2022 se quita el multiplicador por 5 pq ya viene el valor en metros\\r\\n location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\r\\n //location_time = timestamp;\\r\\n smart_data = `${latitude},${longitude},${location_accuracy},${altitude}`;\\r\\n general += 'smart location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n break;\\r\\n //Beacon Location Added 11/10/22\\r\\n case '28':\\r\\n location_type = 'BEACON';\\r\\n // var alarm = 'EBZI';\\r\\n var latitudeHex = '00';\\r\\n var longitudeHex = '00';\\r\\n var descr = 'empty';\\r\\n var flag = hexToDecimal(value.substring(0, 1));\\r\\n var beacId = hexToDecimal(value.substring(1, 2));\\r\\n // msg includes descrip\\r\\n if ((flag & 4) == 4) {\\r\\n descr = hexToAscii(value.substring(18, value.length));\\r\\n }\\r\\n // msg includes lat/lon\\r\\n if ((flag & 8) == 8) {\\r\\n latitudeHex = value.substring(18, 26);\\r\\n longitudeHex = value.substring(26, 34);\\r\\n }\\r\\n // msg includes lat/lon and description\\r\\n if ((flag & 12) == 12) {\\r\\n latitudeHex = value.substring(18, 26);\\r\\n longitudeHex = value.substring(26, 34);\\r\\n descr = hexToAscii(value.substring(34, value.length));\\r\\n }\\r\\n var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n // add : format in MAC\\r\\n mac = mac.match(/.{1,2}/g).join(':');\\r\\n var rssiHex = value.substring(14, 16);\\r\\n var rssi1Hex = value.substring(16, 18);\\r\\n rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\r\\n rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\r\\n // var latitudeHex = value.substring(18, 26);\\r\\n // var longitudeHex = value.substring(26, 34);\\r\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n //location_time = timestamp;\\r\\n beacon_data = `${latitude},${longitude},${mac},${descr}`;\\r\\n general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (listIndex):' + beacId + ',';\\r\\n break;\\r\\n // Beacon V2\\r\\n case '2C':\\r\\n location_type = 'BEACON';\\r\\n // var alarm = 'EBZI';\\r\\n var latitudeHex = '00';\\r\\n var longitudeHex = '00';\\r\\n var descr = 'empty';\\r\\n var flag = hexToDecimal(value.substring(0, 1));\\r\\n var beacId = hexToDecimal(value.substring(1, 2));\\r\\n // msg includes descrip\\r\\n if ((flag & 4) == 4) {\\r\\n let desc_leng = hexToDecimal(value.substring(20, 22));\\r\\n descr = hexToAscii(value.substring(22, 22 + (2 * desc_leng)));\\r\\n //descr = hexToAscii(value.substring(18, value.length));\\r\\n }\\r\\n // msg includes lat/lon\\r\\n if ((flag & 8) == 8) {\\r\\n latitudeHex = value.substring(18, 26);\\r\\n longitudeHex = value.substring(26, 34);\\r\\n }\\r\\n // msg includes lat/lon and description\\r\\n if ((flag & 12) == 12) {\\r\\n latitudeHex = value.substring(20, 28);\\r\\n longitudeHex = value.substring(28, 36);\\r\\n let desc_leng = hexToDecimal(value.substring(36, 38));\\r\\n descr = hexToAscii(value.substring(38, 38 + (2 * desc_leng)));\\r\\n }\\r\\n var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n // add : format in MAC\\r\\n mac = mac.match(/.{1,2}/g).join(':');\\r\\n var rssiHex = value.substring(14, 16);\\r\\n var rssi1Hex = value.substring(16, 18);\\r\\n rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\r\\n rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\r\\n var battery_beacon = hexToDecimal(value.substring(18, 20));\\r\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n //location_time = timestamp;\\r\\n beacon_data = `${latitude},${longitude},${mac},${descr}`;\\r\\n general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (battery):' + battery_beacon + ', (listIndex):' + beacId + ',';\\r\\n break;\\r\\n //Cell Towers Note\\r\\n case '29':\\r\\n location_type = 'LBS';\\r\\n lbs_data = '';\\r\\n var mccHex = changeEndianness(value.substring(0, 4));\\r\\n var mncHex = value.substring(4, 6);\\r\\n var mcc = hexToDecimal(mccHex);\\r\\n lbs_data += mcc + ',';\\r\\n var mnc = hexToDecimal(mncHex);\\r\\n lbs_data += mnc + ',';\\r\\n var indexLbs = 6;\\r\\n var numTowers = (hexToDecimal(keyLengthHex) - 4) / 7;\\r\\n for (let i = 0; i < numTowers; i++) {\\r\\n var rxlHex = changeEndianness(value.substring(indexLbs, indexLbs + 2));\\r\\n var rxl = hexToDecimal(rxlHex);\\r\\n var lacHex = changeEndianness(value.substring(indexLbs + 2, indexLbs + 6));\\r\\n var lac = hexToDecimal(lacHex);\\r\\n var cellTowers = hexToDecimal(changeEndianness(value.substring(indexLbs + 6, indexLbs + 14)));\\r\\n lbs_data += rxl + ',' + lac + ',' + cellTowers + ',';\\r\\n indexLbs += 14;\\r\\n }\\r\\n lbs_data = lbs_data.slice(0, -1);\\r\\n general += lbs_data;\\r\\n break;\\r\\n case '30':\\r\\n //G-sensor.\\r\\n 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 = (`Watch-${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 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 = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n }\\r\\n break;\\r\\n //BLE Connected . For Flic button\\r\\n case '62':\\r\\n location_type = 'BLE';\\r\\n //var alarm = 'EBZI'; \\r\\n //var latitudeHex = '00';\\r\\n //var longitudeHex = '00';\\r\\n //var descr = 'empty';\\r\\n var flag = hexToDecimal(value.substring(0, 2)); // 0= Disconnected, 1= Connected\\r\\n var mac = value.substring(2, 14); // No hace falta darle la vuelta\\r\\n // add : format in MAC\\r\\n mac = mac.match(/.{1,2}/g).join(':');\\r\\n var batLevel = hexToDecimal(value.substring(14, 16)); // 0-100\\r\\n //location_time = timestamp;\\r\\n ble_data = `${flag},${batLevel},${mac}`;\\r\\n general += 'BLE location (State):' + flag + ', (bat):' + batLevel + ', (mac):' + mac + ',';\\r\\n break;\\r\\n }\\r\\n }\\r\\n if (alarmCode) {\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch;ACK-FIRM;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\r\\n //AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\r\\n configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\r\\n //configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\r\\n //messageBody = messageBody + keyLengthHex + key + value;\\r\\n break;\\r\\n case '1A':\\r\\n //no ACK need\\r\\n var fwVersion = hexToAscii(value);\\r\\n imei = serverParams.Imei;\\r\\n AddValue(codeValues, \\\"imei\\\", imei);\\r\\n AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\r\\n messageForReceiver = (`Watch;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 = (`Watch;ACK-VOL;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"Volume\\\", volume);\\r\\n AddValue(configsToUpdate, configIds.ReadSystemSettings.Volume, volume);\\r\\n configsToAck.push(configIds.ReadSystemSettings.Volume);\\r\\n break;\\r\\n case '0A': //Performance mode\\r\\n //var workMode = hexToDecimal(value);\\r\\n //messageBody = messageBody + keyLengthHex + key + value;\\r\\n //AddValue(codeValues, \\\"WorkMode\\\", workMode);\\r\\n //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\r\\n //configsToAck.push(configIds.ReadPerformance`Settings.Mode);\\r\\n //var workMode = hexToAscii(value.substring(0, value.length));\\r\\n //var workMode = hexToDecimal(value);\\r\\n //var workMode = hexToAscii(value.substring(0, value.length));\\r\\n var workMode = 1234; // + value + \\\"end\\\";\\r\\n //var workModeVal = 9;\\r\\n //workMode = 'test10';\\r\\n imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;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 '0F': // Enable control.... Used for STEP COUNTING SETTINGS\\r\\n // 'FF FF 21 80'\\r\\n var StepStatus = hexToBin(value.substring(4, 6));\\r\\n var enalbleDisable = '';\\r\\n if (StepStatus.substring(7, 8) == '1') {\\r\\n var step = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var step = 'Disable, '\\r\\n };\\r\\n //var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n //hrate += detectingInterval;\\r\\n AddValue(codeValues, \\\"step\\\", step);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadStepsSettings.EnableDisableReadStepsSettings, enalbleDisable);\\r\\n //AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadStepsSettings.EnableDisableReadStepsSettings);\\r\\n //configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\r\\n break;\\r\\n case '1B':\\r\\n //Decimal o ascii?\\r\\n var gsmModule = hexToDecimal(value);\\r\\n messageBody = messageBody + keyLengthHex + key + value;\\r\\n break;\\r\\n case '1F':\\r\\n //System Language\\r\\n var systemLanguage = hexToAscii(value.substring(0, value.length));\\r\\n imei = serverParams.Imei;\\r\\n //messageBody = messageBody + keyLengthHex + key + value;\\r\\n messageForReceiver = (`Watch;ACK-LANG;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"SystemLanguage\\\", systemLanguage);\\r\\n AddValue(configsToUpdate, configIds.ReadSystemSettings.SystemLanguage, systemLanguage);\\r\\n configsToAck.push(configIds.ReadSystemSettings.SystemLanguage);\\r\\n break;\\r\\n case '33': // phone option\\r\\n // [Value]:83 0B 00 00 {\\\"phoneOption\\\":{\\\"flag_value\\\":2947,\\\"s3\\\":1,\\\"s4\\\":0,\\\"s5\\\":1,\\\"s6\\\":0,\\\"callIncoming\\\":0,\\\"rings\\\":3,\\\"s7\\\":0,\\\"toneID\\\":0,\\\"s1\\\":1,\\\"s2\\\":1}}\\r\\n var statusPhone = hexToBin(value.substring(0, 2)); // To find autoanswer setup\\r\\n if (statusPhone.substring(0, 1) == '1') { // 1 Enable\\r\\n var auto = 'true';\\r\\n } else var auto = 'false';\\r\\n statusPhone = hexToBin(value.substring(2, 4)); // To find allow list setup\\r\\n if (statusPhone.substring(7, 8) == '1') { // 1 Enable\\r\\n allow = 'true';\\r\\n } else var allow = 'false';\\r\\n //statusPhone = hexToBin(value.substring(0, 2)) + hexToBin(value.substring(2, 4));\\r\\n //AddValue(configsToUpdate, configIds.ReadSystemSettings.Statusphone, statusPhone);\\r\\n AddValue(configsToUpdate, configIds.ReadSystemSettings.AllowList, allow);\\r\\n AddValue(configsToUpdate, configIds.ReadSystemSettings.AutoAnswer, auto);\\r\\n //configsToAck.push(configIds.ReadSystemSettings.Statusphone);\\r\\n configsToAck.push(configIds.ReadSystemSettings.AllowList);\\r\\n configsToAck.push(configIds.ReadSystemSettings.AutoAnswer);\\r\\n break;\\r\\n case '34': //ContactList with name\\r\\n var contactNumber = value.substring(1, 2);\\r\\n var telLength = hexToDecimal(value.substring(2, 4));\\r\\n var tel = '';\\r\\n switch (contactNumber) {\\r\\n // Emergency Number\\r\\n case '0':\\r\\n tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\r\\n AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n break;\\r\\n // Speed Dial Number\\r\\n //case '1':\\r\\n // tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\r\\n // AddValue(codeValues, \\\"SpeedDialNumber\\\", tel);\\r\\n // AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.SpeedDialNumber, tel);\\r\\n // configsToAck.push(configIds.ReadSpeedDialSettings.SpeedDialNumber);\\r\\n // break;\\r\\n // Gateway Number\\r\\n case '9': //00447781482635,Esendex UK 0034627177148,Esendex Spain 00447507288240,Esendex UK Acceptance\\r\\n tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\r\\n if (tel.includes('447781482635') || tel.includes('00447781482635')) {\\r\\n tel = 'Esendex UK'\\r\\n } else if (tel.includes('34627177148') || tel.includes('0034627177148')) {\\r\\n tel = 'Esendex Spain'\\r\\n } else if (tel.includes('447507288240') || tel.includes('00447507288240')) {\\r\\n tel = 'Esendex UK Acceptance'\\r\\n } else {\\r\\n tel = 'Default'\\r\\n }\\r\\n AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n break;\\r\\n default:\\r\\n tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\r\\n if (tel.length < 6) {\\r\\n contacts += '';\\r\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n break;\\r\\n }\\r\\n //contacts += 'A' + (contactNumber - 1) + ': ' + tel + ', ';\\r\\n contacts += tel + ', ';\\r\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n break;\\r\\n }\\r\\n break;\\r\\n case '40': // APN\\r\\n //no ACK need\\r\\n AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'));\\r\\n configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\r\\n var apn = hexToAscii(value.substring(0, value.length));\\r\\n imei = serverParams.Imei;\\r\\n break;\\r\\n case '41': // APN Username\\r\\n //no ACK need\\r\\n //apn = apn + ',' + hexToAscii(value.substring(0, value.length));\\r\\n break;\\r\\n case '42': // APN Password\\r\\n //no ACK need\\r\\n //apn = apn + ',' + hexToAscii(value.substring(0, value.length));\\r\\n messageForReceiver = (`Watch;ACK-GDATA;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"apn\\\", apn);\\r\\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.APN, apn);\\r\\n configsToAck.push(configIds.ReadCommunicationSettings.APN);\\r\\n break;\\r\\n case '43': //Server Details\\r\\n //52.232.85.255,5678 production 52.174.17.77,5678 acceptance\\r\\n var serverDetails = hexToAscii(value.substring(6, value.length)) + ':' + hexToDecimal(value.substring(4, 6) + value.substring(2, 4));\\r\\n if (serverDetails.includes('52.232.85.255:5678')) {\\r\\n serverDetails = 'Production'\\r\\n } else if (serverDetails.includes('52.174.17.77:5678')) {\\r\\n serverDetails = 'Acceptance'\\r\\n } else if (serverDetails.includes('52.174.17.77:5778')) {\\r\\n serverDetails = 'Protocol-Import'\\r\\n } else if (serverDetails.includes('52.174.17.77:5878')) {\\r\\n serverDetails = 'Protocol-Dev'\\r\\n } else {\\r\\n serverDetails = 'Default'\\r\\n }\\r\\n AddValue(codeValues, \\\"server\\\", serverDetails);\\r\\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.Server, serverDetails);\\r\\n configsToAck.push(configIds.ReadCommunicationSettings.Server);\\r\\n break;\\r\\n case '44': //time interval - work mode intervals\\r\\n imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;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 '46': //HeartRate\\r\\n // '10 0E 00 80'\\r\\n var HeartRateStatus = hexToBin(value.substring(6, 8));\\r\\n var enalbleDisable = '';\\r\\n if (HeartRateStatus.substring(0, 1) == '1') {\\r\\n var hrate = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var hrate = 'Disable, '\\r\\n };\\r\\n var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n hrate += detectingInterval;\\r\\n AddValue(codeValues, \\\"hrate\\\", hrate);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings);\\r\\n configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\r\\n break;\\r\\n case '47': // Custom Id\\r\\n imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;ACK-CUSTID;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"customeid\\\", value);\\r\\n AddValue(configsToUpdate, configIds.ReadState.CustomId, hexToAscii(value)); //now it comes \\\"3036\\\"\\r\\n configsToAck.push(configIds.ReadState.CustomId);\\r\\n break;\\r\\n case '53': // Non motion alert\\r\\n //2B020080\\r\\n var status = hexToBin(value.substring(6, 8));\\r\\n var alertSetting = '';\\r\\n var enableDisable = '';\\r\\n if (status.substring(0, 1) == '1') {\\r\\n alertSetting = 'Enable, '\\r\\n enableDisable = '1';\\r\\n } else {\\r\\n alertSetting = 'Disable, '\\r\\n };\\r\\n //if (status.substring(5, 6) == '1') {\\r\\n // alertSetting += 'Dial, '\\r\\n //} else {\\r\\n // alertSetting += 'No Dial, '\\r\\n //};\\r\\n var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\r\\n alertSetting += time;\\r\\n imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;ACK-NOMOTION;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"nomotion\\\", alertSetting);\\r\\n //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings, enableDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n configsToAck.push(configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings);\\r\\n configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n break;\\r\\n case '56': //Fall down sensibility\\r\\n // '00001100'\\r\\n var fallStatus = hexToBin(value.substring(0, 2));\\r\\n var enalbleDisable = '';\\r\\n //if (fallStatus.substring(4, 5) == '1') {\\r\\n if (fallStatus.substring(0, 1) == '1') {\\r\\n var sensibility = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var sensibility = 'Disable, '\\r\\n };\\r\\n if (fallStatus.substring(5, 6) == '1') {\\r\\n sensibility += 'Dial, '\\r\\n } else {\\r\\n sensibility += 'No Dial, '\\r\\n };\\r\\n var imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;ACK-FALLALERT;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n var sesibityOptionValue = hexToDecimal(value.substring(1, 2));\\r\\n sensibility += sesibityOptionValue;\\r\\n AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n //AddValue(configsToUpdate, configIds.ReadAlertSettings.FallSettings, sensibility);\\r\\n AddValue(configsToUpdate, configIds.ReadFallSettings.EnableDisableFallSettings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadFallSettings.Sensitivity, sesibityOptionValue);\\r\\n //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n configsToAck.push(configIds.ReadFallSettings.EnableDisableFallSettings);\\r\\n configsToAck.push(configIds.ReadFallSettings.Sensitivity);\\r\\n break;\\r\\n case '73': //BeaconList\\r\\n var beaconNumber = hexToDecimal(value.substring(1, 2));\\r\\n var beaconStatus = hexToBin(value.substring(0, 1));\\r\\n beaconStatus = hexToAscii(value.substring(30, value.length));\\r\\n //beaconStatus = changeEndianness(value.substring(30, value.length));\\r\\n //homeBeacon += 'B' + (beaconNumber + 1) + ': ' + beaconStatus + ', ';\\r\\n homeBeacon += beaconStatus + ', ';\\r\\n AddValue(codeValues, \\\"homeBeacon\\\", homeBeacon);\\r\\n messageForReceiver = (`Watch;ACK-GDATA;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n break;\\r\\n case '4A': //Wifi Network List\\r\\n var wifiSSIDLenght = hexToDecimal(value.substring(2, 4));\\r\\n var wifiPasswordLenght = hexToDecimal(value.substring(4, 6));\\r\\n var wifiIndex = hexToDecimal(value.substring(1, 2));\\r\\n //var wifiStatus = hexToDecimal(value.substring(0, 1));\\r\\n var wifiStatus = value.substring(0, 1);\\r\\n /*var enalbleDisable = wifiSSID = wifiPassword = homeWifi = '';\\r\\n /var homeWifi = '';\\r\\n if (wifiIndex == '0') { // Only first Wifi of the list\\r\\n if (wifiStatus == '8') {\\r\\n homeWifi += ' Enable, '\\r\\n enalbleDisable = '1';\\r\\n } else {\\r\\n homeWifi += ' Disable, '\\r\\n //enalbleDisable = '0';\\r\\n };*/\\r\\n if ((wifiStatus == '8') || (wifiStatus == 'C')) { // 8 == ON OR C== ON and Connected\\r\\n var wifiSSID = hexToAscii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\r\\n var wifiPassword = hexToAscii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\r\\n var imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;ACK-WIFI;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n //homeWiFi += 'W' + (wifiIndex + 1) + ': ' + wifiSSID + ', ' + wifiPassword + ';';\\r\\n homeWiFi += wifiSSID + ', ' + wifiPassword + ';';\\r\\n AddValue(codeValues, \\\"wifi\\\", homeWiFi);\\r\\n AddValue(configsToUpdate, configIds.ReadWiFiList.WiFiList, homeWiFi);\\r\\n configsToAck.push(configIds.ReadWiFiList.WiFiList);\\r\\n }\\r\\n //AddValue(configsToUpdate, configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings, enalbleDisable);\\r\\n //AddValue(configsToUpdate, configIds.ReadWiFiSettings.SSID, wifiSSID);\\r\\n //AddValue(configsToUpdate, configIds.ReadWiFiSettings.Password, wifiPassword);\\r\\n //configsToAck.push(configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings);\\r\\n //configsToAck.push(configIds.ReadWiFiSettings.SSID);\\r\\n //configsToAck.push(configIds.ReadWiFiSettings.Password);\\r\\n break;\\r\\n case '21': // Speed Dial Settings\\r\\n // [Value]:53 84 {\\\"call1Button\\\":{\\\"mode\\\":0,\\\"feedBack\\\":3,\\\"task\\\":2,\\\"time\\\":20,\\\"status\\\":1}}\\r\\n var status = hexToBin(value.substring(2, 4)); //always pass 2 HEXs to this function\\r\\n var alertSetting = '';\\r\\n var enalbleDisable = '';\\r\\n if (status.substring(0, 1) == '1') {\\r\\n alertSetting = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n alertSetting = 'Disable, '\\r\\n //enableDisable = '0';\\r\\n };\\r\\n //var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\r\\n //alertSetting += time;\\r\\n imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;ACK-SPEED;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"speed\\\", alertSetting);\\r\\n //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\r\\n //AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n //configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n break;\\r\\n }\\r\\n }\\r\\n }\\r\\n if (command == '03') {\\r\\n while (index < total_length + 16) {\\r\\n var keyLengthHex = message.substring(index, index = index + 2);\\r\\n var keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n var key = message.substring(index, index = index + 2);\\r\\n var value = message.substring(index, index = index + keyLength - 2);\\r\\n debug('key = ' + key);\\r\\n debug('value = ' + value);\\r\\n switch (key) {\\r\\n case '01': // Device ID\\r\\n var imei = hexToAscii(value);\\r\\n // create long connection if it is needed\\r\\n if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n //return;\\r\\n }\\r\\n break;\\r\\n case '10': // Heartbeat\\r\\n var heartbeat = hexToAscii(value);\\r\\n event_time = moment.utc().unix();\\r\\n if (index < total_length + 16) {\\r\\n var keyLengthHex = message.substring(index, index = index + 2);\\r\\n keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n key = message.substring(index, index = index + 2);\\r\\n if (key == '24') {\\r\\n // debug('key: ' + key) //comment those out\\r\\n value = message.substring(index, index = index + keyLength - 2);\\r\\n // debug(value)\\r\\n var timestampHex = value.substring(0, 8);\\r\\n // debug('timestampt hex: ' + timestampHex)\\r\\n timestampHex = changeEndianness(timestampHex);\\r\\n timestamp = hexToDecimal(timestampHex);\\r\\n event_time = timestamp;\\r\\n // debug(event_time)\\r\\n var statusHex = changeEndianness(value.substring(8, 16));\\r\\n // debug(statusHex)\\r\\n var statusInt = hexToDecimal(statusHex);\\r\\n var statusDevice = '';\\r\\n if ((statusInt & 1) == 1) {\\r\\n statusDevice += 'GPS,';\\r\\n }\\r\\n if ((statusInt & 2) == 2) {\\r\\n statusDevice += 'WIFISource,';\\r\\n }\\r\\n if ((statusInt & 4) == 4) {\\r\\n statusDevice += 'CellTower,';\\r\\n }\\r\\n if ((statusInt & 8) == 8) {\\r\\n statusDevice += 'BLELocation,';\\r\\n }\\r\\n if ((statusInt & 16) == 16) {\\r\\n statusDevice += 'Charging,';\\r\\n }\\r\\n if ((statusInt & 32) == 32) {\\r\\n statusDevice += 'FUllyCharged,';\\r\\n }\\r\\n if ((statusInt & 64) == 64) {\\r\\n statusDevice += 'Reboot,';\\r\\n }\\r\\n if ((statusInt & 128) == 128) {\\r\\n statusDevice += 'HistoricalData,';\\r\\n }\\r\\n if ((statusInt & 256) == 256) {\\r\\n statusDevice += 'AGPSDataValid,';\\r\\n }\\r\\n if ((statusInt & 512) == 512) {\\r\\n statusDevice += 'Motion,';\\r\\n }\\r\\n if ((statusInt & 1024) == 1024) {\\r\\n statusDevice += 'SmartLocating,';\\r\\n }\\r\\n if ((statusInt & 2048) == 2048) {\\r\\n statusDevice += 'BeaconLocation,';\\r\\n }\\r\\n if ((statusInt & 4096) == 4096) {\\r\\n statusDevice += 'BLEConnected,';\\r\\n }\\r\\n statusDevice = statusDevice.slice(0, -1);\\r\\n // debug('statusHex:' + statusHex)\\r\\n statusHex = (statusHex);\\r\\n statusHex = hexToBin(statusHex);\\r\\n statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\r\\n // debug(statusHex)\\r\\n battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\r\\n // debug(battery_percentage)\\r\\n // debug(battery_percentage)\\r\\n // debug(statusHex.substring(8, 13))\\r\\n cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\r\\n // debug(cellNetworkSignal)\\r\\n workMode = parseInt(statusHex.substring(13, 16), 2);\\r\\n // debug(workMode)\\r\\n general += 'statusDevice:' + statusDevice + ';';\\r\\n if (battery_percentage) {\\r\\n general += 'battery:' + battery_percentage + ';';\\r\\n }\\r\\n if (cellNetworkSignal) {\\r\\n general += 'cellNetworkSignal:' + cellNetworkSignal + ';';\\r\\n }\\r\\n if (workMode) {\\r\\n general += 'workMode:' + workMode + ';';\\r\\n }\\r\\n }\\r\\n }\\r\\n // revisar\\r\\n var gen_location = '0';\\r\\n messageForReceiver = (`Watch-HTB;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n //messageBody = messageBody + keyLengthHex + key + value;\\r\\n break;\\r\\n case '12': // Device requesting timestamp\\r\\n timestamp = moment.utc().unix();\\r\\n timestampHex = decimalToHex(timestamp);\\r\\n timestampHex = changeEndianness(timestampHex);\\r\\n keyLengthHex = ('00' + decimalToHex(1 + (timestampHex.length) / 2)).slice(-2);\\r\\n // respond to device with the timestamp of the server\\r\\n messageBody = messageBody + keyLengthHex + key + timestampHex;\\r\\n messageForReceiver = `Eview;${imei};${sequenceID};Get timestamp`;\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n break;\\r\\n case '21': //Cell Towers\\r\\n var mccHex = value.substring(0, 2);\\r\\n var mncHex = value.substring(2, 3);\\r\\n var mcc = hexToDecimal(mccHex);\\r\\n var mnc = hexToDecimal(mncHex);\\r\\n var numTowers = (keyLength - 4) / 5;\\r\\n var cellTowers = hexToAscii(value);\\r\\n messageBody = messageBody + keyLengthHex + key + value;\\r\\n break;\\r\\n case '22': // WIFI locations \\r\\n location_type = 'WIFI';\\r\\n var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\r\\n //location_time = timestamp;\\r\\n var wifiTowers = value;\\r\\n general += 'wifiTowers:';\\r\\n var indexWifi = 0;\\r\\n var bssid_array = [];\\r\\n gen_location = '';\\r\\n for (let i = 0; i < numWifi; i++) {\\r\\n gen_location += wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\r\\n indexWifi += 14;\\r\\n }\\r\\n gen_location = gen_location.slice(0, -1);\\r\\n general += gen_location;\\r\\n if (alarmCode) {\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch-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 if (typeof configIds !== 'undefined' && configIds && configIds.ConfigureDevice && configIds.ConfigureDevice.LastConfigured) { // when is defined\\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 }\\r\\n if (command == 'FE') {\\r\\n while (index < total_length + 16) {\\r\\n var keyLength = message.substring(index, index = index + 2);\\r\\n keyLength = 2 * hexToDecimal(keyLength);\\r\\n var key = message.substring(index, index = index + 2);\\r\\n var value = message.substring(index, index = index + keyLength - 2);\\r\\n }\\r\\n }\\r\\n // prepare the ACK msg and change config if it is needed\\r\\n lengthAck = messageBody.length / 2;\\r\\n lengthAck = ('0000' + decimalToHex(lengthAck)).slice(-4);\\r\\n lengthAck = lengthAck.toString().substring(2, 4) + lengthAck.toString().substring(0, 2);\\r\\n ////////////checksum CRC 16\\r\\n var checksumAck = byteStringToByteArray(messageBody);\\r\\n checksumAck = crc16byte(checksumAck);\\r\\n checksumAck = decimalToHex(checksumAck);\\r\\n checksumAck = ('0000' + checksumAck).slice(-4);\\r\\n checksumAck = checksumAck.toString().substring(2, 4) + checksumAck.toString().substring(0, 2);\\r\\n prefix = prefix + lengthAck + checksumAck + sequenceID;\\r\\n // To send ACK to the device previous to internal msg with parts\\r\\n if (needsAck == true) {\\r\\n if (messageBody.length <= 2) {\\r\\n ack = 'AB00030008C7' + sequenceID + '7F0100'; // change AB10030008C7 to AB00030008C7\\r\\n } else {\\r\\n ack = prefix + messageBody;\\r\\n }\\r\\n AddValue(codeValues, 'imei', imei);\\r\\n AddValue(codeValues, 'ack', ack);\\r\\n }\\r\\n } else { // checksum was invalid - print out useful debug info and bet quess at imei \\r\\n AddValue(codeValues, \\\"error\\\", \\\"checksum failed for message\\\");\\r\\n AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n i = rawFromBytes.search('3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]');\\r\\n if (i >= 0) {\\r\\n imei = hexToAscii(rawFromBytes.substring(i, i + 30));\\r\\n AddValue(codeValues, \\\"imei\\\", imei);\\r\\n }\\r\\n }\\r\\n }\\r\\n // Auxiliary functions\\r\\n function buildDataToReceiver(codeValues, configsToAck = [], configsToUpdate = [], configsToSend = []) {\\r\\n const dataToReceiver = {\\r\\n values: codeValues\\r\\n };\\r\\n if (configsToAck.length > 0) {\\r\\n dataToReceiver.configsToAck = configsToAck;\\r\\n }\\r\\n if (configsToUpdate.length > 0) {\\r\\n dataToReceiver.configsToUpdate = configsToUpdate;\\r\\n }\\r\\n if (configsToSend.length > 0) {\\r\\n dataToReceiver.configsToSend = configsToSend;\\r\\n }\\r\\n return dataToReceiver;\\r\\n }\\r\\n\\r\\n function AddValue(codeValueArray, p1, p2) { // push code value pair into array\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n codeValueArray.push(cvpair);\\r\\n }\\r\\n // convert functions\\r\\n function asciiToHex(str) { // ascii to hex \\r\\n return [...str].map(char => char.charCodeAt(0).toString(16).padStart(2, '0')).join('');\\r\\n }\\r\\n\\r\\n function byteStringToByteArray(str) { // convierte una cadena hexadecimal en un array de bytes (number[])\\r\\n const bytes = [];\\r\\n for (let i = 0; i < str.length; i += 2) {\\r\\n const byte = parseInt(str.substring(i, i + 2), 16);\\r\\n if (!isNaN(byte) && byte >= 0 && byte <= 255) {\\r\\n bytes.push(byte);\\r\\n }\\r\\n }\\r\\n return bytes;\\r\\n }\\r\\n\\r\\n function decimalToHex(x) {\\r\\n return Number(x).toString(16).toUpperCase();\\r\\n }\\r\\n\\r\\n function hexToBin(hex) { // convierte un valor hexadecimal a su representación binaria, y asegura que tenga al menos 8 bits \\r\\n const bin = parseInt(hex, 16).toString(2);\\r\\n return bin.padStart(hex.length * 4, '0');\\r\\n }\\r\\n\\r\\n function hexToAscii(hex) {\\r\\n if (hex.length % 2 !== 0) {\\r\\n throw new Error(\\\"Hex string length must be even\\\");\\r\\n }\\r\\n let ascii = '';\\r\\n for (let i = 0; i < hex.length; i += 2) {\\r\\n const byte = hex.substr(i, 2);\\r\\n const charCode = parseInt(byte, 16);\\r\\n if (charCode !== 0) { // remove null character (\\\\u0000)\\r\\n ascii += String.fromCharCode(charCode);\\r\\n }\\r\\n }\\r\\n return ascii;\\r\\n //return hex.match(/.{2}/g).map(byte => String.fromCharCode(parseInt(byte, 16))).join('');\\r\\n }\\r\\n\\r\\n function hexToDecimalSigned(hex) { // hex to decimal\\r\\n if (hex.length % 2 !== 0) {\\r\\n hex = '0' + hex;\\r\\n }\\r\\n const num = parseInt(hex, 16);\\r\\n const bits = hex.length * 4;\\r\\n const maxVal = 2 ** bits;\\r\\n return num >= maxVal / 2 ? num - maxVal : num;\\r\\n }\\r\\n\\r\\n function hexToDecimal(hex) {\\r\\n return parseInt(hex, 16);\\r\\n }\\r\\n // CheckSum and debug functions\\r\\n function changeEndianness(hexString) { // changeEndianness\\r\\n if (hexString.length === 0) { //if string is empty or not defined\\r\\n return \\\"\\\";\\r\\n }\\r\\n if (hexString.length % 2 !== 0) {\\r\\n throw new Error(\\\"Hex string length must be even\\\");\\r\\n }\\r\\n return hexString.match(/.{2}/g) // divide in bytes (2 chars)\\r\\n .reverse() // reverse the order\\r\\n .join('');\\r\\n }\\r\\n\\r\\n function calculateCheckSum(payloadData) { // calcula el CRC16 sobre una cadena hexadecimal y devuelve el valor con el endianness invertido\\r\\n const bytes = byteStringToByteArray(payloadData);\\r\\n const crc = crc16byte(bytes);\\r\\n const hex = crc.toString(16).padStart(4, '0').toUpperCase();\\r\\n return changeEndianness(hex);\\r\\n }\\r\\n\\r\\n function crc16byte(byteArray) { // calcula el CRC-16 sobre un array de bytes usando una tabla precalculada (crcTable)\\r\\n let crc = 0x0000;\\r\\n for (const byte of byteArray) {\\r\\n if (byte < 0 || byte > 255 || !Number.isInteger(byte)) {\\r\\n throw new RangeError(\\\"Invalid byte value in input array\\\");\\r\\n }\\r\\n const index = (byte ^ (crc >> 8)) & 0xFF;\\r\\n crc = crcTable[index] ^ (crc << 8);\\r\\n }\\r\\n return crc & 0xFFFF;\\r\\n }\\r\\n\\r\\n function debug(...args) { // write debug info to console log, if localTesting\\r\\n if (localTesting) {\\r\\n console.debug('[DEBUG]', ...args);\\r\\n }\\r\\n }\\r\\n /*\\r\\n function sendMessageToLocalhostNoWait(str) { // sends message to system, closing connection after\\r\\n var server;\\r\\n if (localTesting) {\\r\\n console.log('local testing - sending to protocol-dev server the message ... '); // port 5878\\r\\n console.log(str);\\r\\n server = '52.174.17.77';\\r\\n } else {\\r\\n server = '127.0.0.1';\\r\\n }\\r\\n var c = net.createConnection(5878, server);\\r\\n c.on('error', function(error) {\\r\\n c = net.createConnection(5878, server);\\r\\n });\\r\\n c.write(`${str}`);\\r\\n c.end();\\r\\n }*/\\r\\n function sendMessageToLocalhostNoWait(message) {\\r\\n const server = localTesting ? '52.174.17.77' : '127.0.0.1';\\r\\n //const port = localTesting ? '5878' : ''; //Protocol-dev\\r\\n const port = '5678'; //acceptance-dev\\r\\n if (localTesting) {\\r\\n console.debug('[DEBUG] Sending message to test server:', message);\\r\\n }\\r\\n const client = net.createConnection(port, server, () => {\\r\\n client.write(message);\\r\\n client.end();\\r\\n });\\r\\n client.on('error', (err) => {\\r\\n console.error(`[ERROR] Failed to send message to ${server}:${port}:`, err.message);\\r\\n });\\r\\n client.on('end', () => {\\r\\n if (localTesting) {\\r\\n console.debug('[DEBUG] Connection closed');\\r\\n }\\r\\n });\\r\\n }\\r\\n}\\r\\n// params is not defined locally -> export as module\\r\\nif (typeof(params) === 'undefined') {\\r\\n module.exports = {\\r\\n execute_ops\\r\\n }\\r\\n} else { // on server use local defined vars\\r\\n let return_values = execute_ops(moment, msg, net, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\r\\n // define global returns\\r\\n msg = return_values;\\r\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1750698902},{"Type":1,"NewValue":"{\"Id\":437,\"Name\":\"Access TEC Care Watch\",\"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 // Watch protocol - please see variables and typical values in order below\\r\\n // Watch-CYC;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;SIGNAL=<>;WM=<>;GENERAL=<>\\r\\n // Watch-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\r\\n //\\r\\n // Author: Juanmi Navarro\\r\\n // Created: 01/01/0000\\r\\n // Last modified: 20/05/2025\\r\\n //\\r\\n ///////////////////////////////////////////////////////////////////////////////\\r\\n if (typeof localTesting === \\\"undefined\\\") {\\r\\n let localTesting = \\\"False\\\";\\r\\n }\\r\\n const crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,\\r\\n 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,\\r\\n 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,\\r\\n 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,\\r\\n 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,\\r\\n 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,\\r\\n 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,\\r\\n 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,\\r\\n 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,\\r\\n 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,\\r\\n 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,\\r\\n 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,\\r\\n 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,\\r\\n 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,\\r\\n 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,\\r\\n 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,\\r\\n 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,\\r\\n 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,\\r\\n 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,\\r\\n 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,\\r\\n 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,\\r\\n 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n ];\\r\\n var codeValues = [];\\r\\n AddValue(codeValues, 'protocol_template', 'Watch');\\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 = (`Watch-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 //<>,<>,<> \\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 //<>,<>,<> \\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 Watch-')) {\\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 = (`Watch-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 = (`Watch;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 = (`Watch;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 = (`Watch-RTL;${params.imei};${location_time};${location_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n break;\\r\\n }\\r\\n if (!params.event_time && !event_time) { // if params.event_time undefined - set it to now. \\r\\n var event_time = moment.utc().unix();\\r\\n AddValue(codeValues, 'event_time', event_time);\\r\\n }\\r\\n // if (!params.location_time && !location_time) { // if params.location_time undefined - set it to now. \\r\\n // var location_time = moment.utc().unix();\\r\\n // AddValue(codeValues, 'location_time', location_time);\\r\\n //}\\r\\n }\\r\\n // send data msg to kibana\\r\\n const data = buildDataToReceiver(codeValues, configsToAck, configsToUpdate, configsToSend);\\r\\n console.log(data);\\r\\n return data\\r\\n // end of main operation\\r\\n // define functions used in operation\\r\\n // decode global msg\\r\\n function decoder(str) { // decode rawdata\\r\\n // CARE Decoder\\r\\n AddValue(codeValues, 'Message : ', str);\\r\\n var message = str;\\r\\n // need to check if checksum is correct for possible msg corruption 10/03/23\\r\\n var checksum = message.substring(8, 12);\\r\\n var messageBody = message.substring(16, message.length);\\r\\n debug('message =' + message);\\r\\n debug('checksum =' + checksum);\\r\\n debug('calculateCheckSum =' + calculateCheckSum(messageBody));\\r\\n if (calculateCheckSum(messageBody) == checksum) { // payload is valid\\r\\n debug(\\\"message has valid checksum\\\");\\r\\n var messageBody = command; // update value for the ACK\\r\\n debug('command =' + command);\\r\\n if (command == '01') {\\r\\n while (index < total_length + 16) {\\r\\n var keyLengthHex = message.substring(index, index = index + 2);\\r\\n var keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n var key = message.substring(index, index = index + 2);\\r\\n var value = message.substring(index, index = index + keyLength - 2);\\r\\n debug('key = ' + key);\\r\\n debug('value = ' + value);\\r\\n switch (key) {\\r\\n //Device ID\\r\\n case '01':\\r\\n var imei = hexToAscii(value);\\r\\n // create long connection if it is needed\\r\\n if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n //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\\r\\n if ((alarmCodeExtInt & 1) == 1) {\\r\\n var alarm = 'ALF-C';\\r\\n }\\r\\n // Welfare Check-out\\r\\n else if ((alarmCodeExtInt & 2) == 2) {\\r\\n var alarm = 'ALA-C';\\r\\n }\\r\\n // Standard Alerts\\r\\n //Battery low\\r\\n else if ((alarmCodeInt & 1) == 1) {\\r\\n var alarm = 'BATL';\\r\\n }\\r\\n //Overspeed\\r\\n else if ((alarmCodeInt & 2) == 2) {\\r\\n var alarm = 'ALSP';\\r\\n }\\r\\n //Fall\\r\\n else if ((alarmCodeInt & 4) == 4) {\\r\\n var alarm = 'ALF';\\r\\n }\\r\\n //Tilt\\r\\n else if ((alarmCodeInt & 8) == 8) {\\r\\n var alarm = 'Tilt';\\r\\n } else if ((alarmCodeInt & 16) == 16) {\\r\\n if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n var alarm = 'Geo1-IN';\\r\\n } else {\\r\\n var alarm = 'Geo1-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 32) == 32) {\\r\\n if ((alarmCodeInt & 33554432) == 33554432) {\\r\\n var alarm = 'Geo2-IN';\\r\\n } else {\\r\\n var alarm = 'Geo2-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 64) == 64) {\\r\\n if ((alarmCodeInt & 67108864) == 67108864) {\\r\\n var alarm = 'Geo3-IN';\\r\\n } else {\\r\\n var alarm = 'Geo3-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 128) == 128) {\\r\\n if ((alarmCodeInt & 134217728) == 134217728) {\\r\\n var alarm = 'Geo4-IN';\\r\\n } else {\\r\\n var alarm = 'Geo4-OUT';\\r\\n }\\r\\n }\\r\\n //Power Off\\r\\n else if ((alarmCodeInt & 256) == 256) {\\r\\n var alarm = 'PWRF';\\r\\n }\\r\\n //Power On\\r\\n else if ((alarmCodeInt & 512) == 512) {\\r\\n var alarm = 'PWRN';\\r\\n }\\r\\n //Motion\\r\\n else if ((alarmCodeInt & 1024) == 1024) {\\r\\n var alarm = 'ALMOV';\\r\\n }\\r\\n //No Motion\\r\\n else if ((alarmCodeInt & 2048) == 2048) {\\r\\n var alarm = 'ALNM';\\r\\n }\\r\\n //SOS\\r\\n else if ((alarmCodeInt & 4096) == 4096) {\\r\\n var alarm = 'ALSOS';\\r\\n } else if ((alarmCodeInt & 8192) == 8192) {\\r\\n var alarm = 'Side1';\\r\\n } else if ((alarmCodeInt & 16384) == 16384) {\\r\\n var alarm = 'Side2';\\r\\n }\\r\\n //Battery charging\\r\\n else if ((alarmCodeInt & 32768) == 32768) {\\r\\n var alarm = 'BATCN';\\r\\n }\\r\\n //Battery no charging\\r\\n else if ((alarmCodeInt & 65536) == 65536) {\\r\\n var alarm = 'BATCF';\\r\\n }\\r\\n //SOS Ending\\r\\n // Temporary Commented until we know exactly how it works. 22/09/2022\\r\\n else if ((alarmCodeInt & 131072) == 131072) {\\r\\n var alarm = 'SOSEnding';\\r\\n info = 'Alarm Finished';\\r\\n }\\r\\n //Amber Alert EC03 only\\r\\n else if ((alarmCodeInt & 262144) == 262144) {\\r\\n var alarm = 'ALAO';\\r\\n }\\r\\n // welfare Alert check-in ALA-O\\r\\n else if ((alarmCodeInt & 524288) == 524288) {\\r\\n var alarm = 'ALA-O';\\r\\n }\\r\\n // Amber alert Ending ALA-C\\r\\n else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n var alarm = 'ALA-C';\\r\\n }\\r\\n // Amber alert Ending ALA-C\\r\\n //else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n // var alarm = 'ALA-C';\\r\\n //}\\r\\n // Fall-Down Alert ending\\r\\n else if ((alarmCodeInt & 2097152) == 2097152) {\\r\\n var alarm = 'ALF-C';\\r\\n }\\r\\n // welfare Alert Ending ALA\\r\\n else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n var alarm = 'ALA';\\r\\n }\\r\\n // Beacon absent Alert 11/10/22. Need to be added in msg types\\r\\n //else if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n // var alarm = 'BEA';\\r\\n //}\\r\\n general += 'alarm:' + alarm + ',';\\r\\n break;\\r\\n //Custom ID\\r\\n case '03':\\r\\n customID = value;\\r\\n var allowedCID = ['3036', '06'];\\r\\n if (!allowedCID.includes(value)) {\\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 //<>,<>,<>,<>,<>\\r\\n gps_data = `${latitude},${longitude},${location_accuracy},${speed},${direction},${altitude},${satellites},${mileage}`;\\r\\n general += 'gps location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n break;\\r\\n //WIFI Towers\\r\\n case '22':\\r\\n location_type = 'WIFI';\\r\\n var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\r\\n //location_time = timestamp;\\r\\n var wifiTowers = value;\\r\\n general += 'wifiTowers:';\\r\\n var indexWifi = 0;\\r\\n var bssid_array = [];\\r\\n wifi_data = '';\\r\\n for (let i = 0; i < numWifi; i++) {\\r\\n wifi_data += hexToDecimalSigned(wifiTowers.substring(indexWifi, indexWifi + 2)) + ',' + wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\r\\n indexWifi += 14;\\r\\n }\\r\\n wifi_data = wifi_data.slice(0, -1);\\r\\n general += wifi_data;\\r\\n break;\\r\\n //BLE Location Added 10/10/22\\r\\n case '23':\\r\\n location_type = 'BLE';\\r\\n var mac = value.substring(0, 12);\\r\\n var latitudeHex = value.substring(12, 20);\\r\\n var longitudeHex = value.substring(20, 28);\\r\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n var address = hexToAscii(value.substring(28, value.length));\\r\\n var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n // add : format in MAC\\r\\n mac = mac.match(/.{1,2}/g).join(':');\\r\\n // location_time = timestamp;\\r\\n ble_data = `${latitude},${longitude},${mac},${address}`;\\r\\n general += 'BLE location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n break;\\r\\n //General Data , status_data\\r\\n case '24':\\r\\n //const allowedCID = ['3036', '06'];\\r\\n if (!allowedCID.includes(customID)) {\\r\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n AddValue(codeValues, \\\"customID\\\", customID);\\r\\n return\\r\\n }\\r\\n if (alarmCode) {\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n }\\r\\n //else {\\r\\n // messageForReceiver = (`CareWatch-CYC;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};`);\\r\\n //}\\r\\n // reset variables\\r\\n //alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n var timestampHex = value.substring(0, 8);\\r\\n timestampHex = changeEndianness(timestampHex);\\r\\n timestamp = hexToDecimal(timestampHex);\\r\\n location_time = timestamp;\\r\\n event_time = timestamp;\\r\\n // HardCode to fix possible issue in protocol\\r\\n //event_time = moment.utc().unix();\\r\\n // end of hard code\\r\\n var statusHex = changeEndianness(value.substring(8, 16));\\r\\n var statusInt = hexToDecimal(statusHex);\\r\\n var statusDevice = '';\\r\\n if ((statusInt & 1) == 1) {\\r\\n statusDevice += 'GPS,';\\r\\n }\\r\\n if ((statusInt & 2) == 2) {\\r\\n statusDevice += 'WIFISource,';\\r\\n }\\r\\n if ((statusInt & 4) == 4) {\\r\\n statusDevice += 'CellTower,';\\r\\n }\\r\\n if ((statusInt & 8) == 8) {\\r\\n statusDevice += 'BLELocation,';\\r\\n }\\r\\n //params.BatteryStatus.BatteryStatus = '1';\\r\\n if ((statusInt & 16) == 16) {\\r\\n statusDevice += 'Charging,';\\r\\n // var alarm = 'BATCN';\\r\\n //configs.BatteryStatus.BatteryStatus = '1';\\r\\n /* if (configs.BatteryStatus.BatteryStatus !== '1') {\\r\\n hasConfigs = true;\\r\\n var batteryStatus = '1';\\r\\n var alarm = 'BATCN';\\r\\n let configsToUpdate = [];\\r\\n configsToUpdate.push({\\r\\n 'code': configIds.BatteryStatus.BatteryStatus,\\r\\n 'value': batteryStatus\\r\\n });\\r\\n }*/\\r\\n }\\r\\n if ((statusInt & 32) == 32) {\\r\\n statusDevice += 'FUllyCharged,';\\r\\n //var alarm = 'BATF';\\r\\n // configs.BatteryStatus.BatteryStatus = '3';\\r\\n /* if (configs.BatteryStatus.BatteryStatus !== '3') {\\r\\n hasConfigs = true;\\r\\n var batteryStatus = '3';\\r\\n var alarm = 'BATF';\\r\\n let configsToUpdate = [];\\r\\n configsToUpdate.push({\\r\\n 'code': configIds.BatteryStatus.BatteryStatus,\\r\\n 'value': batteryStatus\\r\\n });\\r\\n }*/\\r\\n }\\r\\n /* if (!((statusInt & 32) == 32) & !((statusInt & 16) == 16)) {\\r\\n statusDevice += 'Not Charging,';\\r\\n var alarm = 'BATCF';\\r\\n //configs.BatteryStatus.BatteryStatus = '2';\\r\\n if (configs.BatteryStatus.BatteryStatus !== '2') {\\r\\n var batteryStatus = '2';\\r\\n var alarm = 'BATCF';\\r\\n let configsToUpdate = [];\\r\\n configsToUpdate.push({\\r\\n 'code': configIds.BatteryStatus.BatteryStatus,\\r\\n 'value': batteryStatus\\r\\n });\\r\\n }\\r\\n }*/\\r\\n if ((statusInt & 64) == 64) {\\r\\n statusDevice += 'Reboot,';\\r\\n }\\r\\n if ((statusInt & 128) == 128) {\\r\\n statusDevice += 'HistoricalData,';\\r\\n }\\r\\n if ((statusInt & 256) == 256) {\\r\\n statusDevice += 'AGPSDataValid,';\\r\\n }\\r\\n if ((statusInt & 512) == 512) {\\r\\n statusDevice += 'Motion,';\\r\\n }\\r\\n if ((statusInt & 1024) == 1024) {\\r\\n statusDevice += 'SmartLocating,';\\r\\n }\\r\\n if ((statusInt & 2048) == 2048) { //isHome\\r\\n statusDevice += 'BeaconLocation,';\\r\\n }\\r\\n if ((statusInt & 4096) == 4096) {\\r\\n statusDevice += 'BLEConnected,';\\r\\n }\\r\\n if ((statusInt & 16384) == 16384) {\\r\\n statusDevice += 'HomeWiFi,';\\r\\n }\\r\\n statusDevice = statusDevice.slice(0, -1);\\r\\n status_data = statusDevice; //to oysta template\\r\\n //statusHex = (statusHex);\\r\\n statusHex = hexToBin(statusHex);\\r\\n statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\r\\n battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\r\\n cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\r\\n workMode = parseInt(statusHex.substring(13, 16), 2);\\r\\n general += 'statusDevice:' + statusDevice + ',';\\r\\n if (battery_percentage) {\\r\\n general += 'battery:' + battery_percentage + ',';\\r\\n }\\r\\n if (cellNetworkSignal) {\\r\\n general += 'cellNetworkSignal:' + cellNetworkSignal + ',';\\r\\n }\\r\\n if (workMode) {\\r\\n general += 'workMode:' + workMode + ',';\\r\\n }\\r\\n //messageForReceiver = (`CareWatch-CYC;${imei};${i};${event_time};${battery_percentage}`);\\r\\n break;\\r\\n //Call Records\\r\\n case '25':\\r\\n //Needed?\\r\\n break;\\r\\n //BLE Location 2\\r\\n case '26':\\r\\n //I don't understand\\r\\n //messageBody = messageBody + keyLengthHex + key + value;\\r\\n break;\\r\\n //Smart Location\\r\\n case '27':\\r\\n location_type = 'SMART';\\r\\n var latitudeHex = value.substring(0, 8);\\r\\n var longitudeHex = value.substring(8, 16);\\r\\n var location_accuracyHex = value.substring(16, 20);\\r\\n var altitudeHex = value.substring(20, 24);\\r\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n var altitude = hexToDecimal(changeEndianness(altitudeHex));\\r\\n //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\r\\n //04/08/2022 se quita el multiplicador por 5 pq ya viene el valor en metros\\r\\n location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\r\\n //location_time = timestamp;\\r\\n smart_data = `${latitude},${longitude},${location_accuracy},${altitude}`;\\r\\n general += 'smart location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n break;\\r\\n //Beacon Location Added 11/10/22\\r\\n case '28':\\r\\n location_type = 'BEACON';\\r\\n // var alarm = 'EBZI';\\r\\n var latitudeHex = '00';\\r\\n var longitudeHex = '00';\\r\\n var descr = 'empty';\\r\\n var flag = hexToDecimal(value.substring(0, 1));\\r\\n var beacId = hexToDecimal(value.substring(1, 2));\\r\\n // msg includes descrip\\r\\n if ((flag & 4) == 4) {\\r\\n descr = hexToAscii(value.substring(18, value.length));\\r\\n }\\r\\n // msg includes lat/lon\\r\\n if ((flag & 8) == 8) {\\r\\n latitudeHex = value.substring(18, 26);\\r\\n longitudeHex = value.substring(26, 34);\\r\\n }\\r\\n // msg includes lat/lon and description\\r\\n if ((flag & 12) == 12) {\\r\\n latitudeHex = value.substring(18, 26);\\r\\n longitudeHex = value.substring(26, 34);\\r\\n descr = hexToAscii(value.substring(34, value.length));\\r\\n }\\r\\n var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n // add : format in MAC\\r\\n mac = mac.match(/.{1,2}/g).join(':');\\r\\n var rssiHex = value.substring(14, 16);\\r\\n var rssi1Hex = value.substring(16, 18);\\r\\n rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\r\\n rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\r\\n // var latitudeHex = value.substring(18, 26);\\r\\n // var longitudeHex = value.substring(26, 34);\\r\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n //location_time = timestamp;\\r\\n beacon_data = `${latitude},${longitude},${mac},${descr}`;\\r\\n general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (listIndex):' + beacId + ',';\\r\\n break;\\r\\n // Beacon V2\\r\\n case '2C':\\r\\n location_type = 'BEACON';\\r\\n // var alarm = 'EBZI';\\r\\n var latitudeHex = '00';\\r\\n var longitudeHex = '00';\\r\\n var descr = 'empty';\\r\\n var flag = hexToDecimal(value.substring(0, 1));\\r\\n var beacId = hexToDecimal(value.substring(1, 2));\\r\\n // msg includes descrip\\r\\n if ((flag & 4) == 4) {\\r\\n let desc_leng = hexToDecimal(value.substring(20, 22));\\r\\n descr = hexToAscii(value.substring(22, 22 + (2 * desc_leng)));\\r\\n //descr = hexToAscii(value.substring(18, value.length));\\r\\n }\\r\\n // msg includes lat/lon\\r\\n if ((flag & 8) == 8) {\\r\\n latitudeHex = value.substring(18, 26);\\r\\n longitudeHex = value.substring(26, 34);\\r\\n }\\r\\n // msg includes lat/lon and description\\r\\n if ((flag & 12) == 12) {\\r\\n latitudeHex = value.substring(20, 28);\\r\\n longitudeHex = value.substring(28, 36);\\r\\n let desc_leng = hexToDecimal(value.substring(36, 38));\\r\\n descr = hexToAscii(value.substring(38, 38 + (2 * desc_leng)));\\r\\n }\\r\\n var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n // add : format in MAC\\r\\n mac = mac.match(/.{1,2}/g).join(':');\\r\\n var rssiHex = value.substring(14, 16);\\r\\n var rssi1Hex = value.substring(16, 18);\\r\\n rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\r\\n rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\r\\n var battery_beacon = hexToDecimal(value.substring(18, 20));\\r\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n //location_time = timestamp;\\r\\n beacon_data = `${latitude},${longitude},${mac},${descr}`;\\r\\n general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (battery):' + battery_beacon + ', (listIndex):' + beacId + ',';\\r\\n break;\\r\\n //Cell Towers Note\\r\\n case '29':\\r\\n location_type = 'LBS';\\r\\n lbs_data = '';\\r\\n var mccHex = changeEndianness(value.substring(0, 4));\\r\\n var mncHex = value.substring(4, 6);\\r\\n var mcc = hexToDecimal(mccHex);\\r\\n lbs_data += mcc + ',';\\r\\n var mnc = hexToDecimal(mncHex);\\r\\n lbs_data += mnc + ',';\\r\\n var indexLbs = 6;\\r\\n var numTowers = (hexToDecimal(keyLengthHex) - 4) / 7;\\r\\n for (let i = 0; i < numTowers; i++) {\\r\\n var rxlHex = changeEndianness(value.substring(indexLbs, indexLbs + 2));\\r\\n var rxl = hexToDecimal(rxlHex);\\r\\n var lacHex = changeEndianness(value.substring(indexLbs + 2, indexLbs + 6));\\r\\n var lac = hexToDecimal(lacHex);\\r\\n var cellTowers = hexToDecimal(changeEndianness(value.substring(indexLbs + 6, indexLbs + 14)));\\r\\n lbs_data += rxl + ',' + lac + ',' + cellTowers + ',';\\r\\n indexLbs += 14;\\r\\n }\\r\\n lbs_data = lbs_data.slice(0, -1);\\r\\n general += lbs_data;\\r\\n break;\\r\\n case '30':\\r\\n //G-sensor.\\r\\n 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 = (`Watch-${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 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 = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n }\\r\\n break;\\r\\n //BLE Connected . For Flic button\\r\\n case '62':\\r\\n location_type = 'BLE';\\r\\n //var alarm = 'EBZI'; \\r\\n //var latitudeHex = '00';\\r\\n //var longitudeHex = '00';\\r\\n //var descr = 'empty';\\r\\n var flag = hexToDecimal(value.substring(0, 2)); // 0= Disconnected, 1= Connected\\r\\n var mac = value.substring(2, 14); // No hace falta darle la vuelta\\r\\n // add : format in MAC\\r\\n mac = mac.match(/.{1,2}/g).join(':');\\r\\n var batLevel = hexToDecimal(value.substring(14, 16)); // 0-100\\r\\n //location_time = timestamp;\\r\\n ble_data = `${flag},${batLevel},${mac}`;\\r\\n general += 'BLE location (State):' + flag + ', (bat):' + batLevel + ', (mac):' + mac + ',';\\r\\n break;\\r\\n }\\r\\n }\\r\\n if (alarmCode) {\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch;ACK-FIRM;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\r\\n //AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\r\\n configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\r\\n //configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\r\\n //messageBody = messageBody + keyLengthHex + key + value;\\r\\n break;\\r\\n case '1A':\\r\\n //no ACK need\\r\\n var fwVersion = hexToAscii(value);\\r\\n imei = serverParams.Imei;\\r\\n AddValue(codeValues, \\\"imei\\\", imei);\\r\\n AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\r\\n messageForReceiver = (`Watch;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 = (`Watch;ACK-VOL;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"Volume\\\", volume);\\r\\n AddValue(configsToUpdate, configIds.ReadSystemSettings.Volume, volume);\\r\\n configsToAck.push(configIds.ReadSystemSettings.Volume);\\r\\n break;\\r\\n case '0A': //Performance mode\\r\\n //var workMode = hexToDecimal(value);\\r\\n //messageBody = messageBody + keyLengthHex + key + value;\\r\\n //AddValue(codeValues, \\\"WorkMode\\\", workMode);\\r\\n //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\r\\n //configsToAck.push(configIds.ReadPerformance`Settings.Mode);\\r\\n //var workMode = hexToAscii(value.substring(0, value.length));\\r\\n //var workMode = hexToDecimal(value);\\r\\n //var workMode = hexToAscii(value.substring(0, value.length));\\r\\n var workMode = 1234; // + value + \\\"end\\\";\\r\\n //var workModeVal = 9;\\r\\n //workMode = 'test10';\\r\\n imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;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 '0F': // Enable control.... Used for STEP COUNTING SETTINGS\\r\\n // 'FF FF 21 80'\\r\\n var StepStatus = hexToBin(value.substring(4, 6));\\r\\n var enalbleDisable = '';\\r\\n if (StepStatus.substring(7, 8) == '1') {\\r\\n var step = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var step = 'Disable, '\\r\\n };\\r\\n //var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n //hrate += detectingInterval;\\r\\n AddValue(codeValues, \\\"step\\\", step);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadStepsSettings.EnableDisableReadStepsSettings, enalbleDisable);\\r\\n //AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadStepsSettings.EnableDisableReadStepsSettings);\\r\\n //configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\r\\n break;\\r\\n case '1B':\\r\\n //Decimal o ascii?\\r\\n var gsmModule = hexToDecimal(value);\\r\\n messageBody = messageBody + keyLengthHex + key + value;\\r\\n break;\\r\\n case '1F':\\r\\n //System Language\\r\\n var systemLanguage = hexToAscii(value.substring(0, value.length));\\r\\n imei = serverParams.Imei;\\r\\n //messageBody = messageBody + keyLengthHex + key + value;\\r\\n messageForReceiver = (`Watch;ACK-LANG;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"SystemLanguage\\\", systemLanguage);\\r\\n AddValue(configsToUpdate, configIds.ReadSystemSettings.SystemLanguage, systemLanguage);\\r\\n configsToAck.push(configIds.ReadSystemSettings.SystemLanguage);\\r\\n break;\\r\\n case '33': // phone option\\r\\n // [Value]:83 0B 00 00 {\\\"phoneOption\\\":{\\\"flag_value\\\":2947,\\\"s3\\\":1,\\\"s4\\\":0,\\\"s5\\\":1,\\\"s6\\\":0,\\\"callIncoming\\\":0,\\\"rings\\\":3,\\\"s7\\\":0,\\\"toneID\\\":0,\\\"s1\\\":1,\\\"s2\\\":1}}\\r\\n var statusPhone = hexToBin(value.substring(0, 2)); // To find autoanswer setup\\r\\n if (statusPhone.substring(0, 1) == '1') { // 1 Enable\\r\\n var auto = 'true';\\r\\n } else var auto = 'false';\\r\\n statusPhone = hexToBin(value.substring(2, 4)); // To find allow list setup\\r\\n if (statusPhone.substring(7, 8) == '1') { // 1 Enable\\r\\n allow = 'true';\\r\\n } else var allow = 'false';\\r\\n //statusPhone = hexToBin(value.substring(0, 2)) + hexToBin(value.substring(2, 4));\\r\\n //AddValue(configsToUpdate, configIds.ReadSystemSettings.Statusphone, statusPhone);\\r\\n AddValue(configsToUpdate, configIds.ReadSystemSettings.AllowList, allow);\\r\\n AddValue(configsToUpdate, configIds.ReadSystemSettings.AutoAnswer, auto);\\r\\n //configsToAck.push(configIds.ReadSystemSettings.Statusphone);\\r\\n configsToAck.push(configIds.ReadSystemSettings.AllowList);\\r\\n configsToAck.push(configIds.ReadSystemSettings.AutoAnswer);\\r\\n break;\\r\\n case '34': //ContactList with name\\r\\n var contactNumber = value.substring(1, 2);\\r\\n var telLength = hexToDecimal(value.substring(2, 4));\\r\\n var tel = '';\\r\\n switch (contactNumber) {\\r\\n // Emergency Number\\r\\n case '0':\\r\\n tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\r\\n AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n break;\\r\\n // Speed Dial Number\\r\\n //case '1':\\r\\n // tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\r\\n // AddValue(codeValues, \\\"SpeedDialNumber\\\", tel);\\r\\n // AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.SpeedDialNumber, tel);\\r\\n // configsToAck.push(configIds.ReadSpeedDialSettings.SpeedDialNumber);\\r\\n // break;\\r\\n // Gateway Number\\r\\n case '9': //00447781482635,Esendex UK 0034627177148,Esendex Spain 00447507288240,Esendex UK Acceptance\\r\\n tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\r\\n if (tel.includes('447781482635') || tel.includes('00447781482635')) {\\r\\n tel = 'Esendex UK'\\r\\n } else if (tel.includes('34627177148') || tel.includes('0034627177148')) {\\r\\n tel = 'Esendex Spain'\\r\\n } else if (tel.includes('447507288240') || tel.includes('00447507288240')) {\\r\\n tel = 'Esendex UK Acceptance'\\r\\n } else {\\r\\n tel = 'Default'\\r\\n }\\r\\n AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n break;\\r\\n default:\\r\\n tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\r\\n if (tel.length < 6) {\\r\\n contacts += '';\\r\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n break;\\r\\n }\\r\\n //contacts += 'A' + (contactNumber - 1) + ': ' + tel + ', ';\\r\\n contacts += tel + ', ';\\r\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n break;\\r\\n }\\r\\n break;\\r\\n case '40': // APN\\r\\n //no ACK need\\r\\n AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'));\\r\\n configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\r\\n var apn = hexToAscii(value.substring(0, value.length));\\r\\n imei = serverParams.Imei;\\r\\n break;\\r\\n case '41': // APN Username\\r\\n //no ACK need\\r\\n //apn = apn + ',' + hexToAscii(value.substring(0, value.length));\\r\\n break;\\r\\n case '42': // APN Password\\r\\n //no ACK need\\r\\n //apn = apn + ',' + hexToAscii(value.substring(0, value.length));\\r\\n messageForReceiver = (`Watch;ACK-GDATA;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"apn\\\", apn);\\r\\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.APN, apn);\\r\\n configsToAck.push(configIds.ReadCommunicationSettings.APN);\\r\\n break;\\r\\n case '43': //Server Details\\r\\n //52.232.85.255,5678 production 52.174.17.77,5678 acceptance\\r\\n var serverDetails = hexToAscii(value.substring(6, value.length)) + ':' + hexToDecimal(value.substring(4, 6) + value.substring(2, 4));\\r\\n if (serverDetails.includes('52.232.85.255:5678')) {\\r\\n serverDetails = 'Production'\\r\\n } else if (serverDetails.includes('52.174.17.77:5678')) {\\r\\n serverDetails = 'Acceptance'\\r\\n } else if (serverDetails.includes('52.174.17.77:5778')) {\\r\\n serverDetails = 'Protocol-Import'\\r\\n } else if (serverDetails.includes('52.174.17.77:5878')) {\\r\\n serverDetails = 'Protocol-Dev'\\r\\n } else {\\r\\n serverDetails = 'Default'\\r\\n }\\r\\n AddValue(codeValues, \\\"server\\\", serverDetails);\\r\\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.Server, serverDetails);\\r\\n configsToAck.push(configIds.ReadCommunicationSettings.Server);\\r\\n break;\\r\\n case '44': //time interval - work mode intervals\\r\\n imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;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 '46': //HeartRate\\r\\n // '10 0E 00 80'\\r\\n var HeartRateStatus = hexToBin(value.substring(6, 8));\\r\\n var enalbleDisable = '';\\r\\n if (HeartRateStatus.substring(0, 1) == '1') {\\r\\n var hrate = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var hrate = 'Disable, '\\r\\n };\\r\\n var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n hrate += detectingInterval;\\r\\n AddValue(codeValues, \\\"hrate\\\", hrate);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings);\\r\\n configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\r\\n break;\\r\\n case '47': // Custom Id\\r\\n imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;ACK-CUSTID;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"customeid\\\", value);\\r\\n AddValue(configsToUpdate, configIds.ReadState.CustomId, hexToAscii(value)); //now it comes \\\"3036\\\"\\r\\n configsToAck.push(configIds.ReadState.CustomId);\\r\\n break;\\r\\n case '53': // Non motion alert\\r\\n //2B020080\\r\\n var status = hexToBin(value.substring(6, 8));\\r\\n var alertSetting = '';\\r\\n var enableDisable = '';\\r\\n if (status.substring(0, 1) == '1') {\\r\\n alertSetting = 'Enable, '\\r\\n enableDisable = '1';\\r\\n } else {\\r\\n alertSetting = 'Disable, '\\r\\n };\\r\\n //if (status.substring(5, 6) == '1') {\\r\\n // alertSetting += 'Dial, '\\r\\n //} else {\\r\\n // alertSetting += 'No Dial, '\\r\\n //};\\r\\n var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\r\\n alertSetting += time;\\r\\n imei = serverParams.Imei;\\r\\n // commented until Eview fixes this function\\r\\n /*\\r\\n messageForReceiver = (`Watch;ACK-NOMOTION;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"nomotion\\\", alertSetting);\\r\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings, enableDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n configsToAck.push(configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings);\\r\\n configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n */\\r\\n break;\\r\\n case '56': //Fall down sensibility\\r\\n // '00001100'\\r\\n var fallStatus = hexToBin(value.substring(0, 2));\\r\\n var enalbleDisable = '';\\r\\n //if (fallStatus.substring(4, 5) == '1') {\\r\\n if (fallStatus.substring(0, 1) == '1') {\\r\\n var sensibility = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var sensibility = 'Disable, '\\r\\n };\\r\\n if (fallStatus.substring(5, 6) == '1') {\\r\\n sensibility += 'Dial, '\\r\\n } else {\\r\\n sensibility += 'No Dial, '\\r\\n };\\r\\n var imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;ACK-FALLALERT;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n var sesibityOptionValue = hexToDecimal(value.substring(1, 2));\\r\\n sensibility += sesibityOptionValue;\\r\\n AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n //AddValue(configsToUpdate, configIds.ReadAlertSettings.FallSettings, sensibility);\\r\\n AddValue(configsToUpdate, configIds.ReadFallSettings.EnableDisableFallSettings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadFallSettings.Sensitivity, sesibityOptionValue);\\r\\n //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n configsToAck.push(configIds.ReadFallSettings.EnableDisableFallSettings);\\r\\n configsToAck.push(configIds.ReadFallSettings.Sensitivity);\\r\\n break;\\r\\n case '73': //BeaconList\\r\\n var beaconNumber = hexToDecimal(value.substring(1, 2));\\r\\n var beaconStatus = hexToBin(value.substring(0, 1));\\r\\n beaconStatus = hexToAscii(value.substring(30, value.length));\\r\\n //beaconStatus = changeEndianness(value.substring(30, value.length));\\r\\n //homeBeacon += 'B' + (beaconNumber + 1) + ': ' + beaconStatus + ', ';\\r\\n homeBeacon += beaconStatus + ', ';\\r\\n AddValue(codeValues, \\\"homeBeacon\\\", homeBeacon);\\r\\n messageForReceiver = (`Watch;ACK-GDATA;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n break;\\r\\n case '4A': //Wifi Network List\\r\\n var wifiSSIDLenght = hexToDecimal(value.substring(2, 4));\\r\\n var wifiPasswordLenght = hexToDecimal(value.substring(4, 6));\\r\\n var wifiIndex = hexToDecimal(value.substring(1, 2));\\r\\n //var wifiStatus = hexToDecimal(value.substring(0, 1));\\r\\n var wifiStatus = value.substring(0, 1);\\r\\n /*var enalbleDisable = wifiSSID = wifiPassword = homeWifi = '';\\r\\n /var homeWifi = '';\\r\\n if (wifiIndex == '0') { // Only first Wifi of the list\\r\\n if (wifiStatus == '8') {\\r\\n homeWifi += ' Enable, '\\r\\n enalbleDisable = '1';\\r\\n } else {\\r\\n homeWifi += ' Disable, '\\r\\n //enalbleDisable = '0';\\r\\n };*/\\r\\n if ((wifiStatus == '8') || (wifiStatus == 'C')) { // 8 == ON OR C== ON and Connected\\r\\n var wifiSSID = hexToAscii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\r\\n var wifiPassword = hexToAscii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\r\\n var imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;ACK-WIFI;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n //homeWiFi += 'W' + (wifiIndex + 1) + ': ' + wifiSSID + ', ' + wifiPassword + ';';\\r\\n homeWiFi += wifiSSID + ', ' + wifiPassword + ';';\\r\\n AddValue(codeValues, \\\"wifi\\\", homeWiFi);\\r\\n AddValue(configsToUpdate, configIds.ReadWiFiList.WiFiList, homeWiFi);\\r\\n configsToAck.push(configIds.ReadWiFiList.WiFiList);\\r\\n }\\r\\n //AddValue(configsToUpdate, configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings, enalbleDisable);\\r\\n //AddValue(configsToUpdate, configIds.ReadWiFiSettings.SSID, wifiSSID);\\r\\n //AddValue(configsToUpdate, configIds.ReadWiFiSettings.Password, wifiPassword);\\r\\n //configsToAck.push(configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings);\\r\\n //configsToAck.push(configIds.ReadWiFiSettings.SSID);\\r\\n //configsToAck.push(configIds.ReadWiFiSettings.Password);\\r\\n break;\\r\\n case '21': // Speed Dial Settings\\r\\n // [Value]:53 84 {\\\"call1Button\\\":{\\\"mode\\\":0,\\\"feedBack\\\":3,\\\"task\\\":2,\\\"time\\\":20,\\\"status\\\":1}}\\r\\n var status = hexToBin(value.substring(2, 4)); //always pass 2 HEXs to this function\\r\\n var alertSetting = '';\\r\\n var enalbleDisable = '';\\r\\n if (status.substring(0, 1) == '1') {\\r\\n alertSetting = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n alertSetting = 'Disable, '\\r\\n //enableDisable = '0';\\r\\n };\\r\\n //var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\r\\n //alertSetting += time;\\r\\n imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;ACK-SPEED;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"speed\\\", alertSetting);\\r\\n AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\r\\n configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n break;\\r\\n }\\r\\n }\\r\\n }\\r\\n if (command == '03') {\\r\\n while (index < total_length + 16) {\\r\\n var keyLengthHex = message.substring(index, index = index + 2);\\r\\n var keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n var key = message.substring(index, index = index + 2);\\r\\n var value = message.substring(index, index = index + keyLength - 2);\\r\\n debug('key = ' + key);\\r\\n debug('value = ' + value);\\r\\n switch (key) {\\r\\n case '01': // Device ID\\r\\n var imei = hexToAscii(value);\\r\\n // create long connection if it is needed\\r\\n if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n //return;\\r\\n }\\r\\n break;\\r\\n case '10': // Heartbeat\\r\\n var heartbeat = hexToAscii(value);\\r\\n event_time = moment.utc().unix();\\r\\n if (index < total_length + 16) {\\r\\n var keyLengthHex = message.substring(index, index = index + 2);\\r\\n keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n key = message.substring(index, index = index + 2);\\r\\n if (key == '24') {\\r\\n // debug('key: ' + key) //comment those out\\r\\n value = message.substring(index, index = index + keyLength - 2);\\r\\n // debug(value)\\r\\n var timestampHex = value.substring(0, 8);\\r\\n // debug('timestampt hex: ' + timestampHex)\\r\\n timestampHex = changeEndianness(timestampHex);\\r\\n timestamp = hexToDecimal(timestampHex);\\r\\n event_time = timestamp;\\r\\n // debug(event_time)\\r\\n var statusHex = changeEndianness(value.substring(8, 16));\\r\\n // debug(statusHex)\\r\\n var statusInt = hexToDecimal(statusHex);\\r\\n var statusDevice = '';\\r\\n if ((statusInt & 1) == 1) {\\r\\n statusDevice += 'GPS,';\\r\\n }\\r\\n if ((statusInt & 2) == 2) {\\r\\n statusDevice += 'WIFISource,';\\r\\n }\\r\\n if ((statusInt & 4) == 4) {\\r\\n statusDevice += 'CellTower,';\\r\\n }\\r\\n if ((statusInt & 8) == 8) {\\r\\n statusDevice += 'BLELocation,';\\r\\n }\\r\\n if ((statusInt & 16) == 16) {\\r\\n statusDevice += 'Charging,';\\r\\n }\\r\\n if ((statusInt & 32) == 32) {\\r\\n statusDevice += 'FUllyCharged,';\\r\\n }\\r\\n if ((statusInt & 64) == 64) {\\r\\n statusDevice += 'Reboot,';\\r\\n }\\r\\n if ((statusInt & 128) == 128) {\\r\\n statusDevice += 'HistoricalData,';\\r\\n }\\r\\n if ((statusInt & 256) == 256) {\\r\\n statusDevice += 'AGPSDataValid,';\\r\\n }\\r\\n if ((statusInt & 512) == 512) {\\r\\n statusDevice += 'Motion,';\\r\\n }\\r\\n if ((statusInt & 1024) == 1024) {\\r\\n statusDevice += 'SmartLocating,';\\r\\n }\\r\\n if ((statusInt & 2048) == 2048) {\\r\\n statusDevice += 'BeaconLocation,';\\r\\n }\\r\\n if ((statusInt & 4096) == 4096) {\\r\\n statusDevice += 'BLEConnected,';\\r\\n }\\r\\n statusDevice = statusDevice.slice(0, -1);\\r\\n // debug('statusHex:' + statusHex)\\r\\n statusHex = (statusHex);\\r\\n statusHex = hexToBin(statusHex);\\r\\n statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\r\\n // debug(statusHex)\\r\\n battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\r\\n // debug(battery_percentage)\\r\\n // debug(battery_percentage)\\r\\n // debug(statusHex.substring(8, 13))\\r\\n cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\r\\n // debug(cellNetworkSignal)\\r\\n workMode = parseInt(statusHex.substring(13, 16), 2);\\r\\n // debug(workMode)\\r\\n general += 'statusDevice:' + statusDevice + ';';\\r\\n if (battery_percentage) {\\r\\n general += 'battery:' + battery_percentage + ';';\\r\\n }\\r\\n if (cellNetworkSignal) {\\r\\n general += 'cellNetworkSignal:' + cellNetworkSignal + ';';\\r\\n }\\r\\n if (workMode) {\\r\\n general += 'workMode:' + workMode + ';';\\r\\n }\\r\\n }\\r\\n }\\r\\n // revisar\\r\\n var gen_location = '0';\\r\\n messageForReceiver = (`Watch-HTB;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n //messageBody = messageBody + keyLengthHex + key + value;\\r\\n break;\\r\\n case '12': // Device requesting timestamp\\r\\n timestamp = moment.utc().unix();\\r\\n timestampHex = decimalToHex(timestamp);\\r\\n timestampHex = changeEndianness(timestampHex);\\r\\n keyLengthHex = ('00' + decimalToHex(1 + (timestampHex.length) / 2)).slice(-2);\\r\\n // respond to device with the timestamp of the server\\r\\n messageBody = messageBody + keyLengthHex + key + timestampHex;\\r\\n messageForReceiver = `Eview;${imei};${sequenceID};Get timestamp`;\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n break;\\r\\n case '21': //Cell Towers\\r\\n var mccHex = value.substring(0, 2);\\r\\n var mncHex = value.substring(2, 3);\\r\\n var mcc = hexToDecimal(mccHex);\\r\\n var mnc = hexToDecimal(mncHex);\\r\\n var numTowers = (keyLength - 4) / 5;\\r\\n var cellTowers = hexToAscii(value);\\r\\n messageBody = messageBody + keyLengthHex + key + value;\\r\\n break;\\r\\n case '22': // WIFI locations \\r\\n location_type = 'WIFI';\\r\\n var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\r\\n //location_time = timestamp;\\r\\n var wifiTowers = value;\\r\\n general += 'wifiTowers:';\\r\\n var indexWifi = 0;\\r\\n var bssid_array = [];\\r\\n gen_location = '';\\r\\n for (let i = 0; i < numWifi; i++) {\\r\\n gen_location += wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\r\\n indexWifi += 14;\\r\\n }\\r\\n gen_location = gen_location.slice(0, -1);\\r\\n general += gen_location;\\r\\n if (alarmCode) {\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch-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 if (typeof configIds !== 'undefined' && configIds && configIds.ConfigureDevice && configIds.ConfigureDevice.LastConfigured) { // when is defined\\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 }\\r\\n if (command == 'FE') {\\r\\n while (index < total_length + 16) {\\r\\n var keyLength = message.substring(index, index = index + 2);\\r\\n keyLength = 2 * hexToDecimal(keyLength);\\r\\n var key = message.substring(index, index = index + 2);\\r\\n var value = message.substring(index, index = index + keyLength - 2);\\r\\n }\\r\\n }\\r\\n // prepare the ACK msg and change config if it is needed\\r\\n lengthAck = messageBody.length / 2;\\r\\n lengthAck = ('0000' + decimalToHex(lengthAck)).slice(-4);\\r\\n lengthAck = lengthAck.toString().substring(2, 4) + lengthAck.toString().substring(0, 2);\\r\\n ////////////checksum CRC 16\\r\\n var checksumAck = byteStringToByteArray(messageBody);\\r\\n checksumAck = crc16byte(checksumAck);\\r\\n checksumAck = decimalToHex(checksumAck);\\r\\n checksumAck = ('0000' + checksumAck).slice(-4);\\r\\n checksumAck = checksumAck.toString().substring(2, 4) + checksumAck.toString().substring(0, 2);\\r\\n prefix = prefix + lengthAck + checksumAck + sequenceID;\\r\\n // To send ACK to the device previous to internal msg with parts\\r\\n if (needsAck == true) {\\r\\n if (messageBody.length <= 2) {\\r\\n ack = 'AB00030008C7' + sequenceID + '7F0100'; // change AB10030008C7 to AB00030008C7\\r\\n } else {\\r\\n ack = prefix + messageBody;\\r\\n }\\r\\n AddValue(codeValues, 'imei', imei);\\r\\n AddValue(codeValues, 'ack', ack);\\r\\n }\\r\\n } else { // checksum was invalid - print out useful debug info and bet quess at imei \\r\\n AddValue(codeValues, \\\"error\\\", \\\"checksum failed for message\\\");\\r\\n AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n i = rawFromBytes.search('3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]');\\r\\n if (i >= 0) {\\r\\n imei = hexToAscii(rawFromBytes.substring(i, i + 30));\\r\\n AddValue(codeValues, \\\"imei\\\", imei);\\r\\n }\\r\\n }\\r\\n }\\r\\n // Auxiliary functions\\r\\n function buildDataToReceiver(codeValues, configsToAck = [], configsToUpdate = [], configsToSend = []) {\\r\\n const dataToReceiver = {\\r\\n values: codeValues\\r\\n };\\r\\n if (configsToAck.length > 0) {\\r\\n dataToReceiver.configsToAck = configsToAck;\\r\\n }\\r\\n if (configsToUpdate.length > 0) {\\r\\n dataToReceiver.configsToUpdate = configsToUpdate;\\r\\n }\\r\\n if (configsToSend.length > 0) {\\r\\n dataToReceiver.configsToSend = configsToSend;\\r\\n }\\r\\n return dataToReceiver;\\r\\n }\\r\\n\\r\\n function AddValue(codeValueArray, p1, p2) { // push code value pair into array\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n codeValueArray.push(cvpair);\\r\\n }\\r\\n // convert functions\\r\\n function asciiToHex(str) { // ascii to hex \\r\\n return [...str].map(char => char.charCodeAt(0).toString(16).padStart(2, '0')).join('');\\r\\n }\\r\\n\\r\\n function byteStringToByteArray(str) { // convierte una cadena hexadecimal en un array de bytes (number[])\\r\\n const bytes = [];\\r\\n for (let i = 0; i < str.length; i += 2) {\\r\\n const byte = parseInt(str.substring(i, i + 2), 16);\\r\\n if (!isNaN(byte) && byte >= 0 && byte <= 255) {\\r\\n bytes.push(byte);\\r\\n }\\r\\n }\\r\\n return bytes;\\r\\n }\\r\\n\\r\\n function decimalToHex(x) {\\r\\n return Number(x).toString(16).toUpperCase();\\r\\n }\\r\\n\\r\\n function hexToBin(hex) { // convierte un valor hexadecimal a su representación binaria, y asegura que tenga al menos 8 bits \\r\\n const bin = parseInt(hex, 16).toString(2);\\r\\n return bin.padStart(hex.length * 4, '0');\\r\\n }\\r\\n\\r\\n function hexToAscii(hex) {\\r\\n if (hex.length % 2 !== 0) {\\r\\n throw new Error(\\\"Hex string length must be even\\\");\\r\\n }\\r\\n let ascii = '';\\r\\n for (let i = 0; i < hex.length; i += 2) {\\r\\n const byte = hex.substr(i, 2);\\r\\n const charCode = parseInt(byte, 16);\\r\\n if (charCode !== 0) { // remove null character (\\\\u0000)\\r\\n ascii += String.fromCharCode(charCode);\\r\\n }\\r\\n }\\r\\n return ascii;\\r\\n //return hex.match(/.{2}/g).map(byte => String.fromCharCode(parseInt(byte, 16))).join('');\\r\\n }\\r\\n\\r\\n function hexToDecimalSigned(hex) { // hex to decimal\\r\\n if (hex.length % 2 !== 0) {\\r\\n hex = '0' + hex;\\r\\n }\\r\\n const num = parseInt(hex, 16);\\r\\n const bits = hex.length * 4;\\r\\n const maxVal = 2 ** bits;\\r\\n return num >= maxVal / 2 ? num - maxVal : num;\\r\\n }\\r\\n\\r\\n function hexToDecimal(hex) {\\r\\n return parseInt(hex, 16);\\r\\n }\\r\\n // CheckSum and debug functions\\r\\n function changeEndianness(hexString) { // changeEndianness\\r\\n if (hexString.length === 0) { //if string is empty or not defined\\r\\n return \\\"\\\";\\r\\n }\\r\\n if (hexString.length % 2 !== 0) {\\r\\n throw new Error(\\\"Hex string length must be even\\\");\\r\\n }\\r\\n return hexString.match(/.{2}/g) // divide in bytes (2 chars)\\r\\n .reverse() // reverse the order\\r\\n .join('');\\r\\n }\\r\\n\\r\\n function calculateCheckSum(payloadData) { // calcula el CRC16 sobre una cadena hexadecimal y devuelve el valor con el endianness invertido\\r\\n const bytes = byteStringToByteArray(payloadData);\\r\\n const crc = crc16byte(bytes);\\r\\n const hex = crc.toString(16).padStart(4, '0').toUpperCase();\\r\\n return changeEndianness(hex);\\r\\n }\\r\\n\\r\\n function crc16byte(byteArray) { // calcula el CRC-16 sobre un array de bytes usando una tabla precalculada (crcTable)\\r\\n let crc = 0x0000;\\r\\n for (const byte of byteArray) {\\r\\n if (byte < 0 || byte > 255 || !Number.isInteger(byte)) {\\r\\n throw new RangeError(\\\"Invalid byte value in input array\\\");\\r\\n }\\r\\n const index = (byte ^ (crc >> 8)) & 0xFF;\\r\\n crc = crcTable[index] ^ (crc << 8);\\r\\n }\\r\\n return crc & 0xFFFF;\\r\\n }\\r\\n\\r\\n function debug(...args) { // write debug info to console log, if localTesting\\r\\n if (localTesting) {\\r\\n console.debug('[DEBUG]', ...args);\\r\\n }\\r\\n }\\r\\n /*\\r\\n function sendMessageToLocalhostNoWait(str) { // sends message to system, closing connection after\\r\\n var server;\\r\\n if (localTesting) {\\r\\n console.log('local testing - sending to protocol-dev server the message ... '); // port 5878\\r\\n console.log(str);\\r\\n server = '52.174.17.77';\\r\\n } else {\\r\\n server = '127.0.0.1';\\r\\n }\\r\\n var c = net.createConnection(5878, server);\\r\\n c.on('error', function(error) {\\r\\n c = net.createConnection(5878, server);\\r\\n });\\r\\n c.write(`${str}`);\\r\\n c.end();\\r\\n }*/\\r\\n function sendMessageToLocalhostNoWait(message) {\\r\\n const server = localTesting ? '52.174.17.77' : '127.0.0.1';\\r\\n //const port = localTesting ? '5878' : ''; //Protocol-dev\\r\\n const port = '5678'; //acceptance-dev\\r\\n if (localTesting) {\\r\\n console.debug('[DEBUG] Sending message to test server:', message);\\r\\n }\\r\\n const client = net.createConnection(port, server, () => {\\r\\n client.write(message);\\r\\n client.end();\\r\\n });\\r\\n client.on('error', (err) => {\\r\\n console.error(`[ERROR] Failed to send message to ${server}:${port}:`, err.message);\\r\\n });\\r\\n client.on('end', () => {\\r\\n if (localTesting) {\\r\\n console.debug('[DEBUG] Connection closed');\\r\\n }\\r\\n });\\r\\n }\\r\\n}\\r\\n// params is not defined locally -> export as module\\r\\nif (typeof(params) === 'undefined') {\\r\\n module.exports = {\\r\\n execute_ops\\r\\n }\\r\\n} else { // on server use local defined vars\\r\\n let return_values = execute_ops(moment, msg, net, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\r\\n // define global returns\\r\\n msg = return_values;\\r\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1751358168},{"Type":1,"NewValue":"{\"Id\":437,\"Name\":\"Access TEC Care Watch\",\"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 // Watch protocol - please see variables and typical values in order below\\n // Watch-CYC;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;SIGNAL=<>;WM=<>;GENERAL=<>\\n // Watch-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\n //\\n // Author: Juanmi Navarro\\n // Created: 01/01/0000\\n // Last modified: 20/05/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', 'Watch');\\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 = (`Watch-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 var allowedCID = ['3036', '06'];\\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 //<>,<>,<> \\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 //<>,<>,<> \\n if (mac2) {\\n AddValue(codeValues, 'beacon_mac', mac2);\\n var simpleQuery2 = [{\\n 'code': 'Mac',\\n 'value': mac2,\\n }];\\n var simpleQueryLabel2 = {\\n 'table': 'beacons',\\n 'select': 'Name',\\n 'query': simpleQuery2\\n };\\n var labels2 = [];\\n labels2.push(JSON.stringify(simpleQueryLabel2));\\n AddValue(codeValues, 'oysta_labels', JSON.stringify(labels2));\\n }\\n if (params.beacon_major) {\\n AddValue(codeValues, 'beacon_major', params.beacon_major);\\n } else {\\n AddValue(codeValues, 'beacon_major', 0);\\n }\\n if (params.beacon_minor) {\\n AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\n } else {\\n AddValue(codeValues, 'beacon_minor', 0);\\n }\\n //AddValue(codeValues,'oysta_labels', label);\\n //AddValue(codeValues,'oysta_value', mac);\\n if (location_time) {\\n AddValue(codeValues, 'location_time', location_time);\\n }\\n }\\n /* meter mas tarde... \\n if (params.smart_data !== 'undefined') {\\n var gen_location = params.smart_data.split(',')\\n var latitude = gen_location[0]\\n var longitude = gen_location[1]\\n var location_accuracy = gen_location[2]\\n var altitude = gen_location[3]\\n AddValue(codeValues,'latitude', latitude);\\n AddValue(codeValues,'longitude', longitude);\\n AddValue(codeValues,'altitude', altitude);\\n AddValue(codeValues,'location_accuracy', location_accuracy);\\n }\\n */\\n /*else if ((params.event_time) && (params.event_time == '')) {\\n var event_time = moment.utc().unix();\\n AddValue(codeValues,'event_time', event_time);\\n } revisar mas adelante*/\\n // to parse SMS info from the device\\n switch (messageTypeLocalCode) {\\n case 'COMM-SMS': // SMS message sent in\\n if (params.data.startsWith('Device location request')) {\\n configsToAck.push(configIds.Controls.RealTimeLocate);\\n } else if (params.data.startsWith('Set IP ok')) {\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\n } else if (params.data.startsWith('IMEI:')) {\\n configsToAck.push(configIds.Controls.GetFirmwareVersion);\\n } else if (params.data.startsWith('Set IP ok')) {\\n configsToAck.push(configIds.Controls.ClearBufferedMessages);\\n } else if (params.data.startsWith('flush ok')) {\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\n } else if (params.data.startsWith('Set Watch-')) {\\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 = (`Watch-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 = (`Watch;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 = (`Watch;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 = (`Watch-RTL;${params.imei};${location_time};${location_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n break;\\n }\\n if (!params.event_time && !event_time) { // if params.event_time undefined - set it to now. \\n var event_time = moment.utc().unix();\\n AddValue(codeValues, 'event_time', event_time);\\n }\\n // if (!params.location_time && !location_time) { // if params.location_time undefined - set it to now. \\n // var location_time = moment.utc().unix();\\n // AddValue(codeValues, 'location_time', location_time);\\n //}\\n }\\n // send data msg to kibana\\n const data = buildDataToReceiver(codeValues, configsToAck, configsToUpdate, configsToSend);\\n console.log(data);\\n return data\\n // end of main operation\\n // define functions used in operation\\n // decode global msg\\n function decoder(str) { // decode rawdata\\n // CARE Decoder\\n AddValue(codeValues, 'Message : ', str);\\n var message = str;\\n // need to check if checksum is correct for possible msg corruption 10/03/23\\n var checksum = message.substring(8, 12);\\n var messageBody = message.substring(16, message.length);\\n debug('message =' + message);\\n debug('checksum =' + checksum);\\n debug('calculateCheckSum =' + calculateCheckSum(messageBody));\\n if (calculateCheckSum(messageBody) == checksum) { // payload is valid\\n debug(\\\"message has valid checksum\\\");\\n var messageBody = command; // update value for the ACK\\n debug('command =' + command);\\n if (command == '01') {\\n while (index < total_length + 16) {\\n var keyLengthHex = message.substring(index, index = index + 2);\\n var keyLength = 2 * hexToDecimal(keyLengthHex);\\n var key = message.substring(index, index = index + 2);\\n var value = message.substring(index, index = index + keyLength - 2);\\n debug('key = ' + key);\\n debug('value = ' + value);\\n switch (key) {\\n //Device ID\\n case '01':\\n var imei = hexToAscii(value);\\n // create long connection if it is needed\\n if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\n //no 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\\n if ((alarmCodeExtInt & 1) == 1) {\\n var alarm = 'ALF-C';\\n }\\n // Welfare Check-out\\n else if ((alarmCodeExtInt & 2) == 2) {\\n var alarm = 'ALA-C';\\n }\\n // Standard Alerts\\n //Battery low\\n else if ((alarmCodeInt & 1) == 1) {\\n var alarm = 'BATL';\\n }\\n //Overspeed\\n else if ((alarmCodeInt & 2) == 2) {\\n var alarm = 'ALSP';\\n }\\n //Fall\\n else if ((alarmCodeInt & 4) == 4) {\\n var alarm = 'ALF';\\n }\\n //Tilt\\n else if ((alarmCodeInt & 8) == 8) {\\n var alarm = 'Tilt';\\n } else if ((alarmCodeInt & 16) == 16) {\\n if ((alarmCodeInt & 16777216) == 16777216) {\\n var alarm = 'Geo1-IN';\\n } else {\\n var alarm = 'Geo1-OUT';\\n }\\n } else if ((alarmCodeInt & 32) == 32) {\\n if ((alarmCodeInt & 33554432) == 33554432) {\\n var alarm = 'Geo2-IN';\\n } else {\\n var alarm = 'Geo2-OUT';\\n }\\n } else if ((alarmCodeInt & 64) == 64) {\\n if ((alarmCodeInt & 67108864) == 67108864) {\\n var alarm = 'Geo3-IN';\\n } else {\\n var alarm = 'Geo3-OUT';\\n }\\n } else if ((alarmCodeInt & 128) == 128) {\\n if ((alarmCodeInt & 134217728) == 134217728) {\\n var alarm = 'Geo4-IN';\\n } else {\\n var alarm = 'Geo4-OUT';\\n }\\n }\\n //Power Off\\n else if ((alarmCodeInt & 256) == 256) {\\n var alarm = 'PWRF';\\n }\\n //Power On\\n else if ((alarmCodeInt & 512) == 512) {\\n var alarm = 'PWRN';\\n }\\n //Motion\\n else if ((alarmCodeInt & 1024) == 1024) {\\n var alarm = 'ALMOV';\\n }\\n //No Motion\\n else if ((alarmCodeInt & 2048) == 2048) {\\n var alarm = 'ALNM';\\n }\\n //SOS\\n else if ((alarmCodeInt & 4096) == 4096) {\\n var alarm = 'ALSOS';\\n } else if ((alarmCodeInt & 8192) == 8192) {\\n var alarm = 'Side1';\\n } else if ((alarmCodeInt & 16384) == 16384) {\\n var alarm = 'Side2';\\n }\\n //Battery charging\\n else if ((alarmCodeInt & 32768) == 32768) {\\n var alarm = 'BATCN';\\n }\\n //Battery no charging\\n else if ((alarmCodeInt & 65536) == 65536) {\\n var alarm = 'BATCF';\\n }\\n //SOS Ending\\n // Temporary Commented until we know exactly how it works. 22/09/2022\\n else if ((alarmCodeInt & 131072) == 131072) {\\n var alarm = 'SOSEnding';\\n info = 'Alarm Finished';\\n }\\n //Amber Alert EC03 only\\n else if ((alarmCodeInt & 262144) == 262144) {\\n var alarm = 'ALAO';\\n }\\n // welfare Alert check-in ALA-O\\n else if ((alarmCodeInt & 524288) == 524288) {\\n var alarm = 'ALA-O';\\n }\\n // Amber alert Ending ALA-C\\n else if ((alarmCodeInt & 1048576) == 1048576) {\\n var alarm = 'ALA-C';\\n }\\n // Amber alert Ending ALA-C\\n //else if ((alarmCodeInt & 1048576) == 1048576) {\\n // var alarm = 'ALA-C';\\n //}\\n // Fall-Down Alert ending\\n else if ((alarmCodeInt & 2097152) == 2097152) {\\n var alarm = 'ALF-C';\\n }\\n // welfare Alert Ending ALA\\n else if ((alarmCodeInt & 4194304) == 4194304) {\\n var alarm = 'ALA';\\n }\\n // Beacon absent Alert 11/10/22. Need to be added in msg types\\n //else if ((alarmCodeInt & 16777216) == 16777216) {\\n // var alarm = 'BEA';\\n //}\\n general += 'alarm:' + alarm + ',';\\n break;\\n //Custom ID\\n case '03':\\n customID = value;\\n if (!allowedCID.includes(value)) {\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\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 //no 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 //<>,<>,<>,<>,<>\\n gps_data = `${latitude},${longitude},${location_accuracy},${speed},${direction},${altitude},${satellites},${mileage}`;\\n general += 'gps location (lat):' + latitude + ', (long):' + longitude + ',';\\n break;\\n //WIFI Towers\\n case '22':\\n location_type = 'WIFI';\\n var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\n //location_time = timestamp;\\n var wifiTowers = value;\\n general += 'wifiTowers:';\\n var indexWifi = 0;\\n var bssid_array = [];\\n wifi_data = '';\\n for (let i = 0; i < numWifi; i++) {\\n wifi_data += hexToDecimalSigned(wifiTowers.substring(indexWifi, indexWifi + 2)) + ',' + wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\n indexWifi += 14;\\n }\\n wifi_data = wifi_data.slice(0, -1);\\n general += wifi_data;\\n break;\\n //BLE Location Added 10/10/22\\n case '23':\\n location_type = 'BLE';\\n var mac = value.substring(0, 12);\\n var latitudeHex = value.substring(12, 20);\\n var longitudeHex = value.substring(20, 28);\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n var address = hexToAscii(value.substring(28, value.length));\\n var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\n // add : format in MAC\\n mac = mac.match(/.{1,2}/g).join(':');\\n // location_time = timestamp;\\n ble_data = `${latitude},${longitude},${mac},${address}`;\\n general += 'BLE location (lat):' + latitude + ', (long):' + longitude + ',';\\n break;\\n //General Data , status_data\\n case '24':\\n if (!allowedCID.includes(customID)) {\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n AddValue(codeValues, \\\"customID\\\", customID);\\n return\\n }\\n if (alarmCode) {\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\n }\\n //else {\\n // messageForReceiver = (`CareWatch-CYC;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};`);\\n //}\\n // reset variables\\n //alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\n var timestampHex = value.substring(0, 8);\\n timestampHex = changeEndianness(timestampHex);\\n timestamp = hexToDecimal(timestampHex);\\n location_time = timestamp;\\n event_time = timestamp;\\n // HardCode to fix possible issue in protocol\\n //event_time = moment.utc().unix();\\n // end of hard code\\n var statusHex = changeEndianness(value.substring(8, 16));\\n var statusInt = hexToDecimal(statusHex);\\n var statusDevice = '';\\n if ((statusInt & 1) == 1) {\\n statusDevice += 'GPS,';\\n }\\n if ((statusInt & 2) == 2) {\\n statusDevice += 'WIFISource,';\\n }\\n if ((statusInt & 4) == 4) {\\n statusDevice += 'CellTower,';\\n }\\n if ((statusInt & 8) == 8) {\\n statusDevice += 'BLELocation,';\\n }\\n //params.BatteryStatus.BatteryStatus = '1';\\n if ((statusInt & 16) == 16) {\\n statusDevice += 'Charging,';\\n // var alarm = 'BATCN';\\n //configs.BatteryStatus.BatteryStatus = '1';\\n /* if (configs.BatteryStatus.BatteryStatus !== '1') {\\n hasConfigs = true;\\n var batteryStatus = '1';\\n var alarm = 'BATCN';\\n let configsToUpdate = [];\\n configsToUpdate.push({\\n 'code': configIds.BatteryStatus.BatteryStatus,\\n 'value': batteryStatus\\n });\\n }*/\\n }\\n if ((statusInt & 32) == 32) {\\n statusDevice += 'FUllyCharged,';\\n //var alarm = 'BATF';\\n // configs.BatteryStatus.BatteryStatus = '3';\\n /* if (configs.BatteryStatus.BatteryStatus !== '3') {\\n hasConfigs = true;\\n var batteryStatus = '3';\\n var alarm = 'BATF';\\n let configsToUpdate = [];\\n configsToUpdate.push({\\n 'code': configIds.BatteryStatus.BatteryStatus,\\n 'value': batteryStatus\\n });\\n }*/\\n }\\n /* if (!((statusInt & 32) == 32) & !((statusInt & 16) == 16)) {\\n statusDevice += 'Not Charging,';\\n var alarm = 'BATCF';\\n //configs.BatteryStatus.BatteryStatus = '2';\\n if (configs.BatteryStatus.BatteryStatus !== '2') {\\n var batteryStatus = '2';\\n var alarm = 'BATCF';\\n let configsToUpdate = [];\\n configsToUpdate.push({\\n 'code': configIds.BatteryStatus.BatteryStatus,\\n 'value': batteryStatus\\n });\\n }\\n }*/\\n if ((statusInt & 64) == 64) {\\n statusDevice += 'Reboot,';\\n }\\n if ((statusInt & 128) == 128) {\\n statusDevice += 'HistoricalData,';\\n }\\n if ((statusInt & 256) == 256) {\\n statusDevice += 'AGPSDataValid,';\\n }\\n if ((statusInt & 512) == 512) {\\n statusDevice += 'Motion,';\\n }\\n if ((statusInt & 1024) == 1024) {\\n statusDevice += 'SmartLocating,';\\n }\\n if ((statusInt & 2048) == 2048) { //isHome\\n statusDevice += 'BeaconLocation,';\\n }\\n if ((statusInt & 4096) == 4096) {\\n statusDevice += 'BLEConnected,';\\n }\\n if ((statusInt & 16384) == 16384) {\\n statusDevice += 'HomeWiFi,';\\n }\\n statusDevice = statusDevice.slice(0, -1);\\n status_data = statusDevice; //to oysta template\\n //statusHex = (statusHex);\\n statusHex = hexToBin(statusHex);\\n statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\n battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\n cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\n workMode = parseInt(statusHex.substring(13, 16), 2);\\n general += 'statusDevice:' + statusDevice + ',';\\n if (battery_percentage) {\\n general += 'battery:' + battery_percentage + ',';\\n }\\n if (cellNetworkSignal) {\\n general += 'cellNetworkSignal:' + cellNetworkSignal + ',';\\n }\\n if (workMode) {\\n general += 'workMode:' + workMode + ',';\\n }\\n //messageForReceiver = (`CareWatch-CYC;${imei};${i};${event_time};${battery_percentage}`);\\n break;\\n //Call Records\\n case '25':\\n //Needed?\\n break;\\n //BLE Location 2\\n case '26':\\n //I don't understand\\n //messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n //Smart Location\\n case '27':\\n location_type = 'SMART';\\n var latitudeHex = value.substring(0, 8);\\n var longitudeHex = value.substring(8, 16);\\n var location_accuracyHex = value.substring(16, 20);\\n var altitudeHex = value.substring(20, 24);\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n var altitude = hexToDecimal(changeEndianness(altitudeHex));\\n //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\n //04/08/2022 se quita el multiplicador por 5 pq ya viene el valor en metros\\n location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\n //location_time = timestamp;\\n smart_data = `${latitude},${longitude},${location_accuracy},${altitude}`;\\n general += 'smart location (lat):' + latitude + ', (long):' + longitude + ',';\\n break;\\n //Beacon Location Added 11/10/22\\n case '28':\\n location_type = 'BEACON';\\n // var alarm = 'EBZI';\\n var latitudeHex = '00';\\n var longitudeHex = '00';\\n var descr = 'empty';\\n var flag = hexToDecimal(value.substring(0, 1));\\n var beacId = hexToDecimal(value.substring(1, 2));\\n // msg includes descrip\\n if ((flag & 4) == 4) {\\n descr = hexToAscii(value.substring(18, value.length));\\n }\\n // msg includes lat/lon\\n if ((flag & 8) == 8) {\\n latitudeHex = value.substring(18, 26);\\n longitudeHex = value.substring(26, 34);\\n }\\n // msg includes lat/lon and description\\n if ((flag & 12) == 12) {\\n latitudeHex = value.substring(18, 26);\\n longitudeHex = value.substring(26, 34);\\n descr = hexToAscii(value.substring(34, value.length));\\n }\\n var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\n // add : format in MAC\\n mac = mac.match(/.{1,2}/g).join(':');\\n var rssiHex = value.substring(14, 16);\\n var rssi1Hex = value.substring(16, 18);\\n rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\n rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\n // var latitudeHex = value.substring(18, 26);\\n // var longitudeHex = value.substring(26, 34);\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n //location_time = timestamp;\\n beacon_data = `${latitude},${longitude},${mac},${descr}`;\\n general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (listIndex):' + beacId + ',';\\n break;\\n // Beacon V2\\n case '2C':\\n location_type = 'BEACON';\\n // var alarm = 'EBZI';\\n var latitudeHex = '00';\\n var longitudeHex = '00';\\n var descr = 'empty';\\n var flag = hexToDecimal(value.substring(0, 1));\\n var beacId = hexToDecimal(value.substring(1, 2));\\n // msg includes descrip\\n if ((flag & 4) == 4) {\\n let desc_leng = hexToDecimal(value.substring(20, 22));\\n descr = hexToAscii(value.substring(22, 22 + (2 * desc_leng)));\\n //descr = hexToAscii(value.substring(18, value.length));\\n }\\n // msg includes lat/lon\\n if ((flag & 8) == 8) {\\n latitudeHex = value.substring(18, 26);\\n longitudeHex = value.substring(26, 34);\\n }\\n // msg includes lat/lon and description\\n if ((flag & 12) == 12) {\\n latitudeHex = value.substring(20, 28);\\n longitudeHex = value.substring(28, 36);\\n let desc_leng = hexToDecimal(value.substring(36, 38));\\n descr = hexToAscii(value.substring(38, 38 + (2 * desc_leng)));\\n }\\n var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\n // add : format in MAC\\n mac = mac.match(/.{1,2}/g).join(':');\\n var rssiHex = value.substring(14, 16);\\n var rssi1Hex = value.substring(16, 18);\\n rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\n rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\n var battery_beacon = hexToDecimal(value.substring(18, 20));\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n //location_time = timestamp;\\n beacon_data = `${latitude},${longitude},${mac},${descr}`;\\n general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (battery):' + battery_beacon + ', (listIndex):' + beacId + ',';\\n break;\\n //Cell Towers Note\\n case '29':\\n location_type = 'LBS';\\n lbs_data = '';\\n var mccHex = changeEndianness(value.substring(0, 4));\\n var mncHex = value.substring(4, 6);\\n var mcc = hexToDecimal(mccHex);\\n lbs_data += mcc + ',';\\n var mnc = hexToDecimal(mncHex);\\n lbs_data += mnc + ',';\\n var indexLbs = 6;\\n var numTowers = (hexToDecimal(keyLengthHex) - 4) / 7;\\n for (let i = 0; i < numTowers; i++) {\\n var rxlHex = changeEndianness(value.substring(indexLbs, indexLbs + 2));\\n var rxl = hexToDecimal(rxlHex);\\n var lacHex = changeEndianness(value.substring(indexLbs + 2, indexLbs + 6));\\n var lac = hexToDecimal(lacHex);\\n var cellTowers = hexToDecimal(changeEndianness(value.substring(indexLbs + 6, indexLbs + 14)));\\n lbs_data += rxl + ',' + lac + ',' + cellTowers + ',';\\n indexLbs += 14;\\n }\\n lbs_data = lbs_data.slice(0, -1);\\n general += lbs_data;\\n break;\\n case '30':\\n //G-sensor.\\n 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 = (`Watch-${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 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 = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n }\\n break;\\n //BLE Connected . For Flic button\\n case '62':\\n location_type = 'BLE';\\n //var alarm = 'EBZI'; \\n //var latitudeHex = '00';\\n //var longitudeHex = '00';\\n //var descr = 'empty';\\n var flag = hexToDecimal(value.substring(0, 2)); // 0= Disconnected, 1= Connected\\n var mac = value.substring(2, 14); // No hace falta darle la vuelta\\n // add : format in MAC\\n mac = mac.match(/.{1,2}/g).join(':');\\n var batLevel = hexToDecimal(value.substring(14, 16)); // 0-100\\n //location_time = timestamp;\\n ble_data = `${flag},${batLevel},${mac}`;\\n general += 'BLE location (State):' + flag + ', (bat):' + batLevel + ', (mac):' + mac + ',';\\n break;\\n }\\n }\\n if (alarmCode) {\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};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 = (`Watch;ACK-FIRM;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\n //AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\n configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\n //configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\n //messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n case '1A':\\n //no ACK need\\n var fwVersion = hexToAscii(value);\\n imei = serverParams.Imei;\\n AddValue(codeValues, \\\"imei\\\", imei);\\n AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\n messageForReceiver = (`Watch;ACK-FIRM;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\n //AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\n configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\n //configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\n break;\\n //IMEI\\n case '03':\\n var imei = hexToDecimal(value);\\n // harcode to avoid conflicts with Rio protocol\\n //if ((imei != '860470063029395') && (imei != '860470063035947')) {\\n // AddValue(codeValues, \\\"error\\\", \\\"device imei is not in this protocol\\\");\\n // AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n //AddValue(codeValues, \\\"IMEI\\\", imei);\\n // return\\n //}\\n if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\n //return;\\n }\\n messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n //ICCID\\n case '04':\\n var iccid = hexToDecimal(value);\\n messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n //BLE-MAC\\n case '05':\\n var bleMac = hexToDecimal(value);\\n messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n //Run Time\\n case '07':\\n var runTime = hexToDecimal(value);\\n messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n case '10': // Ringer Volume\\n var volume = hexToDecimal(value);\\n imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-VOL;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"Volume\\\", volume);\\n AddValue(configsToUpdate, configIds.ReadSystemSettings.Volume, volume);\\n configsToAck.push(configIds.ReadSystemSettings.Volume);\\n break;\\n case '0A': //Performance mode\\n //var workMode = hexToDecimal(value);\\n //messageBody = messageBody + keyLengthHex + key + value;\\n //AddValue(codeValues, \\\"WorkMode\\\", workMode);\\n //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\n //configsToAck.push(configIds.ReadPerformance`Settings.Mode);\\n //var workMode = hexToAscii(value.substring(0, value.length));\\n //var workMode = hexToDecimal(value);\\n //var workMode = hexToAscii(value.substring(0, value.length));\\n var workMode = 1234; // + value + \\\"end\\\";\\n //var workModeVal = 9;\\n //workMode = 'test10';\\n imei = serverParams.Imei;\\n messageForReceiver = (`Watch;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 '0F': // Enable control.... Used for STEP COUNTING SETTINGS\\n // 'FF FF 21 80'\\n var StepStatus = hexToBin(value.substring(4, 6));\\n var enalbleDisable = '';\\n if (StepStatus.substring(7, 8) == '1') {\\n var step = 'Enable, '\\n enalbleDisable = '1'\\n } else {\\n var step = 'Disable, '\\n };\\n //var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\n //hrate += detectingInterval;\\n AddValue(codeValues, \\\"step\\\", step);\\n //var imei = serverParams.Imei;\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(configsToUpdate, configIds.ReadStepsSettings.EnableDisableReadStepsSettings, enalbleDisable);\\n //AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\n configsToAck.push(configIds.ReadStepsSettings.EnableDisableReadStepsSettings);\\n //configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\n break;\\n case '1B':\\n //Decimal o ascii?\\n var gsmModule = hexToDecimal(value);\\n messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n case '1F':\\n //System Language\\n var systemLanguage = hexToAscii(value.substring(0, value.length));\\n imei = serverParams.Imei;\\n //messageBody = messageBody + keyLengthHex + key + value;\\n messageForReceiver = (`Watch;ACK-LANG;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"SystemLanguage\\\", systemLanguage);\\n AddValue(configsToUpdate, configIds.ReadSystemSettings.SystemLanguage, systemLanguage);\\n configsToAck.push(configIds.ReadSystemSettings.SystemLanguage);\\n break;\\n case '33': // phone option\\n // [Value]:83 0B 00 00 {\\\"phoneOption\\\":{\\\"flag_value\\\":2947,\\\"s3\\\":1,\\\"s4\\\":0,\\\"s5\\\":1,\\\"s6\\\":0,\\\"callIncoming\\\":0,\\\"rings\\\":3,\\\"s7\\\":0,\\\"toneID\\\":0,\\\"s1\\\":1,\\\"s2\\\":1}}\\n var statusPhone = hexToBin(value.substring(0, 2)); // To find autoanswer setup\\n if (statusPhone.substring(0, 1) == '1') { // 1 Enable\\n var auto = 'true';\\n } else var auto = 'false';\\n statusPhone = hexToBin(value.substring(2, 4)); // To find allow list setup\\n if (statusPhone.substring(7, 8) == '1') { // 1 Enable\\n allow = 'true';\\n } else var allow = 'false';\\n //statusPhone = hexToBin(value.substring(0, 2)) + hexToBin(value.substring(2, 4));\\n //AddValue(configsToUpdate, configIds.ReadSystemSettings.Statusphone, statusPhone);\\n AddValue(configsToUpdate, configIds.ReadSystemSettings.AllowList, allow);\\n AddValue(configsToUpdate, configIds.ReadSystemSettings.AutoAnswer, auto);\\n //configsToAck.push(configIds.ReadSystemSettings.Statusphone);\\n configsToAck.push(configIds.ReadSystemSettings.AllowList);\\n configsToAck.push(configIds.ReadSystemSettings.AutoAnswer);\\n break;\\n case '34': //ContactList with name\\n var contactNumber = value.substring(1, 2);\\n var telLength = hexToDecimal(value.substring(2, 4));\\n var tel = '';\\n switch (contactNumber) {\\n // Emergency Number\\n case '0':\\n tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\n AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\n AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\n configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\n break;\\n // Speed Dial Number\\n //case '1':\\n // tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\n // AddValue(codeValues, \\\"SpeedDialNumber\\\", tel);\\n // AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.SpeedDialNumber, tel);\\n // configsToAck.push(configIds.ReadSpeedDialSettings.SpeedDialNumber);\\n // break;\\n // Gateway Number\\n case '9': //00447781482635,Esendex UK 0034627177148,Esendex Spain 00447507288240,Esendex UK Acceptance\\n tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\n if (tel.includes('447781482635') || tel.includes('00447781482635')) {\\n tel = 'Esendex UK'\\n } else if (tel.includes('34627177148') || tel.includes('0034627177148')) {\\n tel = 'Esendex Spain'\\n } else if (tel.includes('447507288240') || tel.includes('00447507288240')) {\\n tel = 'Esendex UK Acceptance'\\n } else {\\n tel = 'Default'\\n }\\n AddValue(codeValues, \\\"SMSGateway\\\", tel);\\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\n configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\n break;\\n default:\\n tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\n if (tel.length < 6) {\\n contacts += '';\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\n break;\\n }\\n //contacts += 'A' + (contactNumber - 1) + ': ' + tel + ', ';\\n contacts += tel + ', ';\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\n break;\\n }\\n break;\\n case '40': // APN\\n //no ACK need\\n AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'));\\n configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\n var apn = hexToAscii(value.substring(0, value.length));\\n imei = serverParams.Imei;\\n break;\\n case '41': // APN Username\\n //no ACK need\\n //apn = apn + ',' + hexToAscii(value.substring(0, value.length));\\n break;\\n case '42': // APN Password\\n //no ACK need\\n //apn = apn + ',' + hexToAscii(value.substring(0, value.length));\\n messageForReceiver = (`Watch;ACK-GDATA;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"apn\\\", apn);\\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.APN, apn);\\n configsToAck.push(configIds.ReadCommunicationSettings.APN);\\n break;\\n case '43': //Server Details\\n //52.232.85.255,5678 production 52.174.17.77,5678 acceptance\\n var serverDetails = hexToAscii(value.substring(6, value.length)) + ':' + hexToDecimal(value.substring(4, 6) + value.substring(2, 4));\\n if (serverDetails.includes('52.232.85.255:5678')) {\\n serverDetails = 'Production'\\n } else if (serverDetails.includes('52.174.17.77:5678')) {\\n serverDetails = 'Acceptance'\\n } else if (serverDetails.includes('52.174.17.77:5778')) {\\n serverDetails = 'Protocol-Import'\\n } else if (serverDetails.includes('52.174.17.77:5878')) {\\n serverDetails = 'Protocol-Dev'\\n } else {\\n serverDetails = 'Default'\\n }\\n AddValue(codeValues, \\\"server\\\", serverDetails);\\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.Server, serverDetails);\\n configsToAck.push(configIds.ReadCommunicationSettings.Server);\\n break;\\n case '44': //time interval - work mode intervals\\n imei = serverParams.Imei;\\n messageForReceiver = (`Watch;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 '46': //HeartRate\\n // '10 0E 00 80'\\n var HeartRateStatus = hexToBin(value.substring(6, 8));\\n var enalbleDisable = '';\\n if (HeartRateStatus.substring(0, 1) == '1') {\\n var hrate = 'Enable, '\\n enalbleDisable = '1'\\n } else {\\n var hrate = 'Disable, '\\n };\\n var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\n hrate += detectingInterval;\\n AddValue(codeValues, \\\"hrate\\\", hrate);\\n //var imei = serverParams.Imei;\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings, enalbleDisable);\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\n configsToAck.push(configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings);\\n configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\n break;\\n case '47': // Custom Id\\n imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-CUSTID;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"customeid\\\", value);\\n AddValue(configsToUpdate, configIds.ReadState.CustomId, hexToAscii(value)); //now it comes \\\"3036\\\"\\n configsToAck.push(configIds.ReadState.CustomId);\\n break;\\n case '53': // Non motion alert\\n //2B020080\\n var status = hexToBin(value.substring(6, 8));\\n var alertSetting = '';\\n var enableDisable = '';\\n if (status.substring(0, 1) == '1') {\\n alertSetting = 'Enable, '\\n enableDisable = '1';\\n } else {\\n alertSetting = 'Disable, '\\n };\\n //if (status.substring(5, 6) == '1') {\\n // alertSetting += 'Dial, '\\n //} else {\\n // alertSetting += 'No Dial, '\\n //};\\n var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\n alertSetting += time;\\n imei = serverParams.Imei;\\n // commented until Eview fixes this function\\n /*\\n messageForReceiver = (`Watch;ACK-NOMOTION;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"nomotion\\\", alertSetting);\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings, enableDisable);\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\n configsToAck.push(configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings);\\n configsToAck.push(configIds.ReadNonMovementSettings.Time);\\n */\\n break;\\n case '56': //Fall down sensibility\\n // '00001100'\\n var fallStatus = hexToBin(value.substring(0, 2));\\n var enalbleDisable = '';\\n //if (fallStatus.substring(4, 5) == '1') {\\n if (fallStatus.substring(0, 1) == '1') {\\n var sensibility = 'Enable, '\\n enalbleDisable = '1'\\n } else {\\n var sensibility = 'Disable, '\\n };\\n if (fallStatus.substring(5, 6) == '1') {\\n sensibility += 'Dial, '\\n } else {\\n sensibility += 'No Dial, '\\n };\\n var imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-FALLALERT;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n var sesibityOptionValue = hexToDecimal(value.substring(1, 2));\\n sensibility += sesibityOptionValue;\\n AddValue(codeValues, \\\"sensibility\\\", sensibility);\\n //AddValue(configsToUpdate, configIds.ReadAlertSettings.FallSettings, sensibility);\\n AddValue(configsToUpdate, configIds.ReadFallSettings.EnableDisableFallSettings, enalbleDisable);\\n AddValue(configsToUpdate, configIds.ReadFallSettings.Sensitivity, sesibityOptionValue);\\n //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\n configsToAck.push(configIds.ReadFallSettings.EnableDisableFallSettings);\\n configsToAck.push(configIds.ReadFallSettings.Sensitivity);\\n break;\\n case '73': //BeaconList\\n var beaconNumber = hexToDecimal(value.substring(1, 2));\\n var beaconStatus = hexToBin(value.substring(0, 1));\\n beaconStatus = hexToAscii(value.substring(30, value.length));\\n //beaconStatus = changeEndianness(value.substring(30, value.length));\\n //homeBeacon += 'B' + (beaconNumber + 1) + ': ' + beaconStatus + ', ';\\n homeBeacon += beaconStatus + ', ';\\n AddValue(codeValues, \\\"homeBeacon\\\", homeBeacon);\\n messageForReceiver = (`Watch;ACK-GDATA;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\n configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\n break;\\n case '4A': //Wifi Network List\\n var wifiSSIDLenght = hexToDecimal(value.substring(2, 4));\\n var wifiPasswordLenght = hexToDecimal(value.substring(4, 6));\\n var wifiIndex = hexToDecimal(value.substring(1, 2));\\n //var wifiStatus = hexToDecimal(value.substring(0, 1));\\n var wifiStatus = value.substring(0, 1);\\n /*var enalbleDisable = wifiSSID = wifiPassword = homeWifi = '';\\n /var homeWifi = '';\\n if (wifiIndex == '0') { // Only first Wifi of the list\\n if (wifiStatus == '8') {\\n homeWifi += ' Enable, '\\n enalbleDisable = '1';\\n } else {\\n homeWifi += ' Disable, '\\n //enalbleDisable = '0';\\n };*/\\n if ((wifiStatus == '8') || (wifiStatus == 'C')) { // 8 == ON OR C== ON and Connected\\n var wifiSSID = hexToAscii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\n var wifiPassword = hexToAscii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\n var imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-WIFI;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n //homeWiFi += 'W' + (wifiIndex + 1) + ': ' + wifiSSID + ', ' + wifiPassword + ';';\\n homeWiFi += wifiSSID + ', ' + wifiPassword + ';';\\n AddValue(codeValues, \\\"wifi\\\", homeWiFi);\\n AddValue(configsToUpdate, configIds.ReadWiFiList.WiFiList, homeWiFi);\\n configsToAck.push(configIds.ReadWiFiList.WiFiList);\\n }\\n //AddValue(configsToUpdate, configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings, enalbleDisable);\\n //AddValue(configsToUpdate, configIds.ReadWiFiSettings.SSID, wifiSSID);\\n //AddValue(configsToUpdate, configIds.ReadWiFiSettings.Password, wifiPassword);\\n //configsToAck.push(configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings);\\n //configsToAck.push(configIds.ReadWiFiSettings.SSID);\\n //configsToAck.push(configIds.ReadWiFiSettings.Password);\\n break;\\n case '21': // Speed Dial Settings\\n // [Value]:53 84 {\\\"call1Button\\\":{\\\"mode\\\":0,\\\"feedBack\\\":3,\\\"task\\\":2,\\\"time\\\":20,\\\"status\\\":1}}\\n var status = hexToBin(value.substring(2, 4)); //always pass 2 HEXs to this function\\n var alertSetting = '';\\n var enalbleDisable = '';\\n if (status.substring(0, 1) == '1') {\\n alertSetting = 'Enable, '\\n enalbleDisable = '1'\\n } else {\\n alertSetting = 'Disable, '\\n //enableDisable = '0';\\n };\\n //var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\n //alertSetting += time;\\n imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-SPEED;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"speed\\\", alertSetting);\\n AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\n configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\n break;\\n }\\n }\\n }\\n if (command == '03') {\\n while (index < total_length + 16) {\\n var keyLengthHex = message.substring(index, index = index + 2);\\n var keyLength = 2 * hexToDecimal(keyLengthHex);\\n var key = message.substring(index, index = index + 2);\\n var value = message.substring(index, index = index + keyLength - 2);\\n debug('key = ' + key);\\n debug('value = ' + value);\\n switch (key) {\\n case '01': // Device ID\\n var imei = hexToAscii(value);\\n // create long connection if it is needed\\n if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\n //return;\\n }\\n break;\\n case '10': // Heartbeat\\n var heartbeat = hexToAscii(value);\\n event_time = moment.utc().unix();\\n if (index < total_length + 16) {\\n var keyLengthHex = message.substring(index, index = index + 2);\\n keyLength = 2 * hexToDecimal(keyLengthHex);\\n key = message.substring(index, index = index + 2);\\n if (key == '24') {\\n // debug('key: ' + key) //comment those out\\n value = message.substring(index, index = index + keyLength - 2);\\n // debug(value)\\n var timestampHex = value.substring(0, 8);\\n // debug('timestampt hex: ' + timestampHex)\\n timestampHex = changeEndianness(timestampHex);\\n timestamp = hexToDecimal(timestampHex);\\n event_time = timestamp;\\n // debug(event_time)\\n var statusHex = changeEndianness(value.substring(8, 16));\\n // debug(statusHex)\\n var statusInt = hexToDecimal(statusHex);\\n var statusDevice = '';\\n if ((statusInt & 1) == 1) {\\n statusDevice += 'GPS,';\\n }\\n if ((statusInt & 2) == 2) {\\n statusDevice += 'WIFISource,';\\n }\\n if ((statusInt & 4) == 4) {\\n statusDevice += 'CellTower,';\\n }\\n if ((statusInt & 8) == 8) {\\n statusDevice += 'BLELocation,';\\n }\\n if ((statusInt & 16) == 16) {\\n statusDevice += 'Charging,';\\n }\\n if ((statusInt & 32) == 32) {\\n statusDevice += 'FUllyCharged,';\\n }\\n if ((statusInt & 64) == 64) {\\n statusDevice += 'Reboot,';\\n }\\n if ((statusInt & 128) == 128) {\\n statusDevice += 'HistoricalData,';\\n }\\n if ((statusInt & 256) == 256) {\\n statusDevice += 'AGPSDataValid,';\\n }\\n if ((statusInt & 512) == 512) {\\n statusDevice += 'Motion,';\\n }\\n if ((statusInt & 1024) == 1024) {\\n statusDevice += 'SmartLocating,';\\n }\\n if ((statusInt & 2048) == 2048) {\\n statusDevice += 'BeaconLocation,';\\n }\\n if ((statusInt & 4096) == 4096) {\\n statusDevice += 'BLEConnected,';\\n }\\n statusDevice = statusDevice.slice(0, -1);\\n // debug('statusHex:' + statusHex)\\n statusHex = (statusHex);\\n statusHex = hexToBin(statusHex);\\n statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\n // debug(statusHex)\\n battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\n // debug(battery_percentage)\\n // debug(battery_percentage)\\n // debug(statusHex.substring(8, 13))\\n cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\n // debug(cellNetworkSignal)\\n workMode = parseInt(statusHex.substring(13, 16), 2);\\n // debug(workMode)\\n general += 'statusDevice:' + statusDevice + ';';\\n if (battery_percentage) {\\n general += 'battery:' + battery_percentage + ';';\\n }\\n if (cellNetworkSignal) {\\n general += 'cellNetworkSignal:' + cellNetworkSignal + ';';\\n }\\n if (workMode) {\\n general += 'workMode:' + workMode + ';';\\n }\\n }\\n }\\n // revisar\\n var gen_location = '0';\\n messageForReceiver = (`Watch-HTB;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n //messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n case '12': // Device requesting timestamp\\n timestamp = moment.utc().unix();\\n timestampHex = decimalToHex(timestamp);\\n timestampHex = changeEndianness(timestampHex);\\n keyLengthHex = ('00' + decimalToHex(1 + (timestampHex.length) / 2)).slice(-2);\\n // respond to device with the timestamp of the server\\n messageBody = messageBody + keyLengthHex + key + timestampHex;\\n messageForReceiver = `Eview;${imei};${sequenceID};Get timestamp`;\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n break;\\n case '21': //Cell Towers\\n var mccHex = value.substring(0, 2);\\n var mncHex = value.substring(2, 3);\\n var mcc = hexToDecimal(mccHex);\\n var mnc = hexToDecimal(mncHex);\\n var numTowers = (keyLength - 4) / 5;\\n var cellTowers = hexToAscii(value);\\n messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n case '22': // WIFI locations \\n location_type = 'WIFI';\\n var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\n //location_time = timestamp;\\n var wifiTowers = value;\\n general += 'wifiTowers:';\\n var indexWifi = 0;\\n var bssid_array = [];\\n gen_location = '';\\n for (let i = 0; i < numWifi; i++) {\\n gen_location += wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\n indexWifi += 14;\\n }\\n gen_location = gen_location.slice(0, -1);\\n general += gen_location;\\n if (alarmCode) {\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};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 = (`Watch-ACK;${imei};${message}`); // ${sequenceID}; add ${sequenceID}; 19-07\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n var value = message.substring(index, index = index + keyLength - 2);\\n if (typeof configIds !== 'undefined' && configIds && configIds.ConfigureDevice && configIds.ConfigureDevice.LastConfigured) { // when is defined\\n AddValue(configsToUpdate, configIds.ConfigureDevice.LastConfigured, moment().format('YYYY/MM/DD, HH:mm:ss'));\\n configsToAck.push(configIds.ConfigureDevice.LastConfigured);\\n }\\n //}\\n }\\n if (command == 'FE') {\\n while (index < total_length + 16) {\\n var keyLength = message.substring(index, index = index + 2);\\n keyLength = 2 * hexToDecimal(keyLength);\\n var key = message.substring(index, index = index + 2);\\n var value = message.substring(index, index = index + keyLength - 2);\\n }\\n }\\n // prepare the ACK msg and change config if it is needed\\n lengthAck = messageBody.length / 2;\\n lengthAck = ('0000' + decimalToHex(lengthAck)).slice(-4);\\n lengthAck = lengthAck.toString().substring(2, 4) + lengthAck.toString().substring(0, 2);\\n ////////////checksum CRC 16\\n var checksumAck = byteStringToByteArray(messageBody);\\n checksumAck = crc16byte(checksumAck);\\n checksumAck = decimalToHex(checksumAck);\\n checksumAck = ('0000' + checksumAck).slice(-4);\\n checksumAck = checksumAck.toString().substring(2, 4) + checksumAck.toString().substring(0, 2);\\n prefix = prefix + lengthAck + checksumAck + sequenceID;\\n // To send ACK to the device previous to internal msg with parts\\n if (needsAck == true) {\\n if (messageBody.length <= 2) {\\n ack = 'AB00030008C7' + sequenceID + '7F0100'; // change AB10030008C7 to AB00030008C7\\n } else {\\n ack = prefix + messageBody;\\n }\\n AddValue(codeValues, 'imei', imei);\\n AddValue(codeValues, 'ack', ack);\\n }\\n } else { // checksum was invalid - print out useful debug info and bet quess at imei \\n AddValue(codeValues, \\\"error\\\", \\\"checksum failed for message\\\");\\n AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n i = rawFromBytes.search('3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]');\\n if (i >= 0) {\\n imei = hexToAscii(rawFromBytes.substring(i, i + 30));\\n AddValue(codeValues, \\\"imei\\\", imei);\\n }\\n }\\n }\\n // Auxiliary functions\\n function buildDataToReceiver(codeValues, configsToAck = [], configsToUpdate = [], configsToSend = []) {\\n const dataToReceiver = {\\n values: codeValues\\n };\\n if (configsToAck.length > 0) {\\n dataToReceiver.configsToAck = configsToAck;\\n }\\n if (configsToUpdate.length > 0) {\\n dataToReceiver.configsToUpdate = configsToUpdate;\\n }\\n if (configsToSend.length > 0) {\\n dataToReceiver.configsToSend = configsToSend;\\n }\\n return dataToReceiver;\\n }\\n\\n function AddValue(codeValueArray, p1, p2) { // push code value pair into array\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n codeValueArray.push(cvpair);\\n }\\n // convert functions\\n function asciiToHex(str) { // ascii to hex \\n return [...str].map(char => char.charCodeAt(0).toString(16).padStart(2, '0')).join('');\\n }\\n\\n function byteStringToByteArray(str) { // convierte una cadena hexadecimal en un array de bytes (number[])\\n const bytes = [];\\n for (let i = 0; i < str.length; i += 2) {\\n const byte = parseInt(str.substring(i, i + 2), 16);\\n if (!isNaN(byte) && byte >= 0 && byte <= 255) {\\n bytes.push(byte);\\n }\\n }\\n return bytes;\\n }\\n\\n function decimalToHex(x) {\\n return Number(x).toString(16).toUpperCase();\\n }\\n\\n function hexToBin(hex) { // convierte un valor hexadecimal a su representación binaria, y asegura que tenga al menos 8 bits \\n const bin = parseInt(hex, 16).toString(2);\\n return bin.padStart(hex.length * 4, '0');\\n }\\n\\n function hexToAscii(hex) {\\n if (hex.length % 2 !== 0) {\\n throw new Error(\\\"Hex string length must be even\\\");\\n }\\n let ascii = '';\\n for (let i = 0; i < hex.length; i += 2) {\\n const byte = hex.substr(i, 2);\\n const charCode = parseInt(byte, 16);\\n if (charCode !== 0) { // remove null character (\\\\u0000)\\n ascii += String.fromCharCode(charCode);\\n }\\n }\\n return ascii;\\n //return hex.match(/.{2}/g).map(byte => String.fromCharCode(parseInt(byte, 16))).join('');\\n }\\n\\n function hexToDecimalSigned(hex) { // hex to decimal\\n if (hex.length % 2 !== 0) {\\n hex = '0' + hex;\\n }\\n const num = parseInt(hex, 16);\\n const bits = hex.length * 4;\\n const maxVal = 2 ** bits;\\n return num >= maxVal / 2 ? num - maxVal : num;\\n }\\n\\n function hexToDecimal(hex) {\\n return parseInt(hex, 16);\\n }\\n // CheckSum and debug functions\\n function changeEndianness(hexString) { // changeEndianness\\n if (hexString.length === 0) { //if string is empty or not defined\\n return \\\"\\\";\\n }\\n if (hexString.length % 2 !== 0) {\\n throw new Error(\\\"Hex string length must be even\\\");\\n }\\n return hexString.match(/.{2}/g) // divide in bytes (2 chars)\\n .reverse() // reverse the order\\n .join('');\\n }\\n\\n function calculateCheckSum(payloadData) { // calcula el CRC16 sobre una cadena hexadecimal y devuelve el valor con el endianness invertido\\n const bytes = byteStringToByteArray(payloadData);\\n const crc = crc16byte(bytes);\\n const hex = crc.toString(16).padStart(4, '0').toUpperCase();\\n return changeEndianness(hex);\\n }\\n\\n function crc16byte(byteArray) { // calcula el CRC-16 sobre un array de bytes usando una tabla precalculada (crcTable)\\n let crc = 0x0000;\\n for (const byte of byteArray) {\\n if (byte < 0 || byte > 255 || !Number.isInteger(byte)) {\\n throw new RangeError(\\\"Invalid byte value in input array\\\");\\n }\\n const index = (byte ^ (crc >> 8)) & 0xFF;\\n crc = crcTable[index] ^ (crc << 8);\\n }\\n return crc & 0xFFFF;\\n }\\n\\n function debug(...args) { // write debug info to console log, if localTesting\\n if (localTesting) {\\n console.debug('[DEBUG]', ...args);\\n }\\n }\\n /*\\n function sendMessageToLocalhostNoWait(str) { // sends message to system, closing connection after\\n var server;\\n if (localTesting) {\\n console.log('local testing - sending to protocol-dev server the message ... '); // port 5878\\n console.log(str);\\n server = '52.174.17.77';\\n } else {\\n server = '127.0.0.1';\\n }\\n var c = net.createConnection(5878, server);\\n c.on('error', function(error) {\\n c = net.createConnection(5878, server);\\n });\\n c.write(`${str}`);\\n c.end();\\n }*/\\n function sendMessageToLocalhostNoWait(message) {\\n const server = localTesting ? '52.174.17.77' : '127.0.0.1';\\n //const port = localTesting ? '5878' : ''; //Protocol-dev\\n const port = '5678'; //acceptance-dev\\n if (localTesting) {\\n console.debug('[DEBUG] Sending message to test server:', message);\\n }\\n const client = net.createConnection(port, server, () => {\\n client.write(message);\\n client.end();\\n });\\n client.on('error', (err) => {\\n console.error(`[ERROR] Failed to send message to ${server}:${port}:`, err.message);\\n });\\n client.on('end', () => {\\n if (localTesting) {\\n console.debug('[DEBUG] Connection closed');\\n }\\n });\\n }\\n}\\n// params is not defined locally -> export as module\\nif (typeof(params) === 'undefined') {\\n module.exports = {\\n execute_ops\\n }\\n} else { // on server use local defined vars\\n let return_values = execute_ops(moment, msg, net, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\n // define global returns\\n msg = return_values;\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1751886283},{"Type":1,"NewValue":"{\"Id\":437,\"Name\":\"Access TEC Care Watch\",\"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 // Watch protocol - please see variables and typical values in order below\\n // Watch-CYC;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;SIGNAL=<>;WM=<>;GENERAL=<>\\n // Watch-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\n //\\n // Author: Juanmi Navarro\\n // Created: 01/01/0000\\n // Last modified: 20/05/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', 'Watch');\\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 = (`Watch-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 var allowedCID = ['3036', '06'];\\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 //<>,<>,<> \\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 //<>,<>,<> \\n if (mac2) {\\n AddValue(codeValues, 'beacon_mac', mac2);\\n var simpleQuery2 = [{\\n 'code': 'Mac',\\n 'value': mac2,\\n }];\\n var simpleQueryLabel2 = {\\n 'table': 'beacons',\\n 'select': 'Name',\\n 'query': simpleQuery2\\n };\\n var labels2 = [];\\n labels2.push(JSON.stringify(simpleQueryLabel2));\\n AddValue(codeValues, 'oysta_labels', JSON.stringify(labels2));\\n }\\n if (params.beacon_major) {\\n AddValue(codeValues, 'beacon_major', params.beacon_major);\\n } else {\\n AddValue(codeValues, 'beacon_major', 0);\\n }\\n if (params.beacon_minor) {\\n AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\n } else {\\n AddValue(codeValues, 'beacon_minor', 0);\\n }\\n //AddValue(codeValues,'oysta_labels', label);\\n //AddValue(codeValues,'oysta_value', mac);\\n if (location_time) {\\n AddValue(codeValues, 'location_time', location_time);\\n }\\n }\\n /* meter mas tarde... \\n if (params.smart_data !== 'undefined') {\\n var gen_location = params.smart_data.split(',')\\n var latitude = gen_location[0]\\n var longitude = gen_location[1]\\n var location_accuracy = gen_location[2]\\n var altitude = gen_location[3]\\n AddValue(codeValues,'latitude', latitude);\\n AddValue(codeValues,'longitude', longitude);\\n AddValue(codeValues,'altitude', altitude);\\n AddValue(codeValues,'location_accuracy', location_accuracy);\\n }\\n */\\n /*else if ((params.event_time) && (params.event_time == '')) {\\n var event_time = moment.utc().unix();\\n AddValue(codeValues,'event_time', event_time);\\n } revisar mas adelante*/\\n // to parse SMS info from the device\\n switch (messageTypeLocalCode) {\\n case 'COMM-SMS': // SMS message sent in\\n if (params.data.startsWith('Device location request')) {\\n configsToAck.push(configIds.Controls.RealTimeLocate);\\n } else if (params.data.startsWith('Set IP ok')) {\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\n } else if (params.data.startsWith('IMEI:')) {\\n configsToAck.push(configIds.Controls.GetFirmwareVersion);\\n } else if (params.data.startsWith('Set IP ok')) {\\n configsToAck.push(configIds.Controls.ClearBufferedMessages);\\n } else if (params.data.startsWith('flush ok')) {\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\n } else if (params.data.startsWith('Set Watch-')) {\\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 = (`Watch-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 = (`Watch;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 = (`Watch;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 = (`Watch-RTL;${params.imei};${location_time};${location_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n break;\\n }\\n if (!params.event_time && !event_time) { // if params.event_time undefined - set it to now. \\n var event_time = moment.utc().unix();\\n AddValue(codeValues, 'event_time', event_time);\\n }\\n // if (!params.location_time && !location_time) { // if params.location_time undefined - set it to now. \\n // var location_time = moment.utc().unix();\\n // AddValue(codeValues, 'location_time', location_time);\\n //}\\n }\\n // send data msg to kibana\\n const data = buildDataToReceiver(codeValues, configsToAck, configsToUpdate, configsToSend);\\n console.log(data);\\n return data\\n // end of main operation\\n // define functions used in operation\\n // decode global msg\\n function decoder(str) { // decode rawdata\\n // CARE Decoder\\n AddValue(codeValues, 'Message : ', str);\\n var message = str;\\n // need to check if checksum is correct for possible msg corruption 10/03/23\\n var checksum = message.substring(8, 12);\\n var messageBody = message.substring(16, message.length);\\n debug('message =' + message);\\n debug('checksum =' + checksum);\\n debug('calculateCheckSum =' + calculateCheckSum(messageBody));\\n if (calculateCheckSum(messageBody) == checksum) { // payload is valid\\n debug(\\\"message has valid checksum\\\");\\n var messageBody = command; // update value for the ACK\\n debug('command =' + command);\\n if (command == '01') {\\n while (index < total_length + 16) {\\n var keyLengthHex = message.substring(index, index = index + 2);\\n var keyLength = 2 * hexToDecimal(keyLengthHex);\\n var key = message.substring(index, index = index + 2);\\n var value = message.substring(index, index = index + keyLength - 2);\\n debug('key = ' + key);\\n debug('value = ' + value);\\n switch (key) {\\n //Device ID\\n case '01':\\n var imei = hexToAscii(value);\\n // create long connection if it is needed\\n if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\n //no 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\\n if ((alarmCodeExtInt & 1) == 1) {\\n var alarm = 'ALF-C';\\n }\\n // Welfare Check-out\\n else if ((alarmCodeExtInt & 2) == 2) {\\n var alarm = 'ALA-C';\\n }\\n // Standard Alerts\\n //Battery low\\n else if ((alarmCodeInt & 1) == 1) {\\n var alarm = 'BATL';\\n }\\n //Overspeed\\n else if ((alarmCodeInt & 2) == 2) {\\n var alarm = 'ALSP';\\n }\\n //Fall\\n else if ((alarmCodeInt & 4) == 4) {\\n var alarm = 'ALF';\\n }\\n //Tilt\\n else if ((alarmCodeInt & 8) == 8) {\\n var alarm = 'Tilt';\\n } else if ((alarmCodeInt & 16) == 16) {\\n if ((alarmCodeInt & 16777216) == 16777216) {\\n var alarm = 'Geo1-IN';\\n } else {\\n var alarm = 'Geo1-OUT';\\n }\\n } else if ((alarmCodeInt & 32) == 32) {\\n if ((alarmCodeInt & 33554432) == 33554432) {\\n var alarm = 'Geo2-IN';\\n } else {\\n var alarm = 'Geo2-OUT';\\n }\\n } else if ((alarmCodeInt & 64) == 64) {\\n if ((alarmCodeInt & 67108864) == 67108864) {\\n var alarm = 'Geo3-IN';\\n } else {\\n var alarm = 'Geo3-OUT';\\n }\\n } else if ((alarmCodeInt & 128) == 128) {\\n if ((alarmCodeInt & 134217728) == 134217728) {\\n var alarm = 'Geo4-IN';\\n } else {\\n var alarm = 'Geo4-OUT';\\n }\\n }\\n //Power Off\\n else if ((alarmCodeInt & 256) == 256) {\\n var alarm = 'PWRF';\\n }\\n //Power On\\n else if ((alarmCodeInt & 512) == 512) {\\n var alarm = 'PWRN';\\n }\\n //Motion\\n else if ((alarmCodeInt & 1024) == 1024) {\\n var alarm = 'ALMOV';\\n }\\n //No Motion\\n else if ((alarmCodeInt & 2048) == 2048) {\\n var alarm = 'ALNM';\\n }\\n //SOS\\n else if ((alarmCodeInt & 4096) == 4096) {\\n var alarm = 'ALSOS';\\n } else if ((alarmCodeInt & 8192) == 8192) {\\n var alarm = 'Side1';\\n } else if ((alarmCodeInt & 16384) == 16384) {\\n var alarm = 'Side2';\\n }\\n //Battery charging\\n else if ((alarmCodeInt & 32768) == 32768) {\\n var alarm = 'BATCN';\\n }\\n //Battery no charging\\n else if ((alarmCodeInt & 65536) == 65536) {\\n var alarm = 'BATCF';\\n }\\n //SOS Ending\\n // Temporary Commented until we know exactly how it works. 22/09/2022\\n else if ((alarmCodeInt & 131072) == 131072) {\\n var alarm = 'SOSEnding';\\n info = 'Alarm Finished';\\n }\\n //Amber Alert EC03 only\\n else if ((alarmCodeInt & 262144) == 262144) {\\n var alarm = 'ALAO';\\n }\\n // welfare Alert check-in ALA-O\\n else if ((alarmCodeInt & 524288) == 524288) {\\n var alarm = 'ALA-O';\\n }\\n // Amber alert Ending ALA-C\\n else if ((alarmCodeInt & 1048576) == 1048576) {\\n var alarm = 'ALA-C';\\n }\\n // Amber alert Ending ALA-C\\n //else if ((alarmCodeInt & 1048576) == 1048576) {\\n // var alarm = 'ALA-C';\\n //}\\n // Fall-Down Alert ending\\n else if ((alarmCodeInt & 2097152) == 2097152) {\\n var alarm = 'ALF-C';\\n }\\n // welfare Alert Ending ALA\\n else if ((alarmCodeInt & 4194304) == 4194304) {\\n var alarm = 'ALA';\\n }\\n // Beacon absent Alert 11/10/22. Need to be added in msg types\\n //else if ((alarmCodeInt & 16777216) == 16777216) {\\n // var alarm = 'BEA';\\n //}\\n general += 'alarm:' + alarm + ',';\\n break;\\n //Custom ID\\n case '03':\\n customID = value;\\n if (!allowedCID.includes(value)) {\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\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 //no 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 //<>,<>,<>,<>,<>\\n gps_data = `${latitude},${longitude},${location_accuracy},${speed},${direction},${altitude},${satellites},${mileage}`;\\n general += 'gps location (lat):' + latitude + ', (long):' + longitude + ',';\\n break;\\n //WIFI Towers\\n case '22':\\n location_type = 'WIFI';\\n var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\n //location_time = timestamp;\\n var wifiTowers = value;\\n general += 'wifiTowers:';\\n var indexWifi = 0;\\n var bssid_array = [];\\n wifi_data = '';\\n for (let i = 0; i < numWifi; i++) {\\n wifi_data += hexToDecimalSigned(wifiTowers.substring(indexWifi, indexWifi + 2)) + ',' + wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\n indexWifi += 14;\\n }\\n wifi_data = wifi_data.slice(0, -1);\\n general += wifi_data;\\n break;\\n //BLE Location Added 10/10/22\\n case '23':\\n location_type = 'BLE';\\n var mac = value.substring(0, 12);\\n var latitudeHex = value.substring(12, 20);\\n var longitudeHex = value.substring(20, 28);\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n var address = hexToAscii(value.substring(28, value.length));\\n var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\n // add : format in MAC\\n mac = mac.match(/.{1,2}/g).join(':');\\n // location_time = timestamp;\\n ble_data = `${latitude},${longitude},${mac},${address}`;\\n general += 'BLE location (lat):' + latitude + ', (long):' + longitude + ',';\\n break;\\n //General Data , status_data\\n case '24':\\n if (!allowedCID.includes(customID)) {\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n AddValue(codeValues, \\\"customID\\\", customID);\\n return\\n }\\n if (alarmCode) {\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = '';\\n //= gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\n } else if (statusDevice) {\\n messageForReceiver = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};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 = '';\\n //= gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\n }\\n //else {\\n // messageForReceiver = (`CareWatch-CYC;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};`);\\n //}\\n // reset variables\\n //alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\n var timestampHex = value.substring(0, 8);\\n timestampHex = changeEndianness(timestampHex);\\n timestamp = hexToDecimal(timestampHex);\\n location_time = timestamp;\\n event_time = timestamp;\\n // HardCode to fix possible issue in protocol\\n //event_time = moment.utc().unix();\\n // end of hard code\\n var statusHex = changeEndianness(value.substring(8, 16));\\n var statusInt = hexToDecimal(statusHex);\\n var statusDevice = '';\\n if ((statusInt & 1) == 1) {\\n statusDevice += 'GPS,';\\n }\\n if ((statusInt & 2) == 2) {\\n statusDevice += 'WIFISource,';\\n }\\n if ((statusInt & 4) == 4) {\\n statusDevice += 'CellTower,';\\n }\\n if ((statusInt & 8) == 8) {\\n statusDevice += 'BLELocation,';\\n }\\n //params.BatteryStatus.BatteryStatus = '1';\\n if ((statusInt & 16) == 16) {\\n statusDevice += 'Charging,';\\n // var alarm = 'BATCN';\\n //configs.BatteryStatus.BatteryStatus = '1';\\n /* if (configs.BatteryStatus.BatteryStatus !== '1') {\\n hasConfigs = true;\\n var batteryStatus = '1';\\n var alarm = 'BATCN';\\n let configsToUpdate = [];\\n configsToUpdate.push({\\n 'code': configIds.BatteryStatus.BatteryStatus,\\n 'value': batteryStatus\\n });\\n }*/\\n }\\n if ((statusInt & 32) == 32) {\\n statusDevice += 'FUllyCharged,';\\n //var alarm = 'BATF';\\n // configs.BatteryStatus.BatteryStatus = '3';\\n /* if (configs.BatteryStatus.BatteryStatus !== '3') {\\n hasConfigs = true;\\n var batteryStatus = '3';\\n var alarm = 'BATF';\\n let configsToUpdate = [];\\n configsToUpdate.push({\\n 'code': configIds.BatteryStatus.BatteryStatus,\\n 'value': batteryStatus\\n });\\n }*/\\n }\\n /* if (!((statusInt & 32) == 32) & !((statusInt & 16) == 16)) {\\n statusDevice += 'Not Charging,';\\n var alarm = 'BATCF';\\n //configs.BatteryStatus.BatteryStatus = '2';\\n if (configs.BatteryStatus.BatteryStatus !== '2') {\\n var batteryStatus = '2';\\n var alarm = 'BATCF';\\n let configsToUpdate = [];\\n configsToUpdate.push({\\n 'code': configIds.BatteryStatus.BatteryStatus,\\n 'value': batteryStatus\\n });\\n }\\n }*/\\n if ((statusInt & 64) == 64) {\\n statusDevice += 'Reboot,';\\n }\\n if ((statusInt & 128) == 128) {\\n statusDevice += 'HistoricalData,';\\n }\\n if ((statusInt & 256) == 256) {\\n statusDevice += 'AGPSDataValid,';\\n }\\n if ((statusInt & 512) == 512) {\\n statusDevice += 'Motion,';\\n }\\n if ((statusInt & 1024) == 1024) {\\n statusDevice += 'SmartLocating,';\\n }\\n if ((statusInt & 2048) == 2048) { //isHome\\n statusDevice += 'BeaconLocation,';\\n }\\n if ((statusInt & 4096) == 4096) {\\n statusDevice += 'BLEConnected,';\\n }\\n if ((statusInt & 16384) == 16384) {\\n statusDevice += 'HomeWiFi,';\\n }\\n statusDevice = statusDevice.slice(0, -1);\\n status_data = statusDevice; //to oysta template\\n //statusHex = (statusHex);\\n statusHex = hexToBin(statusHex);\\n statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\n battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\n cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\n workMode = parseInt(statusHex.substring(13, 16), 2);\\n general += 'statusDevice:' + statusDevice + ',';\\n if (battery_percentage) {\\n general += 'battery:' + battery_percentage + ',';\\n }\\n if (cellNetworkSignal) {\\n general += 'cellNetworkSignal:' + cellNetworkSignal + ',';\\n }\\n if (workMode) {\\n general += 'workMode:' + workMode + ',';\\n }\\n //messageForReceiver = (`CareWatch-CYC;${imei};${i};${event_time};${battery_percentage}`);\\n break;\\n //Call Records\\n case '25':\\n //Needed?\\n break;\\n //BLE Location 2\\n case '26':\\n //I don't understand\\n //messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n //Smart Location\\n case '27':\\n location_type = 'SMART';\\n var latitudeHex = value.substring(0, 8);\\n var longitudeHex = value.substring(8, 16);\\n var location_accuracyHex = value.substring(16, 20);\\n var altitudeHex = value.substring(20, 24);\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n var altitude = hexToDecimal(changeEndianness(altitudeHex));\\n //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\n //04/08/2022 se quita el multiplicador por 5 pq ya viene el valor en metros\\n location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\n //location_time = timestamp;\\n smart_data = `${latitude},${longitude},${location_accuracy},${altitude}`;\\n general += 'smart location (lat):' + latitude + ', (long):' + longitude + ',';\\n break;\\n //Beacon Location Added 11/10/22\\n case '28':\\n location_type = 'BEACON';\\n // var alarm = 'EBZI';\\n var latitudeHex = '00';\\n var longitudeHex = '00';\\n var descr = 'empty';\\n var flag = hexToDecimal(value.substring(0, 1));\\n var beacId = hexToDecimal(value.substring(1, 2));\\n // msg includes descrip\\n if ((flag & 4) == 4) {\\n descr = hexToAscii(value.substring(18, value.length));\\n }\\n // msg includes lat/lon\\n if ((flag & 8) == 8) {\\n latitudeHex = value.substring(18, 26);\\n longitudeHex = value.substring(26, 34);\\n }\\n // msg includes lat/lon and description\\n if ((flag & 12) == 12) {\\n latitudeHex = value.substring(18, 26);\\n longitudeHex = value.substring(26, 34);\\n descr = hexToAscii(value.substring(34, value.length));\\n }\\n var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\n // add : format in MAC\\n mac = mac.match(/.{1,2}/g).join(':');\\n var rssiHex = value.substring(14, 16);\\n var rssi1Hex = value.substring(16, 18);\\n rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\n rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\n // var latitudeHex = value.substring(18, 26);\\n // var longitudeHex = value.substring(26, 34);\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n //location_time = timestamp;\\n beacon_data = `${latitude},${longitude},${mac},${descr}`;\\n general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (listIndex):' + beacId + ',';\\n break;\\n // Beacon V2\\n case '2C':\\n location_type = 'BEACON';\\n // var alarm = 'EBZI';\\n var latitudeHex = '00';\\n var longitudeHex = '00';\\n var descr = 'empty';\\n var flag = hexToDecimal(value.substring(0, 1));\\n var beacId = hexToDecimal(value.substring(1, 2));\\n // msg includes descrip\\n if ((flag & 4) == 4) {\\n let desc_leng = hexToDecimal(value.substring(20, 22));\\n descr = hexToAscii(value.substring(22, 22 + (2 * desc_leng)));\\n //descr = hexToAscii(value.substring(18, value.length));\\n }\\n // msg includes lat/lon\\n if ((flag & 8) == 8) {\\n latitudeHex = value.substring(18, 26);\\n longitudeHex = value.substring(26, 34);\\n }\\n // msg includes lat/lon and description\\n if ((flag & 12) == 12) {\\n latitudeHex = value.substring(20, 28);\\n longitudeHex = value.substring(28, 36);\\n let desc_leng = hexToDecimal(value.substring(36, 38));\\n descr = hexToAscii(value.substring(38, 38 + (2 * desc_leng)));\\n }\\n var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\n // add : format in MAC\\n mac = mac.match(/.{1,2}/g).join(':');\\n var rssiHex = value.substring(14, 16);\\n var rssi1Hex = value.substring(16, 18);\\n rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\n rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\n var battery_beacon = hexToDecimal(value.substring(18, 20));\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n //location_time = timestamp;\\n beacon_data = `${latitude},${longitude},${mac},${descr}`;\\n general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (battery):' + battery_beacon + ', (listIndex):' + beacId + ',';\\n break;\\n //Cell Towers Note\\n case '29':\\n location_type = 'LBS';\\n lbs_data = '';\\n var mccHex = changeEndianness(value.substring(0, 4));\\n var mncHex = value.substring(4, 6);\\n var mcc = hexToDecimal(mccHex);\\n lbs_data += mcc + ',';\\n var mnc = hexToDecimal(mncHex);\\n lbs_data += mnc + ',';\\n var indexLbs = 6;\\n var numTowers = (hexToDecimal(keyLengthHex) - 4) / 7;\\n for (let i = 0; i < numTowers; i++) {\\n var rxlHex = changeEndianness(value.substring(indexLbs, indexLbs + 2));\\n var rxl = hexToDecimal(rxlHex);\\n var lacHex = changeEndianness(value.substring(indexLbs + 2, indexLbs + 6));\\n var lac = hexToDecimal(lacHex);\\n var cellTowers = hexToDecimal(changeEndianness(value.substring(indexLbs + 6, indexLbs + 14)));\\n lbs_data += rxl + ',' + lac + ',' + cellTowers + ',';\\n indexLbs += 14;\\n }\\n lbs_data = lbs_data.slice(0, -1);\\n general += lbs_data;\\n break;\\n case '30':\\n //G-sensor.\\n 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 = (`Watch-${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 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 = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n }\\n break;\\n //BLE Connected . For Flic button\\n case '62':\\n location_type = 'BLE';\\n //var alarm = 'EBZI'; \\n //var latitudeHex = '00';\\n //var longitudeHex = '00';\\n //var descr = 'empty';\\n var flag = hexToDecimal(value.substring(0, 2)); // 0= Disconnected, 1= Connected\\n var mac = value.substring(2, 14); // No hace falta darle la vuelta\\n // add : format in MAC\\n mac = mac.match(/.{1,2}/g).join(':');\\n var batLevel = hexToDecimal(value.substring(14, 16)); // 0-100\\n //location_time = timestamp;\\n ble_data = `${flag},${batLevel},${mac}`;\\n general += 'BLE location (State):' + flag + ', (bat):' + batLevel + ', (mac):' + mac + ',';\\n break;\\n }\\n }\\n if (alarmCode) {\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};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 = (`Watch;ACK-FIRM;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\n //AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\n configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\n //configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\n //messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n case '1A':\\n //no ACK need\\n var fwVersion = hexToAscii(value);\\n imei = serverParams.Imei;\\n AddValue(codeValues, \\\"imei\\\", imei);\\n AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\n messageForReceiver = (`Watch;ACK-FIRM;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\n //AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\n configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\n //configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\n break;\\n //IMEI\\n case '03':\\n var imei = hexToDecimal(value);\\n // harcode to avoid conflicts with Rio protocol\\n //if ((imei != '860470063029395') && (imei != '860470063035947')) {\\n // AddValue(codeValues, \\\"error\\\", \\\"device imei is not in this protocol\\\");\\n // AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n //AddValue(codeValues, \\\"IMEI\\\", imei);\\n // return\\n //}\\n if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\n //return;\\n }\\n messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n //ICCID\\n case '04':\\n var iccid = hexToDecimal(value);\\n messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n //BLE-MAC\\n case '05':\\n var bleMac = hexToDecimal(value);\\n messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n //Run Time\\n case '07':\\n var runTime = hexToDecimal(value);\\n messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n case '10': // Ringer Volume\\n var volume = hexToDecimal(value);\\n imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-VOL;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"Volume\\\", volume);\\n AddValue(configsToUpdate, configIds.ReadSystemSettings.Volume, volume);\\n configsToAck.push(configIds.ReadSystemSettings.Volume);\\n break;\\n case '0A': //Performance mode\\n //var workMode = hexToDecimal(value);\\n //messageBody = messageBody + keyLengthHex + key + value;\\n //AddValue(codeValues, \\\"WorkMode\\\", workMode);\\n //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\n //configsToAck.push(configIds.ReadPerformance`Settings.Mode);\\n //var workMode = hexToAscii(value.substring(0, value.length));\\n //var workMode = hexToDecimal(value);\\n //var workMode = hexToAscii(value.substring(0, value.length));\\n var workMode = 1234; // + value + \\\"end\\\";\\n //var workModeVal = 9;\\n //workMode = 'test10';\\n imei = serverParams.Imei;\\n messageForReceiver = (`Watch;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 '0F': // Enable control.... Used for STEP COUNTING SETTINGS\\n // 'FF FF 21 80'\\n var StepStatus = hexToBin(value.substring(4, 6));\\n var enalbleDisable = '';\\n if (StepStatus.substring(7, 8) == '1') {\\n var step = 'Enable, '\\n enalbleDisable = '1'\\n } else {\\n var step = 'Disable, '\\n };\\n //var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\n //hrate += detectingInterval;\\n AddValue(codeValues, \\\"step\\\", step);\\n //var imei = serverParams.Imei;\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(configsToUpdate, configIds.ReadStepsSettings.EnableDisableReadStepsSettings, enalbleDisable);\\n //AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\n configsToAck.push(configIds.ReadStepsSettings.EnableDisableReadStepsSettings);\\n //configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\n break;\\n case '1B':\\n //Decimal o ascii?\\n var gsmModule = hexToDecimal(value);\\n messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n case '1F':\\n //System Language\\n var systemLanguage = hexToAscii(value.substring(0, value.length));\\n imei = serverParams.Imei;\\n //messageBody = messageBody + keyLengthHex + key + value;\\n messageForReceiver = (`Watch;ACK-LANG;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"SystemLanguage\\\", systemLanguage);\\n AddValue(configsToUpdate, configIds.ReadSystemSettings.SystemLanguage, systemLanguage);\\n configsToAck.push(configIds.ReadSystemSettings.SystemLanguage);\\n break;\\n case '33': // phone option\\n // [Value]:83 0B 00 00 {\\\"phoneOption\\\":{\\\"flag_value\\\":2947,\\\"s3\\\":1,\\\"s4\\\":0,\\\"s5\\\":1,\\\"s6\\\":0,\\\"callIncoming\\\":0,\\\"rings\\\":3,\\\"s7\\\":0,\\\"toneID\\\":0,\\\"s1\\\":1,\\\"s2\\\":1}}\\n var statusPhone = hexToBin(value.substring(0, 2)); // To find autoanswer setup\\n if (statusPhone.substring(0, 1) == '1') { // 1 Enable\\n var auto = 'true';\\n } else var auto = 'false';\\n statusPhone = hexToBin(value.substring(2, 4)); // To find allow list setup\\n if (statusPhone.substring(7, 8) == '1') { // 1 Enable\\n allow = 'true';\\n } else var allow = 'false';\\n //statusPhone = hexToBin(value.substring(0, 2)) + hexToBin(value.substring(2, 4));\\n //AddValue(configsToUpdate, configIds.ReadSystemSettings.Statusphone, statusPhone);\\n AddValue(configsToUpdate, configIds.ReadSystemSettings.AllowList, allow);\\n AddValue(configsToUpdate, configIds.ReadSystemSettings.AutoAnswer, auto);\\n //configsToAck.push(configIds.ReadSystemSettings.Statusphone);\\n configsToAck.push(configIds.ReadSystemSettings.AllowList);\\n configsToAck.push(configIds.ReadSystemSettings.AutoAnswer);\\n break;\\n case '34': //ContactList with name\\n var contactNumber = value.substring(1, 2);\\n var telLength = hexToDecimal(value.substring(2, 4));\\n var tel = '';\\n switch (contactNumber) {\\n // Emergency Number\\n case '0':\\n tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\n AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\n AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\n configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\n break;\\n // Speed Dial Number\\n //case '1':\\n // tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\n // AddValue(codeValues, \\\"SpeedDialNumber\\\", tel);\\n // AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.SpeedDialNumber, tel);\\n // configsToAck.push(configIds.ReadSpeedDialSettings.SpeedDialNumber);\\n // break;\\n // Gateway Number\\n case '9': //00447781482635,Esendex UK 0034627177148,Esendex Spain 00447507288240,Esendex UK Acceptance\\n tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\n if (tel.includes('447781482635') || tel.includes('00447781482635')) {\\n tel = 'Esendex UK'\\n } else if (tel.includes('34627177148') || tel.includes('0034627177148')) {\\n tel = 'Esendex Spain'\\n } else if (tel.includes('447507288240') || tel.includes('00447507288240')) {\\n tel = 'Esendex UK Acceptance'\\n } else {\\n tel = 'Default'\\n }\\n AddValue(codeValues, \\\"SMSGateway\\\", tel);\\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\n configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\n break;\\n default:\\n tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\n if (tel.length < 6) {\\n contacts += '';\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\n break;\\n }\\n //contacts += 'A' + (contactNumber - 1) + ': ' + tel + ', ';\\n contacts += tel + ', ';\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\n break;\\n }\\n break;\\n case '40': // APN\\n //no ACK need\\n AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'));\\n configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\n var apn = hexToAscii(value.substring(0, value.length));\\n imei = serverParams.Imei;\\n break;\\n case '41': // APN Username\\n //no ACK need\\n //apn = apn + ',' + hexToAscii(value.substring(0, value.length));\\n break;\\n case '42': // APN Password\\n //no ACK need\\n //apn = apn + ',' + hexToAscii(value.substring(0, value.length));\\n messageForReceiver = (`Watch;ACK-GDATA;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"apn\\\", apn);\\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.APN, apn);\\n configsToAck.push(configIds.ReadCommunicationSettings.APN);\\n break;\\n case '43': //Server Details\\n //52.232.85.255,5678 production 52.174.17.77,5678 acceptance\\n var serverDetails = hexToAscii(value.substring(6, value.length)) + ':' + hexToDecimal(value.substring(4, 6) + value.substring(2, 4));\\n if (serverDetails.includes('52.232.85.255:5678')) {\\n serverDetails = 'Production'\\n } else if (serverDetails.includes('52.174.17.77:5678')) {\\n serverDetails = 'Acceptance'\\n } else if (serverDetails.includes('52.174.17.77:5778')) {\\n serverDetails = 'Protocol-Import'\\n } else if (serverDetails.includes('52.174.17.77:5878')) {\\n serverDetails = 'Protocol-Dev'\\n } else {\\n serverDetails = 'Default'\\n }\\n AddValue(codeValues, \\\"server\\\", serverDetails);\\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.Server, serverDetails);\\n configsToAck.push(configIds.ReadCommunicationSettings.Server);\\n break;\\n case '44': //time interval - work mode intervals\\n imei = serverParams.Imei;\\n messageForReceiver = (`Watch;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 '46': //HeartRate\\n // '10 0E 00 80'\\n var HeartRateStatus = hexToBin(value.substring(6, 8));\\n var enalbleDisable = '';\\n if (HeartRateStatus.substring(0, 1) == '1') {\\n var hrate = 'Enable, '\\n enalbleDisable = '1'\\n } else {\\n var hrate = 'Disable, '\\n };\\n var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\n hrate += detectingInterval;\\n AddValue(codeValues, \\\"hrate\\\", hrate);\\n //var imei = serverParams.Imei;\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings, enalbleDisable);\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\n configsToAck.push(configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings);\\n configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\n break;\\n case '47': // Custom Id\\n imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-CUSTID;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"customeid\\\", value);\\n AddValue(configsToUpdate, configIds.ReadState.CustomId, hexToAscii(value)); //now it comes \\\"3036\\\"\\n configsToAck.push(configIds.ReadState.CustomId);\\n break;\\n case '53': // Non motion alert\\n //2B020080\\n var status = hexToBin(value.substring(6, 8));\\n var alertSetting = '';\\n var enableDisable = '';\\n if (status.substring(0, 1) == '1') {\\n alertSetting = 'Enable, '\\n enableDisable = '1';\\n } else {\\n alertSetting = 'Disable, '\\n };\\n //if (status.substring(5, 6) == '1') {\\n // alertSetting += 'Dial, '\\n //} else {\\n // alertSetting += 'No Dial, '\\n //};\\n var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\n alertSetting += time;\\n imei = serverParams.Imei;\\n // commented until Eview fixes this function\\n /*\\n messageForReceiver = (`Watch;ACK-NOMOTION;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"nomotion\\\", alertSetting);\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings, enableDisable);\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\n configsToAck.push(configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings);\\n configsToAck.push(configIds.ReadNonMovementSettings.Time);\\n */\\n break;\\n case '56': //Fall down sensibility\\n // '00001100'\\n var fallStatus = hexToBin(value.substring(0, 2));\\n var enalbleDisable = '';\\n //if (fallStatus.substring(4, 5) == '1') {\\n if (fallStatus.substring(0, 1) == '1') {\\n var sensibility = 'Enable, '\\n enalbleDisable = '1'\\n } else {\\n var sensibility = 'Disable, '\\n };\\n if (fallStatus.substring(5, 6) == '1') {\\n sensibility += 'Dial, '\\n } else {\\n sensibility += 'No Dial, '\\n };\\n var imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-FALLALERT;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n var sesibityOptionValue = hexToDecimal(value.substring(1, 2));\\n sensibility += sesibityOptionValue;\\n AddValue(codeValues, \\\"sensibility\\\", sensibility);\\n //AddValue(configsToUpdate, configIds.ReadAlertSettings.FallSettings, sensibility);\\n AddValue(configsToUpdate, configIds.ReadFallSettings.EnableDisableFallSettings, enalbleDisable);\\n AddValue(configsToUpdate, configIds.ReadFallSettings.Sensitivity, sesibityOptionValue);\\n //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\n configsToAck.push(configIds.ReadFallSettings.EnableDisableFallSettings);\\n configsToAck.push(configIds.ReadFallSettings.Sensitivity);\\n break;\\n case '73': //BeaconList\\n var beaconNumber = hexToDecimal(value.substring(1, 2));\\n var beaconStatus = hexToBin(value.substring(0, 1));\\n beaconStatus = hexToAscii(value.substring(30, value.length));\\n //beaconStatus = changeEndianness(value.substring(30, value.length));\\n //homeBeacon += 'B' + (beaconNumber + 1) + ': ' + beaconStatus + ', ';\\n homeBeacon += beaconStatus + ', ';\\n AddValue(codeValues, \\\"homeBeacon\\\", homeBeacon);\\n messageForReceiver = (`Watch;ACK-GDATA;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\n configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\n break;\\n case '4A': //Wifi Network List\\n var wifiSSIDLenght = hexToDecimal(value.substring(2, 4));\\n var wifiPasswordLenght = hexToDecimal(value.substring(4, 6));\\n var wifiIndex = hexToDecimal(value.substring(1, 2));\\n //var wifiStatus = hexToDecimal(value.substring(0, 1));\\n var wifiStatus = value.substring(0, 1);\\n /*var enalbleDisable = wifiSSID = wifiPassword = homeWifi = '';\\n /var homeWifi = '';\\n if (wifiIndex == '0') { // Only first Wifi of the list\\n if (wifiStatus == '8') {\\n homeWifi += ' Enable, '\\n enalbleDisable = '1';\\n } else {\\n homeWifi += ' Disable, '\\n //enalbleDisable = '0';\\n };*/\\n if ((wifiStatus == '8') || (wifiStatus == 'C')) { // 8 == ON OR C== ON and Connected\\n var wifiSSID = hexToAscii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\n var wifiPassword = hexToAscii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\n var imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-WIFI;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n //homeWiFi += 'W' + (wifiIndex + 1) + ': ' + wifiSSID + ', ' + wifiPassword + ';';\\n homeWiFi += wifiSSID + ', ' + wifiPassword + ';';\\n AddValue(codeValues, \\\"wifi\\\", homeWiFi);\\n AddValue(configsToUpdate, configIds.ReadWiFiList.WiFiList, homeWiFi);\\n configsToAck.push(configIds.ReadWiFiList.WiFiList);\\n }\\n //AddValue(configsToUpdate, configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings, enalbleDisable);\\n //AddValue(configsToUpdate, configIds.ReadWiFiSettings.SSID, wifiSSID);\\n //AddValue(configsToUpdate, configIds.ReadWiFiSettings.Password, wifiPassword);\\n //configsToAck.push(configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings);\\n //configsToAck.push(configIds.ReadWiFiSettings.SSID);\\n //configsToAck.push(configIds.ReadWiFiSettings.Password);\\n break;\\n case '21': // Speed Dial Settings\\n // [Value]:53 84 {\\\"call1Button\\\":{\\\"mode\\\":0,\\\"feedBack\\\":3,\\\"task\\\":2,\\\"time\\\":20,\\\"status\\\":1}}\\n var status = hexToBin(value.substring(2, 4)); //always pass 2 HEXs to this function\\n var alertSetting = '';\\n var enalbleDisable = '';\\n if (status.substring(0, 1) == '1') {\\n alertSetting = 'Enable, '\\n enalbleDisable = '1'\\n } else {\\n alertSetting = 'Disable, '\\n //enableDisable = '0';\\n };\\n //var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\n //alertSetting += time;\\n imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-SPEED;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"speed\\\", alertSetting);\\n AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\n configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\n break;\\n }\\n }\\n }\\n if (command == '03') {\\n while (index < total_length + 16) {\\n var keyLengthHex = message.substring(index, index = index + 2);\\n var keyLength = 2 * hexToDecimal(keyLengthHex);\\n var key = message.substring(index, index = index + 2);\\n var value = message.substring(index, index = index + keyLength - 2);\\n debug('key = ' + key);\\n debug('value = ' + value);\\n switch (key) {\\n case '01': // Device ID\\n var imei = hexToAscii(value);\\n // create long connection if it is needed\\n if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\n //return;\\n }\\n break;\\n case '10': // Heartbeat\\n var heartbeat = hexToAscii(value);\\n event_time = moment.utc().unix();\\n if (index < total_length + 16) {\\n var keyLengthHex = message.substring(index, index = index + 2);\\n keyLength = 2 * hexToDecimal(keyLengthHex);\\n key = message.substring(index, index = index + 2);\\n if (key == '24') {\\n // debug('key: ' + key) //comment those out\\n value = message.substring(index, index = index + keyLength - 2);\\n // debug(value)\\n var timestampHex = value.substring(0, 8);\\n // debug('timestampt hex: ' + timestampHex)\\n timestampHex = changeEndianness(timestampHex);\\n timestamp = hexToDecimal(timestampHex);\\n event_time = timestamp;\\n // debug(event_time)\\n var statusHex = changeEndianness(value.substring(8, 16));\\n // debug(statusHex)\\n var statusInt = hexToDecimal(statusHex);\\n var statusDevice = '';\\n if ((statusInt & 1) == 1) {\\n statusDevice += 'GPS,';\\n }\\n if ((statusInt & 2) == 2) {\\n statusDevice += 'WIFISource,';\\n }\\n if ((statusInt & 4) == 4) {\\n statusDevice += 'CellTower,';\\n }\\n if ((statusInt & 8) == 8) {\\n statusDevice += 'BLELocation,';\\n }\\n if ((statusInt & 16) == 16) {\\n statusDevice += 'Charging,';\\n }\\n if ((statusInt & 32) == 32) {\\n statusDevice += 'FUllyCharged,';\\n }\\n if ((statusInt & 64) == 64) {\\n statusDevice += 'Reboot,';\\n }\\n if ((statusInt & 128) == 128) {\\n statusDevice += 'HistoricalData,';\\n }\\n if ((statusInt & 256) == 256) {\\n statusDevice += 'AGPSDataValid,';\\n }\\n if ((statusInt & 512) == 512) {\\n statusDevice += 'Motion,';\\n }\\n if ((statusInt & 1024) == 1024) {\\n statusDevice += 'SmartLocating,';\\n }\\n if ((statusInt & 2048) == 2048) {\\n statusDevice += 'BeaconLocation,';\\n }\\n if ((statusInt & 4096) == 4096) {\\n statusDevice += 'BLEConnected,';\\n }\\n statusDevice = statusDevice.slice(0, -1);\\n // debug('statusHex:' + statusHex)\\n statusHex = (statusHex);\\n statusHex = hexToBin(statusHex);\\n statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\n // debug(statusHex)\\n battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\n // debug(battery_percentage)\\n // debug(battery_percentage)\\n // debug(statusHex.substring(8, 13))\\n cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\n // debug(cellNetworkSignal)\\n workMode = parseInt(statusHex.substring(13, 16), 2);\\n // debug(workMode)\\n general += 'statusDevice:' + statusDevice + ';';\\n if (battery_percentage) {\\n general += 'battery:' + battery_percentage + ';';\\n }\\n if (cellNetworkSignal) {\\n general += 'cellNetworkSignal:' + cellNetworkSignal + ';';\\n }\\n if (workMode) {\\n general += 'workMode:' + workMode + ';';\\n }\\n }\\n }\\n // revisar\\n var gen_location = '0';\\n messageForReceiver = (`Watch-HTB;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n //messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n case '12': // Device requesting timestamp\\n timestamp = moment.utc().unix();\\n timestampHex = decimalToHex(timestamp);\\n timestampHex = changeEndianness(timestampHex);\\n keyLengthHex = ('00' + decimalToHex(1 + (timestampHex.length) / 2)).slice(-2);\\n // respond to device with the timestamp of the server\\n messageBody = messageBody + keyLengthHex + key + timestampHex;\\n messageForReceiver = `Eview;${imei};${sequenceID};Get timestamp`;\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n break;\\n case '21': //Cell Towers\\n var mccHex = value.substring(0, 2);\\n var mncHex = value.substring(2, 3);\\n var mcc = hexToDecimal(mccHex);\\n var mnc = hexToDecimal(mncHex);\\n var numTowers = (keyLength - 4) / 5;\\n var cellTowers = hexToAscii(value);\\n messageBody = messageBody + keyLengthHex + key + value;\\n break;\\n case '22': // WIFI locations \\n location_type = 'WIFI';\\n var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\n //location_time = timestamp;\\n var wifiTowers = value;\\n general += 'wifiTowers:';\\n var indexWifi = 0;\\n var bssid_array = [];\\n gen_location = '';\\n for (let i = 0; i < numWifi; i++) {\\n gen_location += wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\n indexWifi += 14;\\n }\\n gen_location = gen_location.slice(0, -1);\\n general += gen_location;\\n if (alarmCode) {\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};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 = (`Watch-ACK;${imei};${message}`); // ${sequenceID}; add ${sequenceID}; 19-07\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n var value = message.substring(index, index = index + keyLength - 2);\\n if (typeof configIds !== 'undefined' && configIds && configIds.ConfigureDevice && configIds.ConfigureDevice.LastConfigured) { // when is defined\\n AddValue(configsToUpdate, configIds.ConfigureDevice.LastConfigured, moment().format('YYYY/MM/DD, HH:mm:ss'));\\n configsToAck.push(configIds.ConfigureDevice.LastConfigured);\\n }\\n //}\\n }\\n if (command == 'FE') {\\n while (index < total_length + 16) {\\n var keyLength = message.substring(index, index = index + 2);\\n keyLength = 2 * hexToDecimal(keyLength);\\n var key = message.substring(index, index = index + 2);\\n var value = message.substring(index, index = index + keyLength - 2);\\n }\\n }\\n // prepare the ACK msg and change config if it is needed\\n lengthAck = messageBody.length / 2;\\n lengthAck = ('0000' + decimalToHex(lengthAck)).slice(-4);\\n lengthAck = lengthAck.toString().substring(2, 4) + lengthAck.toString().substring(0, 2);\\n ////////////checksum CRC 16\\n var checksumAck = byteStringToByteArray(messageBody);\\n checksumAck = crc16byte(checksumAck);\\n checksumAck = decimalToHex(checksumAck);\\n checksumAck = ('0000' + checksumAck).slice(-4);\\n checksumAck = checksumAck.toString().substring(2, 4) + checksumAck.toString().substring(0, 2);\\n prefix = prefix + lengthAck + checksumAck + sequenceID;\\n // To send ACK to the device previous to internal msg with parts\\n if (needsAck == true) {\\n if (messageBody.length <= 2) {\\n ack = 'AB00030008C7' + sequenceID + '7F0100'; // change AB10030008C7 to AB00030008C7\\n } else {\\n ack = prefix + messageBody;\\n }\\n AddValue(codeValues, 'imei', imei);\\n AddValue(codeValues, 'ack', ack);\\n }\\n } else { // checksum was invalid - print out useful debug info and bet quess at imei \\n AddValue(codeValues, \\\"error\\\", \\\"checksum failed for message\\\");\\n AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n i = rawFromBytes.search('3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]');\\n if (i >= 0) {\\n imei = hexToAscii(rawFromBytes.substring(i, i + 30));\\n AddValue(codeValues, \\\"imei\\\", imei);\\n }\\n }\\n }\\n // Auxiliary functions\\n function buildDataToReceiver(codeValues, configsToAck = [], configsToUpdate = [], configsToSend = []) {\\n const dataToReceiver = {\\n values: codeValues\\n };\\n if (configsToAck.length > 0) {\\n dataToReceiver.configsToAck = configsToAck;\\n }\\n if (configsToUpdate.length > 0) {\\n dataToReceiver.configsToUpdate = configsToUpdate;\\n }\\n if (configsToSend.length > 0) {\\n dataToReceiver.configsToSend = configsToSend;\\n }\\n return dataToReceiver;\\n }\\n\\n function AddValue(codeValueArray, p1, p2) { // push code value pair into array\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n codeValueArray.push(cvpair);\\n }\\n // convert functions\\n function asciiToHex(str) { // ascii to hex \\n return [...str].map(char => char.charCodeAt(0).toString(16).padStart(2, '0')).join('');\\n }\\n\\n function byteStringToByteArray(str) { // convierte una cadena hexadecimal en un array de bytes (number[])\\n const bytes = [];\\n for (let i = 0; i < str.length; i += 2) {\\n const byte = parseInt(str.substring(i, i + 2), 16);\\n if (!isNaN(byte) && byte >= 0 && byte <= 255) {\\n bytes.push(byte);\\n }\\n }\\n return bytes;\\n }\\n\\n function decimalToHex(x) {\\n return Number(x).toString(16).toUpperCase();\\n }\\n\\n function hexToBin(hex) { // convierte un valor hexadecimal a su representación binaria, y asegura que tenga al menos 8 bits \\n const bin = parseInt(hex, 16).toString(2);\\n return bin.padStart(hex.length * 4, '0');\\n }\\n\\n function hexToAscii(hex) {\\n if (hex.length % 2 !== 0) {\\n throw new Error(\\\"Hex string length must be even\\\");\\n }\\n let ascii = '';\\n for (let i = 0; i < hex.length; i += 2) {\\n const byte = hex.substr(i, 2);\\n const charCode = parseInt(byte, 16);\\n if (charCode !== 0) { // remove null character (\\\\u0000)\\n ascii += String.fromCharCode(charCode);\\n }\\n }\\n return ascii;\\n //return hex.match(/.{2}/g).map(byte => String.fromCharCode(parseInt(byte, 16))).join('');\\n }\\n\\n function hexToDecimalSigned(hex) { // hex to decimal\\n if (hex.length % 2 !== 0) {\\n hex = '0' + hex;\\n }\\n const num = parseInt(hex, 16);\\n const bits = hex.length * 4;\\n const maxVal = 2 ** bits;\\n return num >= maxVal / 2 ? num - maxVal : num;\\n }\\n\\n function hexToDecimal(hex) {\\n return parseInt(hex, 16);\\n }\\n // CheckSum and debug functions\\n function changeEndianness(hexString) { // changeEndianness\\n if (hexString.length === 0) { //if string is empty or not defined\\n return \\\"\\\";\\n }\\n if (hexString.length % 2 !== 0) {\\n throw new Error(\\\"Hex string length must be even\\\");\\n }\\n return hexString.match(/.{2}/g) // divide in bytes (2 chars)\\n .reverse() // reverse the order\\n .join('');\\n }\\n\\n function calculateCheckSum(payloadData) { // calcula el CRC16 sobre una cadena hexadecimal y devuelve el valor con el endianness invertido\\n const bytes = byteStringToByteArray(payloadData);\\n const crc = crc16byte(bytes);\\n const hex = crc.toString(16).padStart(4, '0').toUpperCase();\\n return changeEndianness(hex);\\n }\\n\\n function crc16byte(byteArray) { // calcula el CRC-16 sobre un array de bytes usando una tabla precalculada (crcTable)\\n let crc = 0x0000;\\n for (const byte of byteArray) {\\n if (byte < 0 || byte > 255 || !Number.isInteger(byte)) {\\n throw new RangeError(\\\"Invalid byte value in input array\\\");\\n }\\n const index = (byte ^ (crc >> 8)) & 0xFF;\\n crc = crcTable[index] ^ (crc << 8);\\n }\\n return crc & 0xFFFF;\\n }\\n\\n function debug(...args) { // write debug info to console log, if localTesting\\n if (localTesting) {\\n console.debug('[DEBUG]', ...args);\\n }\\n }\\n /*\\n function sendMessageToLocalhostNoWait(str) { // sends message to system, closing connection after\\n var server;\\n if (localTesting) {\\n console.log('local testing - sending to protocol-dev server the message ... '); // port 5878\\n console.log(str);\\n server = '52.174.17.77';\\n } else {\\n server = '127.0.0.1';\\n }\\n var c = net.createConnection(5878, server);\\n c.on('error', function(error) {\\n c = net.createConnection(5878, server);\\n });\\n c.write(`${str}`);\\n c.end();\\n }*/\\n function sendMessageToLocalhostNoWait(message) {\\n const server = localTesting ? '52.174.17.77' : '127.0.0.1';\\n //const port = localTesting ? '5878' : ''; //Protocol-dev\\n const port = '5678'; //acceptance-dev\\n if (localTesting) {\\n console.debug('[DEBUG] Sending message to test server:', message);\\n }\\n const client = net.createConnection(port, server, () => {\\n client.write(message);\\n client.end();\\n });\\n client.on('error', (err) => {\\n console.error(`[ERROR] Failed to send message to ${server}:${port}:`, err.message);\\n });\\n client.on('end', () => {\\n if (localTesting) {\\n console.debug('[DEBUG] Connection closed');\\n }\\n });\\n }\\n}\\n// params is not defined locally -> export as module\\nif (typeof(params) === 'undefined') {\\n module.exports = {\\n execute_ops\\n }\\n} else { // on server use local defined vars\\n let return_values = execute_ops(moment, msg, net, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\n // define global returns\\n msg = return_values;\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1754555071},{"Type":1,"NewValue":"{\"Id\":437,\"Name\":\"Access TEC Care Watch\",\"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 // Watch protocol - please see variables and typical values in order below\\r\\n // Watch-CYC;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;SIGNAL=<>;WM=<>;GENERAL=<>\\r\\n // Watch-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\r\\n //\\r\\n // Author: Juanmi Navarro\\r\\n // Created: 01/01/0000\\r\\n // Last modified: 18/09/2025\\r\\n //\\r\\n ///////////////////////////////////////////////////////////////////////////////\\r\\n if (typeof localTesting === \\\"undefined\\\") {\\r\\n let localTesting = false;\\r\\n }\\r\\n const crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,\\r\\n 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,\\r\\n 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,\\r\\n 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,\\r\\n 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,\\r\\n 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,\\r\\n 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,\\r\\n 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,\\r\\n 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,\\r\\n 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,\\r\\n 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,\\r\\n 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,\\r\\n 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,\\r\\n 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,\\r\\n 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,\\r\\n 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,\\r\\n 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,\\r\\n 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,\\r\\n 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,\\r\\n 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,\\r\\n 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,\\r\\n 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n ];\\r\\n var codeValues = [];\\r\\n AddValue(codeValues, 'protocol_template', 'Watch');\\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 = (`Watch-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 var allowedCID = ['3036', '06'];\\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 } 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 }\\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 //<>,<>,<> \\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];\\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 //<>,<>,<> \\r\\n if (mac2) {\\r\\n AddValue(codeValues, 'beacon_mac', mac2);\\r\\n var simpleQuery2 = [{\\r\\n 'code': 'Mac',\\r\\n 'value': mac2,\\r\\n }];\\r\\n var simpleQueryLabel2 = {\\r\\n 'table': 'beacons',\\r\\n 'select': 'Name',\\r\\n 'query': simpleQuery2\\r\\n };\\r\\n var labels2 = [];\\r\\n labels2.push(JSON.stringify(simpleQueryLabel2));\\r\\n AddValue(codeValues, 'oysta_labels', JSON.stringify(labels2));\\r\\n }\\r\\n if (params.beacon_major) {\\r\\n AddValue(codeValues, 'beacon_major', params.beacon_major);\\r\\n } else {\\r\\n AddValue(codeValues, 'beacon_major', 0);\\r\\n }\\r\\n if (params.beacon_minor) {\\r\\n AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\r\\n } else {\\r\\n AddValue(codeValues, 'beacon_minor', 0);\\r\\n }\\r\\n //AddValue(codeValues,'oysta_labels', label);\\r\\n //AddValue(codeValues,'oysta_value', mac);\\r\\n }\\r\\n /* meter mas tarde... \\r\\n if (params.smart_data !== 'undefined') {\\r\\n var gen_location = params.smart_data.split(',')\\r\\n var latitude = gen_location[0]\\r\\n var longitude = gen_location[1]\\r\\n var location_accuracy = gen_location[2]\\r\\n var altitude = gen_location[3]\\r\\n AddValue(codeValues,'latitude', latitude);\\r\\n AddValue(codeValues,'longitude', longitude);\\r\\n AddValue(codeValues,'altitude', altitude);\\r\\n AddValue(codeValues,'location_accuracy', location_accuracy);\\r\\n }\\r\\n */\\r\\n /*else if ((params.event_time) && (params.event_time == '')) {\\r\\n var event_time = moment.utc().unix();\\r\\n AddValue(codeValues,'event_time', event_time);\\r\\n } revisar mas adelante*/\\r\\n if (params.location_time) {\\r\\n AddValue(codeValues, 'location_time', params.location_time);\\r\\n }\\r\\n if (params.event_time) {\\r\\n AddValue(codeValues, 'event_time', params.event_time);\\r\\n }\\r\\n // to parse SMS info from the device\\r\\n switch (messageTypeLocalCode) {\\r\\n case 'COMM-SMS': // SMS message sent in\\r\\n if (params.data.startsWith('Device location request')) {\\r\\n configsToAck.push(configIds.Controls.RealTimeLocate);\\r\\n } else if (params.data.startsWith('Set IP ok')) {\\r\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n } else if (params.data.startsWith('IMEI:')) {\\r\\n configsToAck.push(configIds.Controls.GetFirmwareVersion);\\r\\n } else if (params.data.startsWith('Set IP ok')) {\\r\\n configsToAck.push(configIds.Controls.ClearBufferedMessages);\\r\\n } else if (params.data.startsWith('flush ok')) {\\r\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n } else if (params.data.startsWith('Set Watch-')) {\\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 = (`Watch-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 = (`Watch;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 = (`Watch;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 = (`Watch-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 // decode global msg\\r\\n function decoder(str) { // decode rawdata\\r\\n // CARE Decoder\\r\\n //AddValue(codeValues, 'Message : ', str);\\r\\n var message = str;\\r\\n var index = 18;\\r\\n //parse header & properties\\r\\n var properties = message.substring(2, 4);\\r\\n var lengthLittleEndian = message.substring(4, 8);\\r\\n var total_length = lengthLittleEndian.substring(2, 4) + lengthLittleEndian.substring(0, 2);\\r\\n total_length = 2 * hexToDecimal(total_length.substring(0, 4));\\r\\n var sequenceID = message.substring(12, 16);\\r\\n var command = message.substring(16, 18);\\r\\n //mask bitwise (properties should be '10')\\r\\n if ((parseInt(properties) & 8) == 8) {\\r\\n needsAck = true;\\r\\n } else needsAck = false;\\r\\n // need to check if checksum is correct for possible msg corruption 10/03/23\\r\\n var checksum = message.substring(8, 12);\\r\\n var messageBody = message.substring(16, message.length);\\r\\n debug('message =' + message);\\r\\n debug('checksum =' + checksum);\\r\\n debug('calculateCheckSum =' + calculateCheckSum(messageBody));\\r\\n if (calculateCheckSum(messageBody) == checksum) { // payload is valid\\r\\n debug(\\\"message has valid checksum\\\");\\r\\n var messageBody = command; // update value for the ACK\\r\\n debug('command =' + command);\\r\\n if (command == '01') {\\r\\n while (index < total_length + 16) {\\r\\n 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\\r\\n if ((alarmCodeExtInt & 1) == 1) {\\r\\n var alarm = 'ALF-C';\\r\\n }\\r\\n // Welfare Check-out\\r\\n else if ((alarmCodeExtInt & 2) == 2) {\\r\\n var alarm = 'ALA-C';\\r\\n }\\r\\n // Standard Alerts\\r\\n //Battery low\\r\\n else if ((alarmCodeInt & 1) == 1) {\\r\\n var alarm = 'BATL';\\r\\n }\\r\\n //Overspeed\\r\\n else if ((alarmCodeInt & 2) == 2) {\\r\\n var alarm = 'ALSP';\\r\\n }\\r\\n //Fall\\r\\n else if ((alarmCodeInt & 4) == 4) {\\r\\n var alarm = 'ALF';\\r\\n }\\r\\n //Tilt\\r\\n else if ((alarmCodeInt & 8) == 8) {\\r\\n var alarm = 'TLT';\\r\\n } else if ((alarmCodeInt & 16) == 16) {\\r\\n if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n var alarm = 'Geo1-IN';\\r\\n } else {\\r\\n var alarm = 'Geo1-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 32) == 32) {\\r\\n if ((alarmCodeInt & 33554432) == 33554432) {\\r\\n var alarm = 'Geo2-IN';\\r\\n } else {\\r\\n var alarm = 'Geo2-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 64) == 64) {\\r\\n if ((alarmCodeInt & 67108864) == 67108864) {\\r\\n var alarm = 'Geo3-IN';\\r\\n } else {\\r\\n var alarm = 'Geo3-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 128) == 128) {\\r\\n if ((alarmCodeInt & 134217728) == 134217728) {\\r\\n var alarm = 'Geo4-IN';\\r\\n } else {\\r\\n var alarm = 'Geo4-OUT';\\r\\n }\\r\\n }\\r\\n //Power Off\\r\\n else if ((alarmCodeInt & 256) == 256) {\\r\\n var alarm = 'PWRF';\\r\\n }\\r\\n //Power On\\r\\n else if ((alarmCodeInt & 512) == 512) {\\r\\n var alarm = 'PWRN';\\r\\n }\\r\\n //Motion\\r\\n else if ((alarmCodeInt & 1024) == 1024) {\\r\\n var alarm = 'ALMOV';\\r\\n }\\r\\n //No Motion\\r\\n else if ((alarmCodeInt & 2048) == 2048) {\\r\\n var alarm = 'ALNM';\\r\\n }\\r\\n //SOS\\r\\n else if ((alarmCodeInt & 4096) == 4096) {\\r\\n var alarm = 'ALSOS';\\r\\n } else if ((alarmCodeInt & 8192) == 8192) {\\r\\n var alarm = 'Side1';\\r\\n } else if ((alarmCodeInt & 16384) == 16384) {\\r\\n var alarm = 'Side2';\\r\\n }\\r\\n //Battery charging\\r\\n else if ((alarmCodeInt & 32768) == 32768) {\\r\\n var alarm = 'BATCN';\\r\\n }\\r\\n //Battery no charging\\r\\n else if ((alarmCodeInt & 65536) == 65536) {\\r\\n var alarm = 'BATCF';\\r\\n }\\r\\n //SOS Ending\\r\\n // Temporary Commented until we know exactly how it works. 22/09/2022\\r\\n else if ((alarmCodeInt & 131072) == 131072) {\\r\\n var alarm = 'ALA-F';\\r\\n info = 'Alarm Finished';\\r\\n }\\r\\n //Amber Alert EC03 only\\r\\n else if ((alarmCodeInt & 262144) == 262144) {\\r\\n var alarm = 'ALA';\\r\\n }\\r\\n // welfare Alert check-in ALA-O\\r\\n else if ((alarmCodeInt & 524288) == 524288) {\\r\\n var alarm = 'ALA-O';\\r\\n }\\r\\n // Amber alert Ending ALA-C\\r\\n else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n var alarm = 'ALA-C';\\r\\n }\\r\\n // Amber alert Ending ALA-C\\r\\n //else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n // var alarm = 'ALA-C';\\r\\n //}\\r\\n // Fall-Down Alert ending\\r\\n else if ((alarmCodeInt & 2097152) == 2097152) {\\r\\n var alarm = 'ALF-C';\\r\\n }\\r\\n // welfare Alert Ending ALA\\r\\n else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n var alarm = 'ALA';\\r\\n }\\r\\n // Beacon absent Alert 11/10/22. Need to be added in msg types\\r\\n //else if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n // var alarm = 'BEA';\\r\\n //}\\r\\n general += 'alarm:' + alarm + ',';\\r\\n break;\\r\\n //Custom ID\\r\\n case '03':\\r\\n customID = value;\\r\\n if (!allowedCID.includes(value)) {\\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 //<>,<>,<>,<>,<>\\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 if (!allowedCID.includes(customID)) {\\r\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n AddValue(codeValues, \\\"customID\\\", customID);\\r\\n return\\r\\n }\\r\\n if (alarmCode) {\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = '';\\r\\n //= gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n } else if (statusDevice) {\\r\\n messageForReceiver = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = '';\\r\\n //= 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 = '';\\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;\\r\\n var statusHex = changeEndianness(value.substring(8, 16));\\r\\n var statusInt = hexToDecimal(statusHex);\\r\\n var statusDevice = '';\\r\\n if ((statusInt & 1) == 1) {\\r\\n statusDevice += 'GPS,';\\r\\n }\\r\\n if ((statusInt & 2) == 2) {\\r\\n statusDevice += 'WIFISource,';\\r\\n }\\r\\n if ((statusInt & 4) == 4) {\\r\\n statusDevice += 'CellTower,';\\r\\n }\\r\\n if ((statusInt & 8) == 8) {\\r\\n statusDevice += 'BLELocation,';\\r\\n }\\r\\n //params.BatteryStatus.BatteryStatus = '1';\\r\\n if ((statusInt & 16) == 16) {\\r\\n statusDevice += 'Charging,';\\r\\n // var alarm = 'BATCN';\\r\\n //configs.BatteryStatus.BatteryStatus = '1';\\r\\n /* if (configs.BatteryStatus.BatteryStatus !== '1') {\\r\\n hasConfigs = true;\\r\\n var batteryStatus = '1';\\r\\n var alarm = 'BATCN';\\r\\n let configsToUpdate = [];\\r\\n configsToUpdate.push({\\r\\n 'code': configIds.BatteryStatus.BatteryStatus,\\r\\n 'value': batteryStatus\\r\\n });\\r\\n }*/\\r\\n }\\r\\n if ((statusInt & 32) == 32) {\\r\\n statusDevice += 'FUllyCharged,';\\r\\n //var alarm = 'BATF';\\r\\n // configs.BatteryStatus.BatteryStatus = '3';\\r\\n /* if (configs.BatteryStatus.BatteryStatus !== '3') {\\r\\n hasConfigs = true;\\r\\n var batteryStatus = '3';\\r\\n var alarm = 'BATF';\\r\\n let configsToUpdate = [];\\r\\n configsToUpdate.push({\\r\\n 'code': configIds.BatteryStatus.BatteryStatus,\\r\\n 'value': batteryStatus\\r\\n });\\r\\n }*/\\r\\n }\\r\\n /* if (!((statusInt & 32) == 32) & !((statusInt & 16) == 16)) {\\r\\n statusDevice += 'Not Charging,';\\r\\n var alarm = 'BATCF';\\r\\n //configs.BatteryStatus.BatteryStatus = '2';\\r\\n if (configs.BatteryStatus.BatteryStatus !== '2') {\\r\\n var batteryStatus = '2';\\r\\n var alarm = 'BATCF';\\r\\n let configsToUpdate = [];\\r\\n configsToUpdate.push({\\r\\n 'code': configIds.BatteryStatus.BatteryStatus,\\r\\n 'value': batteryStatus\\r\\n });\\r\\n }\\r\\n }*/\\r\\n if ((statusInt & 64) == 64) {\\r\\n statusDevice += 'Reboot,';\\r\\n }\\r\\n if ((statusInt & 128) == 128) {\\r\\n statusDevice += 'HistoricalData,';\\r\\n }\\r\\n if ((statusInt & 256) == 256) {\\r\\n statusDevice += 'AGPSDataValid,';\\r\\n }\\r\\n if ((statusInt & 512) == 512) {\\r\\n statusDevice += 'Motion,';\\r\\n }\\r\\n if ((statusInt & 1024) == 1024) {\\r\\n statusDevice += 'SmartLocating,';\\r\\n }\\r\\n if ((statusInt & 2048) == 2048) { //isHome\\r\\n statusDevice += 'BeaconLocation,';\\r\\n }\\r\\n if ((statusInt & 4096) == 4096) {\\r\\n statusDevice += 'BLEConnected,';\\r\\n }\\r\\n if ((statusInt & 16384) == 16384) {\\r\\n statusDevice += 'HomeWiFi,';\\r\\n }\\r\\n statusDevice = statusDevice.slice(0, -1);\\r\\n status_data = statusDevice; //to oysta template\\r\\n //statusHex = (statusHex);\\r\\n statusHex = hex2bin(statusHex);\\r\\n statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\r\\n battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\r\\n cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\r\\n workMode = parseInt(statusHex.substring(13, 16), 2);\\r\\n general += 'statusDevice:' + statusDevice + ',';\\r\\n if (battery_percentage) {\\r\\n general += 'battery:' + battery_percentage + ',';\\r\\n }\\r\\n if (cellNetworkSignal) {\\r\\n general += 'cellNetworkSignal:' + cellNetworkSignal + ',';\\r\\n }\\r\\n if (workMode) {\\r\\n general += 'workMode:' + workMode + ',';\\r\\n }\\r\\n //messageForReceiver = (`CareWatch-CYC;${imei};${i};${event_time};${battery_percentage}`);\\r\\n break;\\r\\n //Call Records\\r\\n case '25':\\r\\n //Needed?\\r\\n break;\\r\\n //BLE Location 2\\r\\n case '26':\\r\\n //I don't understand\\r\\n //messageBody = messageBody + keyLengthHex + key + value;\\r\\n break;\\r\\n //Smart Location\\r\\n case '27':\\r\\n location_type = 'SMART';\\r\\n var latitudeHex = value.substring(0, 8);\\r\\n var longitudeHex = value.substring(8, 16);\\r\\n var location_accuracyHex = value.substring(16, 20);\\r\\n var altitudeHex = value.substring(20, 24);\\r\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n var altitude = hexToDecimal(changeEndianness(altitudeHex));\\r\\n //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\r\\n //04/08/2022 se quita el multiplicador por 5 pq ya viene el valor en metros\\r\\n location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\r\\n //location_time = timestamp;\\r\\n smart_data = `${latitude},${longitude},${location_accuracy},${altitude}`;\\r\\n general += 'smart location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n break;\\r\\n //Beacon Location Added 11/10/22\\r\\n case '28':\\r\\n location_type = 'BEACON';\\r\\n // var alarm = 'EBZI';\\r\\n var latitudeHex = '00';\\r\\n var longitudeHex = '00';\\r\\n var descr = 'empty';\\r\\n var flag = hexToDecimal(value.substring(0, 1));\\r\\n var beacId = hexToDecimal(value.substring(1, 2));\\r\\n // msg includes descrip\\r\\n if ((flag & 4) == 4) {\\r\\n descr = hex_to_ascii(value.substring(18, value.length));\\r\\n }\\r\\n // msg includes lat/lon\\r\\n if ((flag & 8) == 8) {\\r\\n latitudeHex = value.substring(18, 26);\\r\\n longitudeHex = value.substring(26, 34);\\r\\n }\\r\\n // msg includes lat/lon and description\\r\\n if ((flag & 12) == 12) {\\r\\n latitudeHex = value.substring(18, 26);\\r\\n longitudeHex = value.substring(26, 34);\\r\\n descr = hex_to_ascii(value.substring(34, value.length));\\r\\n }\\r\\n var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n // add : format in MAC\\r\\n mac = mac.match(/.{1,2}/g).join(':');\\r\\n var rssiHex = value.substring(14, 16);\\r\\n var rssi1Hex = value.substring(16, 18);\\r\\n rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\r\\n rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\r\\n // var latitudeHex = value.substring(18, 26);\\r\\n // var longitudeHex = value.substring(26, 34);\\r\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n //location_time = timestamp;\\r\\n beacon_data = `${latitude},${longitude},${mac},${descr}`;\\r\\n general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (listIndex):' + beacId + ',';\\r\\n break;\\r\\n // Beacon V2\\r\\n case '2C':\\r\\n location_type = 'BEACON';\\r\\n // var alarm = 'EBZI';\\r\\n var latitudeHex = '00';\\r\\n var longitudeHex = '00';\\r\\n var descr = 'empty';\\r\\n var flag = hexToDecimal(value.substring(0, 1));\\r\\n var beacId = hexToDecimal(value.substring(1, 2));\\r\\n // msg includes descrip\\r\\n if ((flag & 4) == 4) {\\r\\n let desc_leng = hexToDecimal(value.substring(20, 22));\\r\\n descr = hex_to_ascii(value.substring(22, 22 + (2 * desc_leng)));\\r\\n //descr = hex_to_ascii(value.substring(18, value.length));\\r\\n }\\r\\n // msg includes lat/lon\\r\\n if ((flag & 8) == 8) {\\r\\n latitudeHex = value.substring(18, 26);\\r\\n longitudeHex = value.substring(26, 34);\\r\\n }\\r\\n // msg includes lat/lon and description\\r\\n if ((flag & 12) == 12) {\\r\\n latitudeHex = value.substring(20, 28);\\r\\n longitudeHex = value.substring(28, 36);\\r\\n let desc_leng = hexToDecimal(value.substring(36, 38));\\r\\n descr = hex_to_ascii(value.substring(38, 38 + (2 * desc_leng)));\\r\\n }\\r\\n var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n // add : format in MAC\\r\\n mac = mac.match(/.{1,2}/g).join(':');\\r\\n var rssiHex = value.substring(14, 16);\\r\\n var rssi1Hex = value.substring(16, 18);\\r\\n rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\r\\n rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\r\\n var battery_beacon = hexToDecimal(value.substring(18, 20));\\r\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n //location_time = timestamp;\\r\\n beacon_data = `${latitude},${longitude},${mac},${descr}`;\\r\\n general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (battery):' + battery_beacon + ', (listIndex):' + beacId + ',';\\r\\n break;\\r\\n //Cell Towers Note\\r\\n case '29':\\r\\n location_type = 'LBS';\\r\\n lbs_data = '';\\r\\n var mccHex = changeEndianness(value.substring(0, 4));\\r\\n var mncHex = value.substring(4, 6);\\r\\n var mcc = hexToDecimal(mccHex);\\r\\n lbs_data += mcc + ',';\\r\\n var mnc = hexToDecimal(mncHex);\\r\\n lbs_data += mnc + ',';\\r\\n var indexLbs = 6;\\r\\n var numTowers = (hexToDecimal(keyLengthHex) - 4) / 7;\\r\\n for (let i = 0; i < numTowers; i++) {\\r\\n var rxlHex = changeEndianness(value.substring(indexLbs, indexLbs + 2));\\r\\n var rxl = hexToDecimal(rxlHex);\\r\\n var lacHex = changeEndianness(value.substring(indexLbs + 2, indexLbs + 6));\\r\\n var lac = hexToDecimal(lacHex);\\r\\n var cellTowers = hexToDecimal(changeEndianness(value.substring(indexLbs + 6, indexLbs + 14)));\\r\\n lbs_data += rxl + ',' + lac + ',' + cellTowers + ',';\\r\\n indexLbs += 14;\\r\\n }\\r\\n lbs_data = lbs_data.slice(0, -1);\\r\\n general += lbs_data;\\r\\n break;\\r\\n case '30':\\r\\n //G-sensor.\\r\\n 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 = (`Watch-${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 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 = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n }\\r\\n break;\\r\\n //BLE Connected . For Flic button\\r\\n case '62':\\r\\n location_type = 'BLE';\\r\\n //var alarm = 'EBZI'; \\r\\n //var latitudeHex = '00';\\r\\n //var longitudeHex = '00';\\r\\n //var descr = 'empty';\\r\\n var flag = hexToDecimal(value.substring(0, 2)); // 0= Disconnected, 1= Connected\\r\\n var mac = value.substring(2, 14); // No hace falta darle la vuelta\\r\\n // add : format in MAC\\r\\n mac = mac.match(/.{1,2}/g).join(':');\\r\\n var batLevel = hexToDecimal(value.substring(14, 16)); // 0-100\\r\\n //location_time = timestamp;\\r\\n ble_data = `${flag},${batLevel},${mac}`;\\r\\n general += 'BLE location (State):' + flag + ', (bat):' + batLevel + ', (mac):' + mac + ',';\\r\\n break;\\r\\n }\\r\\n }\\r\\n if (alarmCode) {\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch;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 = (`Watch;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': // Ringer Volume\\r\\n var volume = hexToDecimal(value);\\r\\n imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;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 = (`Watch;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 '0F': // Enable control.... Used for STEP COUNTING SETTINGS\\r\\n // 'FF FF 21 80'\\r\\n var StepStatus = hex2bin(value.substring(4, 6));\\r\\n var enalbleDisable = '';\\r\\n if (StepStatus.substring(7, 8) == '1') {\\r\\n var step = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var step = 'Disable, '\\r\\n };\\r\\n //var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n //hrate += detectingInterval;\\r\\n AddValue(codeValues, \\\"step\\\", step);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadStepsSettings.EnableDisableReadStepsSettings, enalbleDisable);\\r\\n //AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadStepsSettings.EnableDisableReadStepsSettings);\\r\\n //configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\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 = (`Watch;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 '34': //ContactList with name\\r\\n var contactNumber = value.substring(1, 2);\\r\\n var telLength = hexToDecimal(value.substring(2, 4));\\r\\n var tel = '';\\r\\n switch (contactNumber) {\\r\\n // Emergency Number\\r\\n case '0':\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n break;\\r\\n // Speed Dial Number\\r\\n //case '1':\\r\\n // tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n // AddValue(codeValues, \\\"SpeedDialNumber\\\", tel);\\r\\n // AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.SpeedDialNumber, tel);\\r\\n // configsToAck.push(configIds.ReadSpeedDialSettings.SpeedDialNumber);\\r\\n // break;\\r\\n // Gateway Number\\r\\n case '9': //00447781482635,Esendex UK 0034627177148,Esendex Spain 00447507288240,Esendex UK Acceptance\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n if (tel.includes('447781482635') || tel.includes('00447781482635')) {\\r\\n tel = 'Esendex UK'\\r\\n } else if (tel.includes('34627177148') || tel.includes('0034627177148')) {\\r\\n tel = 'Esendex Spain'\\r\\n } else if (tel.includes('447507288240') || tel.includes('00447507288240')) {\\r\\n tel = 'Esendex UK Acceptance'\\r\\n } else {\\r\\n tel = 'Default'\\r\\n }\\r\\n AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n break;\\r\\n default:\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n if (tel.length < 6) {\\r\\n contacts += '';\\r\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n break;\\r\\n }\\r\\n //contacts += 'A' + (contactNumber - 1) + ': ' + tel + ', ';\\r\\n contacts += tel + ', ';\\r\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n break;\\r\\n }\\r\\n break;\\r\\n case '40': // APN\\r\\n //no ACK need\\r\\n AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'));\\r\\n configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\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 = (`Watch;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 = (`Watch;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 '46': //HeartRate\\r\\n // '10 0E 00 80'\\r\\n var HeartRateStatus = hex2bin(value.substring(6, 8));\\r\\n var enalbleDisable = '';\\r\\n if (HeartRateStatus.substring(0, 1) == '1') {\\r\\n var hrate = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var hrate = 'Disable, '\\r\\n };\\r\\n var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n hrate += detectingInterval;\\r\\n AddValue(codeValues, \\\"hrate\\\", hrate);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings);\\r\\n configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\r\\n break;\\r\\n case '47': // Custom Id\\r\\n imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;ACK-CUSTID;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"customeid\\\", value);\\r\\n AddValue(configsToUpdate, configIds.ReadState.CustomId, hex_to_ascii(value)); //now it comes \\\"3036\\\"\\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 // commented until Eview fixes this function\\r\\n /*\\r\\n messageForReceiver = (`Watch;ACK-NOMOTION;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"nomotion\\\", alertSetting);\\r\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings, enableDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n configsToAck.push(configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings);\\r\\n configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n */\\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 = (`Watch;ACK-FALLALERT;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n var sesibityOptionValue = hexToDecimal(value.substring(1, 2));\\r\\n sensibility += sesibityOptionValue;\\r\\n AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n //AddValue(configsToUpdate, configIds.ReadAlertSettings.FallSettings, sensibility);\\r\\n AddValue(configsToUpdate, configIds.ReadFallSettings.EnableDisableFallSettings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadFallSettings.Sensitivity, sesibityOptionValue);\\r\\n //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n configsToAck.push(configIds.ReadFallSettings.EnableDisableFallSettings);\\r\\n configsToAck.push(configIds.ReadFallSettings.Sensitivity);\\r\\n break;\\r\\n case '73': //BeaconList\\r\\n var beaconNumber = hexToDecimal(value.substring(1, 2));\\r\\n var beaconStatus = hex2bin(value.substring(0, 1));\\r\\n beaconStatus = hex_to_ascii(value.substring(30, value.length));\\r\\n //beaconStatus = changeEndianness(value.substring(30, value.length));\\r\\n //homeBeacon += 'B' + (beaconNumber + 1) + ': ' + beaconStatus + ', ';\\r\\n homeBeacon += beaconStatus + ', ';\\r\\n AddValue(codeValues, \\\"homeBeacon\\\", homeBeacon);\\r\\n messageForReceiver = (`Watch;ACK-GDATA;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n break;\\r\\n case '4A': //Wifi Network List\\r\\n var wifiSSIDLenght = hexToDecimal(value.substring(2, 4));\\r\\n var wifiPasswordLenght = hexToDecimal(value.substring(4, 6));\\r\\n var wifiIndex = hexToDecimal(value.substring(1, 2));\\r\\n //var wifiStatus = hexToDecimal(value.substring(0, 1));\\r\\n var wifiStatus = value.substring(0, 1);\\r\\n /*var enalbleDisable = wifiSSID = wifiPassword = homeWifi = '';\\r\\n /var homeWifi = '';\\r\\n if (wifiIndex == '0') { // Only first Wifi of the list\\r\\n if (wifiStatus == '8') {\\r\\n homeWifi += ' Enable, '\\r\\n enalbleDisable = '1';\\r\\n } else {\\r\\n homeWifi += ' Disable, '\\r\\n //enalbleDisable = '0';\\r\\n };*/\\r\\n if ((wifiStatus == '8') || (wifiStatus == 'C')) { // 8 == ON OR C== ON and Connected\\r\\n var wifiSSID = hex_to_ascii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\r\\n var wifiPassword = hex_to_ascii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\r\\n var imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;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 = (`Watch;ACK-SPEED;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"speed\\\", alertSetting);\\r\\n AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\r\\n configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\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 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 = (`Watch-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 = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch-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 if (typeof configIds !== 'undefined' && configIds && configIds.ConfigureDevice && configIds.ConfigureDevice.LastConfigured) { // when is defined\\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 }\\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":1758223135},{"Type":1,"NewValue":"{\"Id\":437,\"Name\":\"Access TEC Care Watch\",\"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 // Watch protocol - please see variables and typical values in order below\\n // Watch-CYC;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;SIGNAL=<>;WM=<>;GENERAL=<>\\n // Watch-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\n //\\n // Author: Juanmi Navarro\\n // Created: 01/01/0000\\n // Last modified: 18/09/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', 'Watch');\\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 = (`Watch-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 var allowedCID = ['3036', '06'];\\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 debug(message);\\n decodeHexStream(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 }\\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 }\\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 }\\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 //<>,<>,<> \\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 }\\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 //<>,<>,<> \\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 }\\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 if (params.location_time) {\\n AddValue(codeValues, 'location_time', params.location_time);\\n }\\n if (params.event_time) {\\n AddValue(codeValues, 'event_time', params.event_time);\\n }\\n // to parse SMS info from the device\\n switch (messageTypeLocalCode) {\\n case 'COMM-SMS': // SMS message sent in\\n if (params.data.startsWith('Device location request')) {\\n configsToAck.push(configIds.Controls.RealTimeLocate);\\n } else if (params.data.startsWith('Set IP ok')) {\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\n } else if (params.data.startsWith('IMEI:')) {\\n configsToAck.push(configIds.Controls.GetFirmwareVersion);\\n } else if (params.data.startsWith('Set IP ok')) {\\n configsToAck.push(configIds.Controls.ClearBufferedMessages);\\n } else if (params.data.startsWith('flush ok')) {\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\n } else if (params.data.startsWith('Set Watch-')) {\\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 = (`Watch-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 = (`Watch;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 = (`Watch;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 = (`Watch-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 // decode global msg\\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 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 //no 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 // if timestamp is older than 1 year, update it (AGPS bug)\\n if (timestamp < moment.utc().subtract(1, \\\"year\\\").unix()) {\\n timestamp += 619315200; //moment.utc().unix();\\n }\\n event_time = timestamp;\\n var alarmCodeInt = hexToDecimal(alarmCode);\\n var alarmCodeExt = value.substring(16, 24);\\n alarmCodeExt = changeEndianness(alarmCodeExt);\\n var alarmCodeExtInt = hexToDecimal(alarmCodeExt);\\n //Extended Alerts\\n // Fall off\\n if ((alarmCodeExtInt & 1) == 1) {\\n var alarm = 'ALF-C';\\n }\\n // Welfare Check-out\\n else if ((alarmCodeExtInt & 2) == 2) {\\n var alarm = 'ALA-C';\\n }\\n // Standard Alerts\\n //Battery low\\n else if ((alarmCodeInt & 1) == 1) {\\n var alarm = 'BATL';\\n }\\n //Overspeed\\n else if ((alarmCodeInt & 2) == 2) {\\n var alarm = 'ALSP';\\n }\\n //Fall\\n else if ((alarmCodeInt & 4) == 4) {\\n var alarm = 'ALF';\\n }\\n //Tilt\\n else if ((alarmCodeInt & 8) == 8) {\\n var alarm = 'TLT';\\n } else if ((alarmCodeInt & 16) == 16) {\\n if ((alarmCodeInt & 16777216) == 16777216) {\\n var alarm = 'Geo1-IN';\\n } else {\\n var alarm = 'Geo1-OUT';\\n }\\n } else if ((alarmCodeInt & 32) == 32) {\\n if ((alarmCodeInt & 33554432) == 33554432) {\\n var alarm = 'Geo2-IN';\\n } else {\\n var alarm = 'Geo2-OUT';\\n }\\n } else if ((alarmCodeInt & 64) == 64) {\\n if ((alarmCodeInt & 67108864) == 67108864) {\\n var alarm = 'Geo3-IN';\\n } else {\\n var alarm = 'Geo3-OUT';\\n }\\n } else if ((alarmCodeInt & 128) == 128) {\\n if ((alarmCodeInt & 134217728) == 134217728) {\\n var alarm = 'Geo4-IN';\\n } else {\\n var alarm = 'Geo4-OUT';\\n }\\n }\\n //Power Off\\n else if ((alarmCodeInt & 256) == 256) {\\n var alarm = 'PWRF';\\n }\\n //Power On\\n else if ((alarmCodeInt & 512) == 512) {\\n var alarm = 'PWRN';\\n }\\n //Motion\\n else if ((alarmCodeInt & 1024) == 1024) {\\n var alarm = 'ALMOV';\\n }\\n //No Motion\\n else if ((alarmCodeInt & 2048) == 2048) {\\n var alarm = 'ALNM';\\n }\\n //SOS\\n else if ((alarmCodeInt & 4096) == 4096) {\\n var alarm = 'ALSOS';\\n } else if ((alarmCodeInt & 8192) == 8192) {\\n var alarm = 'Side1';\\n } else if ((alarmCodeInt & 16384) == 16384) {\\n var alarm = 'Side2';\\n }\\n //Battery charging\\n else if ((alarmCodeInt & 32768) == 32768) {\\n var alarm = 'BATCN';\\n }\\n //Battery no charging\\n else if ((alarmCodeInt & 65536) == 65536) {\\n var alarm = 'BATCF';\\n }\\n //SOS Ending\\n // Temporary Commented until we know exactly how it works. 22/09/2022\\n else if ((alarmCodeInt & 131072) == 131072) {\\n var alarm = 'ALA-F';\\n info = 'Alarm Finished';\\n }\\n //Amber Alert EC03 only\\n else if ((alarmCodeInt & 262144) == 262144) {\\n var alarm = 'ALA';\\n }\\n // welfare Alert check-in ALA-O\\n else if ((alarmCodeInt & 524288) == 524288) {\\n var alarm = 'ALA-O';\\n }\\n // Amber alert Ending ALA-C\\n else if ((alarmCodeInt & 1048576) == 1048576) {\\n var alarm = 'ALA-C';\\n }\\n // Amber alert Ending ALA-C\\n //else if ((alarmCodeInt & 1048576) == 1048576) {\\n // var alarm = 'ALA-C';\\n //}\\n // Fall-Down Alert ending\\n else if ((alarmCodeInt & 2097152) == 2097152) {\\n var alarm = 'ALF-C';\\n }\\n // welfare Alert Ending ALA\\n else if ((alarmCodeInt & 4194304) == 4194304) {\\n var alarm = 'ALA';\\n }\\n // Beacon absent Alert 11/10/22. Need to be added in msg types\\n //else if ((alarmCodeInt & 16777216) == 16777216) {\\n // var alarm = 'BEA';\\n //}\\n general += 'alarm:' + alarm + ',';\\n break;\\n //Custom ID\\n case '03':\\n customID = value;\\n if (!allowedCID.includes(value)) {\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\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 //no 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 //<>,<>,<>,<>,<>\\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 if (!allowedCID.includes(customID)) {\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n AddValue(codeValues, \\\"customID\\\", customID);\\n return\\n }\\n if (alarmCode) {\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = '';\\n //= gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\n } else if (statusDevice) {\\n messageForReceiver = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};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 = '';\\n //= 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 = '';\\n //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 // if timestamp is older than 1 year, update it (AGPS bug)\\n if (timestamp < moment.utc().subtract(1, \\\"year\\\").unix()) {\\n timestamp += 619315200; //moment.utc().unix();\\n }\\n location_time = timestamp;\\n event_time = timestamp;\\n var statusHex = changeEndianness(value.substring(8, 16));\\n var statusInt = hexToDecimal(statusHex);\\n var statusDevice = '';\\n if ((statusInt & 1) == 1) {\\n statusDevice += 'GPS,';\\n }\\n if ((statusInt & 2) == 2) {\\n statusDevice += 'WIFISource,';\\n }\\n if ((statusInt & 4) == 4) {\\n statusDevice += 'CellTower,';\\n }\\n if ((statusInt & 8) == 8) {\\n statusDevice += 'BLELocation,';\\n }\\n //params.BatteryStatus.BatteryStatus = '1';\\n if ((statusInt & 16) == 16) {\\n statusDevice += 'Charging,';\\n // var alarm = 'BATCN';\\n //configs.BatteryStatus.BatteryStatus = '1';\\n /* if (configs.BatteryStatus.BatteryStatus !== '1') {\\n hasConfigs = true;\\n var batteryStatus = '1';\\n var alarm = 'BATCN';\\n let configsToUpdate = [];\\n configsToUpdate.push({\\n 'code': configIds.BatteryStatus.BatteryStatus,\\n 'value': batteryStatus\\n });\\n }*/\\n }\\n if ((statusInt & 32) == 32) {\\n statusDevice += 'FUllyCharged,';\\n //var alarm = 'BATF';\\n // configs.BatteryStatus.BatteryStatus = '3';\\n /* if (configs.BatteryStatus.BatteryStatus !== '3') {\\n hasConfigs = true;\\n var batteryStatus = '3';\\n var alarm = 'BATF';\\n let configsToUpdate = [];\\n configsToUpdate.push({\\n 'code': configIds.BatteryStatus.BatteryStatus,\\n 'value': batteryStatus\\n });\\n }*/\\n }\\n /* if (!((statusInt & 32) == 32) & !((statusInt & 16) == 16)) {\\n statusDevice += 'Not Charging,';\\n var alarm = 'BATCF';\\n //configs.BatteryStatus.BatteryStatus = '2';\\n if (configs.BatteryStatus.BatteryStatus !== '2') {\\n var batteryStatus = '2';\\n var alarm = 'BATCF';\\n let configsToUpdate = [];\\n configsToUpdate.push({\\n 'code': configIds.BatteryStatus.BatteryStatus,\\n 'value': batteryStatus\\n });\\n }\\n }*/\\n if ((statusInt & 64) == 64) {\\n statusDevice += 'Reboot,';\\n }\\n if ((statusInt & 128) == 128) {\\n statusDevice += 'HistoricalData,';\\n }\\n if ((statusInt & 256) == 256) {\\n statusDevice += 'AGPSDataValid,';\\n }\\n if ((statusInt & 512) == 512) {\\n statusDevice += 'Motion,';\\n }\\n if ((statusInt & 1024) == 1024) {\\n statusDevice += 'SmartLocating,';\\n }\\n if ((statusInt & 2048) == 2048) { //isHome\\n statusDevice += 'BeaconLocation,';\\n }\\n if ((statusInt & 4096) == 4096) {\\n statusDevice += 'BLEConnected,';\\n }\\n if ((statusInt & 16384) == 16384) {\\n statusDevice += 'HomeWiFi,';\\n }\\n statusDevice = statusDevice.slice(0, -1);\\n status_data = statusDevice; //to oysta template\\n //statusHex = (statusHex);\\n statusHex = 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 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 = (`Watch-${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 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 = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n }\\n break;\\n //BLE Connected . For Flic button\\n case '62':\\n location_type = 'BLE';\\n //var alarm = 'EBZI'; \\n //var latitudeHex = '00';\\n //var longitudeHex = '00';\\n //var descr = 'empty';\\n var flag = hexToDecimal(value.substring(0, 2)); // 0= Disconnected, 1= Connected\\n var mac = value.substring(2, 14); // No hace falta darle la vuelta\\n // add : format in MAC\\n mac = mac.match(/.{1,2}/g).join(':');\\n var batLevel = hexToDecimal(value.substring(14, 16)); // 0-100\\n //location_time = timestamp;\\n ble_data = `${flag},${batLevel},${mac}`;\\n general += 'BLE location (State):' + flag + ', (bat):' + batLevel + ', (mac):' + mac + ',';\\n break;\\n }\\n }\\n if (alarmCode) {\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};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 = (`Watch;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 = (`Watch;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 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 = (`Watch;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 = (`Watch;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 '0F': // Enable control.... Used for STEP COUNTING SETTINGS\\n // 'FF FF 21 80'\\n var StepStatus = hex2bin(value.substring(4, 6));\\n var enalbleDisable = '';\\n if (StepStatus.substring(7, 8) == '1') {\\n var step = 'Enable, '\\n enalbleDisable = '1'\\n } else {\\n var step = 'Disable, '\\n };\\n //var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\n //hrate += detectingInterval;\\n AddValue(codeValues, \\\"step\\\", step);\\n //var imei = serverParams.Imei;\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(configsToUpdate, configIds.ReadStepsSettings.EnableDisableReadStepsSettings, enalbleDisable);\\n //AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\n configsToAck.push(configIds.ReadStepsSettings.EnableDisableReadStepsSettings);\\n //configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\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 = (`Watch;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 '34': //ContactList with name\\n var contactNumber = value.substring(1, 2);\\n var telLength = hexToDecimal(value.substring(2, 4));\\n var tel = '';\\n switch (contactNumber) {\\n // Emergency Number\\n case '0':\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\n AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\n AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\n configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\n break;\\n // Speed Dial Number\\n //case '1':\\n // tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\n // AddValue(codeValues, \\\"SpeedDialNumber\\\", tel);\\n // AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.SpeedDialNumber, tel);\\n // configsToAck.push(configIds.ReadSpeedDialSettings.SpeedDialNumber);\\n // break;\\n // Gateway Number\\n case '9': //00447781482635,Esendex UK 0034627177148,Esendex Spain 00447507288240,Esendex UK Acceptance\\n tel = 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 AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'));\\n configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\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 = (`Watch;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 = (`Watch;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 '46': //HeartRate\\n // '10 0E 00 80'\\n var HeartRateStatus = hex2bin(value.substring(6, 8));\\n var enalbleDisable = '';\\n if (HeartRateStatus.substring(0, 1) == '1') {\\n var hrate = 'Enable, '\\n enalbleDisable = '1'\\n } else {\\n var hrate = 'Disable, '\\n };\\n var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\n hrate += detectingInterval;\\n AddValue(codeValues, \\\"hrate\\\", hrate);\\n //var imei = serverParams.Imei;\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings, enalbleDisable);\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\n configsToAck.push(configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings);\\n configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\n break;\\n case '47': // Custom Id\\n imei = serverParams.Imei;\\n messageForReceiver = (`Watch;ACK-CUSTID;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"customeid\\\", value);\\n AddValue(configsToUpdate, configIds.ReadState.CustomId, hex_to_ascii(value)); //now it comes \\\"3036\\\"\\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 // commented until Eview fixes this function\\n /*\\n messageForReceiver = (`Watch;ACK-NOMOTION;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"nomotion\\\", alertSetting);\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings, enableDisable);\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\n configsToAck.push(configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings);\\n configsToAck.push(configIds.ReadNonMovementSettings.Time);\\n */\\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 = (`Watch;ACK-FALLALERT;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n var sesibityOptionValue = hexToDecimal(value.substring(1, 2));\\n sensibility += sesibityOptionValue;\\n AddValue(codeValues, \\\"sensibility\\\", sensibility);\\n //AddValue(configsToUpdate, configIds.ReadAlertSettings.FallSettings, sensibility);\\n AddValue(configsToUpdate, configIds.ReadFallSettings.EnableDisableFallSettings, enalbleDisable);\\n AddValue(configsToUpdate, configIds.ReadFallSettings.Sensitivity, sesibityOptionValue);\\n //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\n configsToAck.push(configIds.ReadFallSettings.EnableDisableFallSettings);\\n configsToAck.push(configIds.ReadFallSettings.Sensitivity);\\n break;\\n case '73': //BeaconList\\n var beaconNumber = hexToDecimal(value.substring(1, 2));\\n var beaconStatus = hex2bin(value.substring(0, 1));\\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 = (`Watch;ACK-GDATA;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\n configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\n break;\\n case '4A': //Wifi Network List\\n var wifiSSIDLenght = hexToDecimal(value.substring(2, 4));\\n var wifiPasswordLenght = hexToDecimal(value.substring(4, 6));\\n var wifiIndex = hexToDecimal(value.substring(1, 2));\\n //var wifiStatus = hexToDecimal(value.substring(0, 1));\\n var wifiStatus = value.substring(0, 1);\\n /*var enalbleDisable = wifiSSID = wifiPassword = homeWifi = '';\\n /var homeWifi = '';\\n if (wifiIndex == '0') { // Only first Wifi of the list\\n if (wifiStatus == '8') {\\n homeWifi += ' Enable, '\\n enalbleDisable = '1';\\n } else {\\n homeWifi += ' Disable, '\\n //enalbleDisable = '0';\\n };*/\\n if ((wifiStatus == '8') || (wifiStatus == 'C')) { // 8 == ON OR C== ON and Connected\\n var wifiSSID = 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 = (`Watch;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 = (`Watch;ACK-SPEED;${imei};`);\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n AddValue(codeValues, \\\"speed\\\", alertSetting);\\n AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\n configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\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 //return;\\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 messageForReceiver = (`Watch-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 if (alarmCode) {\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};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 = (`Watch-ACK;${imei};${message}`); // ${sequenceID}; add ${sequenceID}; 19-07\\n sendMessageToLocalhostNoWait(messageForReceiver);\\n var value = message.substring(index, index = index + keyLength - 2);\\n if (typeof configIds !== 'undefined' && configIds && configIds.ConfigureDevice && configIds.ConfigureDevice.LastConfigured) { // when is defined\\n AddValue(configsToUpdate, configIds.ConfigureDevice.LastConfigured, moment().format('YYYY/MM/DD, HH:mm:ss'));\\n configsToAck.push(configIds.ConfigureDevice.LastConfigured);\\n }\\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 // operation functions\\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 // Utils functions\\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(hex) { // Hex to Ascii \\n if (hex.length % 2 !== 0) {\\n throw new Error(\\\"Hex string length must be even\\\");\\n }\\n let ascii = '';\\n for (let i = 0; i < hex.length; i += 2) {\\n const byte = hex.substr(i, 2);\\n const charCode = parseInt(byte, 16);\\n if (charCode !== 0) { // remove null character (\\\\u0000)\\n ascii += String.fromCharCode(charCode);\\n }\\n }\\n return ascii;\\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 hexToBytes(hex) {\\n return Uint8Array.from(hex.replace(/[^0-9a-f]/gi, \\\"\\\").match(/.{1,2}/g).map(b => parseInt(b, 16)));\\n }\\n\\n function bytesToHex(bytes) {\\n return Array.from(bytes, b => b.toString(16).padStart(2, \\\"0\\\").toUpperCase()).join(\\\"\\\");\\n }\\n // --- Multimsg splitter ---\\n function splitFramesFromHexStream(hex) {\\n const buf = hexToBytes(hex);\\n const frames = [];\\n const errors = [];\\n let i = 0;\\n while (i < buf.length) {\\n // Search header 0xAB\\n while (i < buf.length && buf[i] !== 0xAB) i++;\\n if (i >= buf.length) break;\\n const start = i;\\n // necesitamos al menos cabecera mínima: H(1)+Prop(1)+Len(2)+CRC(2)+Seq(2)=8\\n if (buf.length - i < 8) {\\n errors.push({\\n offset: i,\\n reason: \\\"Quedan menos de 8 bytes para cabecera\\\"\\n });\\n break; // incompleto al final del stream\\n }\\n const props = buf[i + 1];\\n const len = buf[i + 2] | (buf[i + 3] << 8); // Length LE (solo body)\\n const total = 1 + 1 + 2 + 2 + 2 + len;\\n if (len > 1024) {\\n errors.push({\\n offset: i,\\n reason: `Length fuera de rango (${len})`\\n });\\n i++; // re-sync: avanzar 1 y seguir buscando siguiente 0xAB\\n continue;\\n }\\n if (buf.length - i < total) {\\n errors.push({\\n offset: i,\\n reason: `Frame incompleto: requiere ${total} bytes`\\n });\\n break; // final del stream sin completar\\n }\\n const frameBytes = buf.slice(i, i + total);\\n frames.push(bytesToHex(frameBytes));\\n i += total; // saltar al siguiente posible frame\\n }\\n return {\\n frames,\\n errors\\n };\\n }\\n // --- Decodificador de stream (N frames concatenados) ---\\n function decodeHexStream(hex) {\\n const {\\n frames,\\n errors\\n } = splitFramesFromHexStream(hex);\\n const decoded = frames.map(h => {\\n try {\\n return {\\n ok: true,\\n ...decoder(h)\\n };\\n } catch (e) {\\n return {\\n ok: false,\\n error: e.message,\\n rawHex: h\\n };\\n }\\n });\\n return {\\n decoded,\\n splitErrors: errors\\n };\\n }\\n\\n function sendMessageToLocalhostNoWait(str) { // sends message to system, closing connection after\\n var server;\\n if (localTesting) {\\n console.log('local testing - sending to 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":1758638721},{"Type":1,"NewValue":"{\"Id\":437,\"Name\":\"Access TEC Care Watch\",\"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 // Watch protocol - please see variables and typical values in order below\\r\\n // Watch-CYC;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;SIGNAL=<>;WM=<>;GENERAL=<>\\r\\n // Watch-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\r\\n //\\r\\n // Author: Juanmi Navarro\\r\\n // Created: 01/01/0000\\r\\n // Last modified: 18/09/2025\\r\\n //\\r\\n ///////////////////////////////////////////////////////////////////////////////\\r\\n if (typeof localTesting === \\\"undefined\\\") {\\r\\n let localTesting = false;\\r\\n }\\r\\n const crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,\\r\\n 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,\\r\\n 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,\\r\\n 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,\\r\\n 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,\\r\\n 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,\\r\\n 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,\\r\\n 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,\\r\\n 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,\\r\\n 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,\\r\\n 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,\\r\\n 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,\\r\\n 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,\\r\\n 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,\\r\\n 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,\\r\\n 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,\\r\\n 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,\\r\\n 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,\\r\\n 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,\\r\\n 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,\\r\\n 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,\\r\\n 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n ];\\r\\n var codeValues = [];\\r\\n AddValue(codeValues, 'protocol_template', 'Watch');\\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 = (`Watch-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 var allowedCID = ['3036', '06'];\\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 } 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 }\\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 //<>,<>,<> \\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];\\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 //<>,<>,<> \\r\\n if (mac2) {\\r\\n AddValue(codeValues, 'beacon_mac', mac2);\\r\\n var simpleQuery2 = [{\\r\\n 'code': 'Mac',\\r\\n 'value': mac2,\\r\\n }];\\r\\n var simpleQueryLabel2 = {\\r\\n 'table': 'beacons',\\r\\n 'select': 'Name',\\r\\n 'query': simpleQuery2\\r\\n };\\r\\n var labels2 = [];\\r\\n labels2.push(JSON.stringify(simpleQueryLabel2));\\r\\n AddValue(codeValues, 'oysta_labels', JSON.stringify(labels2));\\r\\n }\\r\\n if (params.beacon_major) {\\r\\n AddValue(codeValues, 'beacon_major', params.beacon_major);\\r\\n } else {\\r\\n AddValue(codeValues, 'beacon_major', 0);\\r\\n }\\r\\n if (params.beacon_minor) {\\r\\n AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\r\\n } else {\\r\\n AddValue(codeValues, 'beacon_minor', 0);\\r\\n }\\r\\n //AddValue(codeValues,'oysta_labels', label);\\r\\n //AddValue(codeValues,'oysta_value', mac);\\r\\n }\\r\\n /* meter mas tarde... \\r\\n if (params.smart_data !== 'undefined') {\\r\\n var gen_location = params.smart_data.split(',')\\r\\n var latitude = gen_location[0]\\r\\n var longitude = gen_location[1]\\r\\n var location_accuracy = gen_location[2]\\r\\n var altitude = gen_location[3]\\r\\n AddValue(codeValues,'latitude', latitude);\\r\\n AddValue(codeValues,'longitude', longitude);\\r\\n AddValue(codeValues,'altitude', altitude);\\r\\n AddValue(codeValues,'location_accuracy', location_accuracy);\\r\\n }\\r\\n */\\r\\n /*else if ((params.event_time) && (params.event_time == '')) {\\r\\n var event_time = moment.utc().unix();\\r\\n AddValue(codeValues,'event_time', event_time);\\r\\n } revisar mas adelante*/\\r\\n if (params.location_time) {\\r\\n AddValue(codeValues, 'location_time', params.location_time);\\r\\n }\\r\\n if (params.event_time) {\\r\\n AddValue(codeValues, 'event_time', params.event_time);\\r\\n }\\r\\n // to parse SMS info from the device\\r\\n switch (messageTypeLocalCode) {\\r\\n case 'COMM-SMS': // SMS message sent in\\r\\n if (params.data.startsWith('Device location request')) {\\r\\n configsToAck.push(configIds.Controls.RealTimeLocate);\\r\\n } else if (params.data.startsWith('Set IP ok')) {\\r\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n } else if (params.data.startsWith('IMEI:')) {\\r\\n configsToAck.push(configIds.Controls.GetFirmwareVersion);\\r\\n } else if (params.data.startsWith('Set IP ok')) {\\r\\n configsToAck.push(configIds.Controls.ClearBufferedMessages);\\r\\n } else if (params.data.startsWith('flush ok')) {\\r\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n } else if (params.data.startsWith('Set Watch-')) {\\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 = (`Watch-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 = (`Watch;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 = (`Watch;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 = (`Watch-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 // decode global msg\\r\\n function decoder(str) { // decode rawdata\\r\\n // CARE Decoder\\r\\n //AddValue(codeValues, 'Message : ', str);\\r\\n var message = str;\\r\\n var index = 18;\\r\\n //parse header & properties\\r\\n var properties = message.substring(2, 4);\\r\\n var lengthLittleEndian = message.substring(4, 8);\\r\\n var total_length = lengthLittleEndian.substring(2, 4) + lengthLittleEndian.substring(0, 2);\\r\\n total_length = 2 * hexToDecimal(total_length.substring(0, 4));\\r\\n var sequenceID = message.substring(12, 16);\\r\\n var command = message.substring(16, 18);\\r\\n //mask bitwise (properties should be '10')\\r\\n if ((parseInt(properties) & 8) == 8) {\\r\\n needsAck = true;\\r\\n } else needsAck = false;\\r\\n // need to check if checksum is correct for possible msg corruption 10/03/23\\r\\n var checksum = message.substring(8, 12);\\r\\n var messageBody = message.substring(16, message.length);\\r\\n debug('message =' + message);\\r\\n debug('checksum =' + checksum);\\r\\n debug('calculateCheckSum =' + calculateCheckSum(messageBody));\\r\\n if (calculateCheckSum(messageBody) == checksum) { // payload is valid\\r\\n debug(\\\"message has valid checksum\\\");\\r\\n var messageBody = command; // update value for the ACK\\r\\n debug('command =' + command);\\r\\n if (command == '01') {\\r\\n while (index < total_length + 16) {\\r\\n 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\\r\\n if ((alarmCodeExtInt & 1) == 1) {\\r\\n var alarm = 'ALF-C';\\r\\n }\\r\\n // Welfare Check-out\\r\\n else if ((alarmCodeExtInt & 2) == 2) {\\r\\n var alarm = 'ALA-C';\\r\\n }\\r\\n // Standard Alerts\\r\\n //Battery low\\r\\n else if ((alarmCodeInt & 1) == 1) {\\r\\n var alarm = 'BATL';\\r\\n }\\r\\n //Overspeed\\r\\n else if ((alarmCodeInt & 2) == 2) {\\r\\n var alarm = 'ALSP';\\r\\n }\\r\\n //Fall\\r\\n else if ((alarmCodeInt & 4) == 4) {\\r\\n var alarm = 'ALF';\\r\\n }\\r\\n //Tilt\\r\\n else if ((alarmCodeInt & 8) == 8) {\\r\\n var alarm = 'TLT';\\r\\n } else if ((alarmCodeInt & 16) == 16) {\\r\\n if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n var alarm = 'Geo1-IN';\\r\\n } else {\\r\\n var alarm = 'Geo1-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 32) == 32) {\\r\\n if ((alarmCodeInt & 33554432) == 33554432) {\\r\\n var alarm = 'Geo2-IN';\\r\\n } else {\\r\\n var alarm = 'Geo2-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 64) == 64) {\\r\\n if ((alarmCodeInt & 67108864) == 67108864) {\\r\\n var alarm = 'Geo3-IN';\\r\\n } else {\\r\\n var alarm = 'Geo3-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 128) == 128) {\\r\\n if ((alarmCodeInt & 134217728) == 134217728) {\\r\\n var alarm = 'Geo4-IN';\\r\\n } else {\\r\\n var alarm = 'Geo4-OUT';\\r\\n }\\r\\n }\\r\\n //Power Off\\r\\n else if ((alarmCodeInt & 256) == 256) {\\r\\n var alarm = 'PWRF';\\r\\n }\\r\\n //Power On\\r\\n else if ((alarmCodeInt & 512) == 512) {\\r\\n var alarm = 'PWRN';\\r\\n }\\r\\n //Motion\\r\\n else if ((alarmCodeInt & 1024) == 1024) {\\r\\n var alarm = 'ALMOV';\\r\\n }\\r\\n //No Motion\\r\\n else if ((alarmCodeInt & 2048) == 2048) {\\r\\n var alarm = 'ALNM';\\r\\n }\\r\\n //SOS\\r\\n else if ((alarmCodeInt & 4096) == 4096) {\\r\\n var alarm = 'ALSOS';\\r\\n } else if ((alarmCodeInt & 8192) == 8192) {\\r\\n var alarm = 'Side1';\\r\\n } else if ((alarmCodeInt & 16384) == 16384) {\\r\\n var alarm = 'Side2';\\r\\n }\\r\\n //Battery charging\\r\\n else if ((alarmCodeInt & 32768) == 32768) {\\r\\n var alarm = 'BATCN';\\r\\n }\\r\\n //Battery no charging\\r\\n else if ((alarmCodeInt & 65536) == 65536) {\\r\\n var alarm = 'BATCF';\\r\\n }\\r\\n //SOS Ending\\r\\n // Temporary Commented until we know exactly how it works. 22/09/2022\\r\\n else if ((alarmCodeInt & 131072) == 131072) {\\r\\n var alarm = 'ALA-F';\\r\\n info = 'Alarm Finished';\\r\\n }\\r\\n //Amber Alert EC03 only\\r\\n else if ((alarmCodeInt & 262144) == 262144) {\\r\\n var alarm = 'ALA';\\r\\n }\\r\\n // welfare Alert check-in ALA-O\\r\\n else if ((alarmCodeInt & 524288) == 524288) {\\r\\n var alarm = 'ALA-O';\\r\\n }\\r\\n // Amber alert Ending ALA-C\\r\\n else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n var alarm = 'ALA-C';\\r\\n }\\r\\n // Amber alert Ending ALA-C\\r\\n //else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n // var alarm = 'ALA-C';\\r\\n //}\\r\\n // Fall-Down Alert ending\\r\\n else if ((alarmCodeInt & 2097152) == 2097152) {\\r\\n var alarm = 'ALF-C';\\r\\n }\\r\\n // welfare Alert Ending ALA\\r\\n else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n var alarm = 'ALA';\\r\\n }\\r\\n // Beacon absent Alert 11/10/22. Need to be added in msg types\\r\\n //else if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n // var alarm = 'BEA';\\r\\n //}\\r\\n general += 'alarm:' + alarm + ',';\\r\\n break;\\r\\n //Custom ID\\r\\n case '03':\\r\\n customID = value;\\r\\n if (!allowedCID.includes(value)) {\\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 //<>,<>,<>,<>,<>\\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 if (!allowedCID.includes(customID)) {\\r\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n AddValue(codeValues, \\\"customID\\\", customID);\\r\\n return\\r\\n }\\r\\n //if (alarmCode) {\\r\\n // messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = '';\\r\\n //= gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n //} else \\r\\n if (statusDevice) {\\r\\n messageForReceiver = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = '';\\r\\n 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 alarm = alarmCode =\\r\\n //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;\\r\\n var statusHex = changeEndianness(value.substring(8, 16));\\r\\n var statusInt = hexToDecimal(statusHex);\\r\\n var statusDevice = '';\\r\\n if ((statusInt & 1) == 1) {\\r\\n statusDevice += 'GPS,';\\r\\n }\\r\\n if ((statusInt & 2) == 2) {\\r\\n statusDevice += 'WIFISource,';\\r\\n }\\r\\n if ((statusInt & 4) == 4) {\\r\\n statusDevice += 'CellTower,';\\r\\n }\\r\\n if ((statusInt & 8) == 8) {\\r\\n statusDevice += 'BLELocation,';\\r\\n }\\r\\n //params.BatteryStatus.BatteryStatus = '1';\\r\\n if ((statusInt & 16) == 16) {\\r\\n statusDevice += 'Charging,';\\r\\n // var alarm = 'BATCN';\\r\\n //configs.BatteryStatus.BatteryStatus = '1';\\r\\n /* if (configs.BatteryStatus.BatteryStatus !== '1') {\\r\\n hasConfigs = true;\\r\\n var batteryStatus = '1';\\r\\n var alarm = 'BATCN';\\r\\n let configsToUpdate = [];\\r\\n configsToUpdate.push({\\r\\n 'code': configIds.BatteryStatus.BatteryStatus,\\r\\n 'value': batteryStatus\\r\\n });\\r\\n }*/\\r\\n }\\r\\n if ((statusInt & 32) == 32) {\\r\\n statusDevice += 'FUllyCharged,';\\r\\n //var alarm = 'BATF';\\r\\n // configs.BatteryStatus.BatteryStatus = '3';\\r\\n /* if (configs.BatteryStatus.BatteryStatus !== '3') {\\r\\n hasConfigs = true;\\r\\n var batteryStatus = '3';\\r\\n var alarm = 'BATF';\\r\\n let configsToUpdate = [];\\r\\n configsToUpdate.push({\\r\\n 'code': configIds.BatteryStatus.BatteryStatus,\\r\\n 'value': batteryStatus\\r\\n });\\r\\n }*/\\r\\n }\\r\\n /* if (!((statusInt & 32) == 32) & !((statusInt & 16) == 16)) {\\r\\n statusDevice += 'Not Charging,';\\r\\n var alarm = 'BATCF';\\r\\n //configs.BatteryStatus.BatteryStatus = '2';\\r\\n if (configs.BatteryStatus.BatteryStatus !== '2') {\\r\\n var batteryStatus = '2';\\r\\n var alarm = 'BATCF';\\r\\n let configsToUpdate = [];\\r\\n configsToUpdate.push({\\r\\n 'code': configIds.BatteryStatus.BatteryStatus,\\r\\n 'value': batteryStatus\\r\\n });\\r\\n }\\r\\n }*/\\r\\n if ((statusInt & 64) == 64) {\\r\\n statusDevice += 'Reboot,';\\r\\n }\\r\\n if ((statusInt & 128) == 128) {\\r\\n statusDevice += 'HistoricalData,';\\r\\n }\\r\\n if ((statusInt & 256) == 256) {\\r\\n statusDevice += 'AGPSDataValid,';\\r\\n }\\r\\n if ((statusInt & 512) == 512) {\\r\\n statusDevice += 'Motion,';\\r\\n }\\r\\n if ((statusInt & 1024) == 1024) {\\r\\n statusDevice += 'SmartLocating,';\\r\\n }\\r\\n if ((statusInt & 2048) == 2048) { //isHome\\r\\n statusDevice += 'BeaconLocation,';\\r\\n }\\r\\n if ((statusInt & 4096) == 4096) {\\r\\n statusDevice += 'BLEConnected,';\\r\\n }\\r\\n if ((statusInt & 16384) == 16384) {\\r\\n statusDevice += 'HomeWiFi,';\\r\\n }\\r\\n statusDevice = statusDevice.slice(0, -1);\\r\\n status_data = statusDevice; //to oysta template\\r\\n //statusHex = (statusHex);\\r\\n statusHex = hex2bin(statusHex);\\r\\n statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\r\\n battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\r\\n cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\r\\n workMode = parseInt(statusHex.substring(13, 16), 2);\\r\\n general += 'statusDevice:' + statusDevice + ',';\\r\\n if (battery_percentage) {\\r\\n general += 'battery:' + battery_percentage + ',';\\r\\n }\\r\\n if (cellNetworkSignal) {\\r\\n general += 'cellNetworkSignal:' + cellNetworkSignal + ',';\\r\\n }\\r\\n if (workMode) {\\r\\n general += 'workMode:' + workMode + ',';\\r\\n }\\r\\n //messageForReceiver = (`CareWatch-CYC;${imei};${i};${event_time};${battery_percentage}`);\\r\\n break;\\r\\n //Call Records\\r\\n case '25':\\r\\n //Needed?\\r\\n break;\\r\\n //BLE Location 2\\r\\n case '26':\\r\\n //I don't understand\\r\\n //messageBody = messageBody + keyLengthHex + key + value;\\r\\n break;\\r\\n //Smart Location\\r\\n case '27':\\r\\n location_type = 'SMART';\\r\\n var latitudeHex = value.substring(0, 8);\\r\\n var longitudeHex = value.substring(8, 16);\\r\\n var location_accuracyHex = value.substring(16, 20);\\r\\n var altitudeHex = value.substring(20, 24);\\r\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n var altitude = hexToDecimal(changeEndianness(altitudeHex));\\r\\n //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\r\\n //04/08/2022 se quita el multiplicador por 5 pq ya viene el valor en metros\\r\\n location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\r\\n //location_time = timestamp;\\r\\n smart_data = `${latitude},${longitude},${location_accuracy},${altitude}`;\\r\\n general += 'smart location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n break;\\r\\n //Beacon Location Added 11/10/22\\r\\n case '28':\\r\\n location_type = 'BEACON';\\r\\n // var alarm = 'EBZI';\\r\\n var latitudeHex = '00';\\r\\n var longitudeHex = '00';\\r\\n var descr = 'empty';\\r\\n var flag = hexToDecimal(value.substring(0, 1));\\r\\n var beacId = hexToDecimal(value.substring(1, 2));\\r\\n // msg includes descrip\\r\\n if ((flag & 4) == 4) {\\r\\n descr = hex_to_ascii(value.substring(18, value.length));\\r\\n }\\r\\n // msg includes lat/lon\\r\\n if ((flag & 8) == 8) {\\r\\n latitudeHex = value.substring(18, 26);\\r\\n longitudeHex = value.substring(26, 34);\\r\\n }\\r\\n // msg includes lat/lon and description\\r\\n if ((flag & 12) == 12) {\\r\\n latitudeHex = value.substring(18, 26);\\r\\n longitudeHex = value.substring(26, 34);\\r\\n descr = hex_to_ascii(value.substring(34, value.length));\\r\\n }\\r\\n var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n // add : format in MAC\\r\\n mac = mac.match(/.{1,2}/g).join(':');\\r\\n var rssiHex = value.substring(14, 16);\\r\\n var rssi1Hex = value.substring(16, 18);\\r\\n rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\r\\n rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\r\\n // var latitudeHex = value.substring(18, 26);\\r\\n // var longitudeHex = value.substring(26, 34);\\r\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n //location_time = timestamp;\\r\\n beacon_data = `${latitude},${longitude},${mac},${descr}`;\\r\\n general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (listIndex):' + beacId + ',';\\r\\n break;\\r\\n // Beacon V2\\r\\n case '2C':\\r\\n location_type = 'BEACON';\\r\\n // var alarm = 'EBZI';\\r\\n var latitudeHex = '00';\\r\\n var longitudeHex = '00';\\r\\n var descr = 'empty';\\r\\n var flag = hexToDecimal(value.substring(0, 1));\\r\\n var beacId = hexToDecimal(value.substring(1, 2));\\r\\n // msg includes descrip\\r\\n if ((flag & 4) == 4) {\\r\\n let desc_leng = hexToDecimal(value.substring(20, 22));\\r\\n descr = hex_to_ascii(value.substring(22, 22 + (2 * desc_leng)));\\r\\n //descr = hex_to_ascii(value.substring(18, value.length));\\r\\n }\\r\\n // msg includes lat/lon\\r\\n if ((flag & 8) == 8) {\\r\\n latitudeHex = value.substring(18, 26);\\r\\n longitudeHex = value.substring(26, 34);\\r\\n }\\r\\n // msg includes lat/lon and description\\r\\n if ((flag & 12) == 12) {\\r\\n latitudeHex = value.substring(20, 28);\\r\\n longitudeHex = value.substring(28, 36);\\r\\n let desc_leng = hexToDecimal(value.substring(36, 38));\\r\\n descr = hex_to_ascii(value.substring(38, 38 + (2 * desc_leng)));\\r\\n }\\r\\n var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n // add : format in MAC\\r\\n mac = mac.match(/.{1,2}/g).join(':');\\r\\n var rssiHex = value.substring(14, 16);\\r\\n var rssi1Hex = value.substring(16, 18);\\r\\n rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\r\\n rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\r\\n var battery_beacon = hexToDecimal(value.substring(18, 20));\\r\\n latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n //location_time = timestamp;\\r\\n beacon_data = `${latitude},${longitude},${mac},${descr}`;\\r\\n general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (battery):' + battery_beacon + ', (listIndex):' + beacId + ',';\\r\\n break;\\r\\n //Cell Towers Note\\r\\n case '29':\\r\\n location_type = 'LBS';\\r\\n lbs_data = '';\\r\\n var mccHex = changeEndianness(value.substring(0, 4));\\r\\n var mncHex = value.substring(4, 6);\\r\\n var mcc = hexToDecimal(mccHex);\\r\\n lbs_data += mcc + ',';\\r\\n var mnc = hexToDecimal(mncHex);\\r\\n lbs_data += mnc + ',';\\r\\n var indexLbs = 6;\\r\\n var numTowers = (hexToDecimal(keyLengthHex) - 4) / 7;\\r\\n for (let i = 0; i < numTowers; i++) {\\r\\n var rxlHex = changeEndianness(value.substring(indexLbs, indexLbs + 2));\\r\\n var rxl = hexToDecimal(rxlHex);\\r\\n var lacHex = changeEndianness(value.substring(indexLbs + 2, indexLbs + 6));\\r\\n var lac = hexToDecimal(lacHex);\\r\\n var cellTowers = hexToDecimal(changeEndianness(value.substring(indexLbs + 6, indexLbs + 14)));\\r\\n lbs_data += rxl + ',' + lac + ',' + cellTowers + ',';\\r\\n indexLbs += 14;\\r\\n }\\r\\n lbs_data = lbs_data.slice(0, -1);\\r\\n general += lbs_data;\\r\\n break;\\r\\n case '30':\\r\\n //G-sensor.\\r\\n 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 = (`Watch-${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 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 = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n }\\r\\n break;\\r\\n //BLE Connected . For Flic button\\r\\n case '62':\\r\\n location_type = 'BLE';\\r\\n //var alarm = 'EBZI'; \\r\\n //var latitudeHex = '00';\\r\\n //var longitudeHex = '00';\\r\\n //var descr = 'empty';\\r\\n var flag = hexToDecimal(value.substring(0, 2)); // 0= Disconnected, 1= Connected\\r\\n var mac = value.substring(2, 14); // No hace falta darle la vuelta\\r\\n // add : format in MAC\\r\\n mac = mac.match(/.{1,2}/g).join(':');\\r\\n var batLevel = hexToDecimal(value.substring(14, 16)); // 0-100\\r\\n //location_time = timestamp;\\r\\n ble_data = `${flag},${batLevel},${mac}`;\\r\\n general += 'BLE location (State):' + flag + ', (bat):' + batLevel + ', (mac):' + mac + ',';\\r\\n break;\\r\\n }\\r\\n }\\r\\n if (alarmCode) {\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch;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 = (`Watch;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': // Ringer Volume\\r\\n var volume = hexToDecimal(value);\\r\\n imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;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 = (`Watch;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 '0F': // Enable control.... Used for STEP COUNTING SETTINGS\\r\\n // 'FF FF 21 80'\\r\\n var StepStatus = hex2bin(value.substring(4, 6));\\r\\n var enalbleDisable = '';\\r\\n if (StepStatus.substring(7, 8) == '1') {\\r\\n var step = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var step = 'Disable, '\\r\\n };\\r\\n //var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n //hrate += detectingInterval;\\r\\n AddValue(codeValues, \\\"step\\\", step);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadStepsSettings.EnableDisableReadStepsSettings, enalbleDisable);\\r\\n //AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadStepsSettings.EnableDisableReadStepsSettings);\\r\\n //configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\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 = (`Watch;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 '34': //ContactList with name\\r\\n var contactNumber = value.substring(1, 2);\\r\\n var telLength = hexToDecimal(value.substring(2, 4));\\r\\n var tel = '';\\r\\n switch (contactNumber) {\\r\\n // Emergency Number\\r\\n case '0':\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n break;\\r\\n // Speed Dial Number\\r\\n //case '1':\\r\\n // tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n // AddValue(codeValues, \\\"SpeedDialNumber\\\", tel);\\r\\n // AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.SpeedDialNumber, tel);\\r\\n // configsToAck.push(configIds.ReadSpeedDialSettings.SpeedDialNumber);\\r\\n // break;\\r\\n // Gateway Number\\r\\n case '9': //00447781482635,Esendex UK 0034627177148,Esendex Spain 00447507288240,Esendex UK Acceptance\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n if (tel.includes('447781482635') || tel.includes('00447781482635')) {\\r\\n tel = 'Esendex UK'\\r\\n } else if (tel.includes('34627177148') || tel.includes('0034627177148')) {\\r\\n tel = 'Esendex Spain'\\r\\n } else if (tel.includes('447507288240') || tel.includes('00447507288240')) {\\r\\n tel = 'Esendex UK Acceptance'\\r\\n } else {\\r\\n tel = 'Default'\\r\\n }\\r\\n AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n break;\\r\\n default:\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n if (tel.length < 6) {\\r\\n contacts += '';\\r\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n break;\\r\\n }\\r\\n //contacts += 'A' + (contactNumber - 1) + ': ' + tel + ', ';\\r\\n contacts += tel + ', ';\\r\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n break;\\r\\n }\\r\\n break;\\r\\n case '40': // APN\\r\\n //no ACK need\\r\\n AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'));\\r\\n configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\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 = (`Watch;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 = (`Watch;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 '46': //HeartRate\\r\\n // '10 0E 00 80'\\r\\n var HeartRateStatus = hex2bin(value.substring(6, 8));\\r\\n var enalbleDisable = '';\\r\\n if (HeartRateStatus.substring(0, 1) == '1') {\\r\\n var hrate = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var hrate = 'Disable, '\\r\\n };\\r\\n var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n hrate += detectingInterval;\\r\\n AddValue(codeValues, \\\"hrate\\\", hrate);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings);\\r\\n configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\r\\n break;\\r\\n case '47': // Custom Id\\r\\n imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;ACK-CUSTID;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"customeid\\\", value);\\r\\n AddValue(configsToUpdate, configIds.ReadState.CustomId, hex_to_ascii(value)); //now it comes \\\"3036\\\"\\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 // commented until Eview fixes this function\\r\\n /*\\r\\n messageForReceiver = (`Watch;ACK-NOMOTION;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"nomotion\\\", alertSetting);\\r\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings, enableDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n configsToAck.push(configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings);\\r\\n configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n */\\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 = (`Watch;ACK-FALLALERT;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n var sesibityOptionValue = hexToDecimal(value.substring(1, 2));\\r\\n sensibility += sesibityOptionValue;\\r\\n AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n //AddValue(configsToUpdate, configIds.ReadAlertSettings.FallSettings, sensibility);\\r\\n AddValue(configsToUpdate, configIds.ReadFallSettings.EnableDisableFallSettings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadFallSettings.Sensitivity, sesibityOptionValue);\\r\\n //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n configsToAck.push(configIds.ReadFallSettings.EnableDisableFallSettings);\\r\\n configsToAck.push(configIds.ReadFallSettings.Sensitivity);\\r\\n break;\\r\\n case '73': //BeaconList\\r\\n var beaconNumber = hexToDecimal(value.substring(1, 2));\\r\\n var beaconStatus = hex2bin(value.substring(0, 1));\\r\\n beaconStatus = hex_to_ascii(value.substring(30, value.length));\\r\\n //beaconStatus = changeEndianness(value.substring(30, value.length));\\r\\n //homeBeacon += 'B' + (beaconNumber + 1) + ': ' + beaconStatus + ', ';\\r\\n homeBeacon += beaconStatus + ', ';\\r\\n AddValue(codeValues, \\\"homeBeacon\\\", homeBeacon);\\r\\n messageForReceiver = (`Watch;ACK-GDATA;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n break;\\r\\n case '4A': //Wifi Network List\\r\\n var wifiSSIDLenght = hexToDecimal(value.substring(2, 4));\\r\\n var wifiPasswordLenght = hexToDecimal(value.substring(4, 6));\\r\\n var wifiIndex = hexToDecimal(value.substring(1, 2));\\r\\n //var wifiStatus = hexToDecimal(value.substring(0, 1));\\r\\n var wifiStatus = value.substring(0, 1);\\r\\n /*var enalbleDisable = wifiSSID = wifiPassword = homeWifi = '';\\r\\n /var homeWifi = '';\\r\\n if (wifiIndex == '0') { // Only first Wifi of the list\\r\\n if (wifiStatus == '8') {\\r\\n homeWifi += ' Enable, '\\r\\n enalbleDisable = '1';\\r\\n } else {\\r\\n homeWifi += ' Disable, '\\r\\n //enalbleDisable = '0';\\r\\n };*/\\r\\n if ((wifiStatus == '8') || (wifiStatus == 'C')) { // 8 == ON OR C== ON and Connected\\r\\n var wifiSSID = hex_to_ascii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\r\\n var wifiPassword = hex_to_ascii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\r\\n var imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;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 = (`Watch;ACK-SPEED;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"speed\\\", alertSetting);\\r\\n AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\r\\n configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\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 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 = (`Watch-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 = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch-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 if (typeof configIds !== 'undefined' && configIds && configIds.ConfigureDevice && configIds.ConfigureDevice.LastConfigured) { // when is defined\\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 }\\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(hex) { // Hex to Ascii \\r\\n if (hex.length % 2 !== 0) {\\r\\n throw new Error(\\\"Hex string length must be even\\\");\\r\\n }\\r\\n let ascii = '';\\r\\n for (let i = 0; i < hex.length; i += 2) {\\r\\n const byte = hex.substr(i, 2);\\r\\n const charCode = parseInt(byte, 16);\\r\\n if (charCode !== 0) { // remove null character (\\\\u0000)\\r\\n ascii += String.fromCharCode(charCode);\\r\\n }\\r\\n }\\r\\n return ascii;\\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":1762887514},{"Type":1,"NewValue":"{\"Id\":437,\"Name\":\"Access TEC Care Watch\",\"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 // Watch protocol - please see variables and typical values in order below\\r\\n // Watch-CYC;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;SIGNAL=<>;WM=<>;GENERAL=<>\\r\\n // Watch-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\r\\n //\\r\\n // Author: Juanmi Navarro\\r\\n // Created: 01/01/0000\\r\\n // Last modified: 18/09/2025\\r\\n //\\r\\n ///////////////////////////////////////////////////////////////////////////////\\r\\n if (typeof localTesting === \\\"undefined\\\") {\\r\\n let localTesting = false;\\r\\n }\\r\\n const crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,\\r\\n 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,\\r\\n 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,\\r\\n 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,\\r\\n 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,\\r\\n 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,\\r\\n 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,\\r\\n 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,\\r\\n 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,\\r\\n 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,\\r\\n 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,\\r\\n 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,\\r\\n 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,\\r\\n 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,\\r\\n 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,\\r\\n 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,\\r\\n 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,\\r\\n 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,\\r\\n 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,\\r\\n 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,\\r\\n 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,\\r\\n 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n ];\\r\\n var codeValues = [];\\r\\n AddValue(codeValues, 'protocol_template', 'Watch');\\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 = (`Watch-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 var allowedCID = ['3036', '06'];\\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 } 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 }\\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 //<>,<>,<> \\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];\\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 //<>,<>,<> \\r\\n if (mac2) {\\r\\n AddValue(codeValues, 'beacon_mac', mac2);\\r\\n var simpleQuery2 = [{\\r\\n 'code': 'Mac',\\r\\n 'value': mac2,\\r\\n }];\\r\\n var simpleQueryLabel2 = {\\r\\n 'table': 'beacons',\\r\\n 'select': 'Name',\\r\\n 'query': simpleQuery2\\r\\n };\\r\\n var labels2 = [];\\r\\n labels2.push(JSON.stringify(simpleQueryLabel2));\\r\\n AddValue(codeValues, 'oysta_labels', JSON.stringify(labels2));\\r\\n }\\r\\n if (params.beacon_major) {\\r\\n AddValue(codeValues, 'beacon_major', params.beacon_major);\\r\\n } else {\\r\\n AddValue(codeValues, 'beacon_major', 0);\\r\\n }\\r\\n if (params.beacon_minor) {\\r\\n AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\r\\n } else {\\r\\n AddValue(codeValues, 'beacon_minor', 0);\\r\\n }\\r\\n //AddValue(codeValues,'oysta_labels', label);\\r\\n //AddValue(codeValues,'oysta_value', mac);\\r\\n }\\r\\n /* meter mas tarde... \\r\\n if (params.smart_data !== 'undefined') {\\r\\n var gen_location = params.smart_data.split(',')\\r\\n var latitude = gen_location[0]\\r\\n var longitude = gen_location[1]\\r\\n var location_accuracy = gen_location[2]\\r\\n var altitude = gen_location[3]\\r\\n AddValue(codeValues,'latitude', latitude);\\r\\n AddValue(codeValues,'longitude', longitude);\\r\\n AddValue(codeValues,'altitude', altitude);\\r\\n AddValue(codeValues,'location_accuracy', location_accuracy);\\r\\n }\\r\\n */\\r\\n /*else if ((params.event_time) && (params.event_time == '')) {\\r\\n var event_time = moment.utc().unix();\\r\\n AddValue(codeValues,'event_time', event_time);\\r\\n } revisar mas adelante*/\\r\\n if (params.location_time) {\\r\\n AddValue(codeValues, 'location_time', params.location_time);\\r\\n }\\r\\n if (params.event_time) {\\r\\n AddValue(codeValues, 'event_time', params.event_time);\\r\\n }\\r\\n // to parse SMS info from the device\\r\\n switch (messageTypeLocalCode) {\\r\\n case 'COMM-SMS': // SMS message sent in\\r\\n if (params.data.startsWith('Device location request')) {\\r\\n configsToAck.push(configIds.Controls.RealTimeLocate);\\r\\n } else if (params.data.startsWith('Set IP ok')) {\\r\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n } else if (params.data.startsWith('IMEI:')) {\\r\\n configsToAck.push(configIds.Controls.GetFirmwareVersion);\\r\\n } else if (params.data.startsWith('Set IP ok')) {\\r\\n configsToAck.push(configIds.Controls.ClearBufferedMessages);\\r\\n } else if (params.data.startsWith('flush ok')) {\\r\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n } else if (params.data.startsWith('Set Watch-')) {\\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 = (`Watch-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 = (`Watch;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 = (`Watch;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 = (`Watch-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 // decode global msg\\r\\n function decoder(str) { // decode rawdata\\r\\n // CARE Decoder\\r\\n //AddValue(codeValues, 'Message : ', str);\\r\\n var message = str;\\r\\n var index = 18;\\r\\n //parse header & properties\\r\\n var properties = message.substring(2, 4);\\r\\n var lengthLittleEndian = message.substring(4, 8);\\r\\n var total_length = lengthLittleEndian.substring(2, 4) + lengthLittleEndian.substring(0, 2);\\r\\n total_length = 2 * hexToDecimal(total_length.substring(0, 4));\\r\\n var sequenceID = message.substring(12, 16);\\r\\n var command = message.substring(16, 18);\\r\\n //mask bitwise (properties should be '10')\\r\\n if ((parseInt(properties) & 8) == 8) {\\r\\n needsAck = true;\\r\\n } else needsAck = false;\\r\\n // need to check if checksum is correct for possible msg corruption 10/03/23\\r\\n var checksum = message.substring(8, 12);\\r\\n var messageBody = message.substring(16, message.length);\\r\\n debug('message =' + message);\\r\\n debug('checksum =' + checksum);\\r\\n debug('calculateCheckSum =' + calculateCheckSum(messageBody));\\r\\n if (calculateCheckSum(messageBody) == checksum) { // payload is valid\\r\\n debug(\\\"message has valid checksum\\\");\\r\\n var messageBody = command; // update value for the ACK\\r\\n debug('command =' + command);\\r\\n if (command == '01') {\\r\\n while (index < total_length + 16) {\\r\\n 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\\r\\n if ((alarmCodeExtInt & 1) == 1) {\\r\\n var alarm = 'ALF-C';\\r\\n }\\r\\n // Welfare Check-out\\r\\n else if ((alarmCodeExtInt & 2) == 2) {\\r\\n var alarm = 'ALA-C';\\r\\n }\\r\\n // Standard Alerts\\r\\n //Battery low\\r\\n else if ((alarmCodeInt & 1) == 1) {\\r\\n var alarm = 'BATL';\\r\\n }\\r\\n //Overspeed\\r\\n else if ((alarmCodeInt & 2) == 2) {\\r\\n var alarm = 'ALSP';\\r\\n }\\r\\n //Fall\\r\\n else if ((alarmCodeInt & 4) == 4) {\\r\\n var alarm = 'ALF';\\r\\n }\\r\\n //Tilt\\r\\n else if ((alarmCodeInt & 8) == 8) {\\r\\n var alarm = 'TLT';\\r\\n } else if ((alarmCodeInt & 16) == 16) {\\r\\n if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n var alarm = 'Geo1-IN';\\r\\n } else {\\r\\n var alarm = 'Geo1-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 32) == 32) {\\r\\n if ((alarmCodeInt & 33554432) == 33554432) {\\r\\n var alarm = 'Geo2-IN';\\r\\n } else {\\r\\n var alarm = 'Geo2-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 64) == 64) {\\r\\n if ((alarmCodeInt & 67108864) == 67108864) {\\r\\n var alarm = 'Geo3-IN';\\r\\n } else {\\r\\n var alarm = 'Geo3-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 128) == 128) {\\r\\n if ((alarmCodeInt & 134217728) == 134217728) {\\r\\n var alarm = 'Geo4-IN';\\r\\n } else {\\r\\n var alarm = 'Geo4-OUT';\\r\\n }\\r\\n }\\r\\n //Power Off\\r\\n else if ((alarmCodeInt & 256) == 256) {\\r\\n var alarm = 'PWRF';\\r\\n }\\r\\n //Power On\\r\\n else if ((alarmCodeInt & 512) == 512) {\\r\\n var alarm = 'PWRN';\\r\\n }\\r\\n //Motion\\r\\n else if ((alarmCodeInt & 1024) == 1024) {\\r\\n var alarm = 'ALMOV';\\r\\n }\\r\\n //No Motion\\r\\n else if ((alarmCodeInt & 2048) == 2048) {\\r\\n var alarm = 'ALNM';\\r\\n }\\r\\n //SOS\\r\\n else if ((alarmCodeInt & 4096) == 4096) {\\r\\n var alarm = 'ALSOS';\\r\\n } else if ((alarmCodeInt & 8192) == 8192) {\\r\\n var alarm = 'Side1';\\r\\n } else if ((alarmCodeInt & 16384) == 16384) {\\r\\n var alarm = 'Side2';\\r\\n }\\r\\n //Battery charging\\r\\n else if ((alarmCodeInt & 32768) == 32768) {\\r\\n var alarm = 'BATCN';\\r\\n }\\r\\n //Battery no charging\\r\\n else if ((alarmCodeInt & 65536) == 65536) {\\r\\n var alarm = 'BATCF';\\r\\n }\\r\\n //SOS Ending\\r\\n // Temporary Commented until we know exactly how it works. 22/09/2022\\r\\n else if ((alarmCodeInt & 131072) == 131072) {\\r\\n var alarm = 'ALA-F';\\r\\n info = 'Alarm Finished';\\r\\n }\\r\\n //Amber Alert EC03 only\\r\\n else if ((alarmCodeInt & 262144) == 262144) {\\r\\n var alarm = 'ALA';\\r\\n }\\r\\n // welfare Alert check-in ALA-O\\r\\n else if ((alarmCodeInt & 524288) == 524288) {\\r\\n var alarm = 'ALA-O';\\r\\n }\\r\\n // Amber alert Ending ALA-C\\r\\n else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n var alarm = 'ALA-C';\\r\\n }\\r\\n // Amber alert Ending ALA-C\\r\\n //else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n // var alarm = 'ALA-C';\\r\\n //}\\r\\n // Fall-Down Alert ending\\r\\n else if ((alarmCodeInt & 2097152) == 2097152) {\\r\\n var alarm = 'ALF-C';\\r\\n }\\r\\n // welfare Alert Ending ALA\\r\\n else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n var alarm = 'ALA';\\r\\n }\\r\\n // Beacon absent Alert 11/10/22. Need to be added in msg types\\r\\n //else if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n // var alarm = 'BEA';\\r\\n //}\\r\\n general += 'alarm:' + alarm + ',';\\r\\n break;\\r\\n //Custom ID\\r\\n case '03':\\r\\n customID = value;\\r\\n if (!allowedCID.includes(value)) {\\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 //<>,<>,<>,<>,<>\\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 if (!allowedCID.includes(customID)) {\\r\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n AddValue(codeValues, \\\"customID\\\", customID);\\r\\n return\\r\\n }\\r\\n if (statusDevice) {\\r\\n messageForReceiver = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n }\\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;\\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 }\\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 = 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 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 = (`Watch-${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 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 = (`Watch-${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 //Heart Rate Data\\r\\n case '41':\\r\\n var numSPO = (keyLength - 2) / 12;\\r\\n for (let j = 0; j < numSPO; 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 SPOHex = value.substring(8, 10);\\r\\n var SPO = hexToDecimal(SPOHex);\\r\\n var trustLevelHex = value.substring(10, 12);\\r\\n var trustLevel = hexToDecimal(trustLevelHex);\\r\\n info = SPO;\\r\\n //var alarmCode = 'True';\\r\\n var alarm = 'HBP';\\r\\n general += ' SPO2 rate' + j + ':' + SPO + ',';\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};SPO=${info};TLEVEL=${trustLevel};LABEL=%`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n }\\r\\n break;\\r\\n //BLE Connected . For Flic button\\r\\n case '62':\\r\\n location_type = 'BLE';\\r\\n //var alarm = 'EBZI'; \\r\\n //var latitudeHex = '00';\\r\\n //var longitudeHex = '00';\\r\\n //var descr = 'empty';\\r\\n var flag = hexToDecimal(value.substring(0, 2)); // 0= Disconnected, 1= Connected\\r\\n var mac = value.substring(2, 14); // No hace falta darle la vuelta\\r\\n // add : format in MAC\\r\\n mac = mac.match(/.{1,2}/g).join(':');\\r\\n var batLevel = hexToDecimal(value.substring(14, 16)); // 0-100\\r\\n //location_time = timestamp;\\r\\n ble_data = `${flag},${batLevel},${mac}`;\\r\\n general += 'BLE location (State):' + flag + ', (bat):' + batLevel + ', (mac):' + mac + ',';\\r\\n break;\\r\\n }\\r\\n }\\r\\n if (alarmCode) {\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch;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 = (`Watch;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': // Ringer Volume\\r\\n var volume = hexToDecimal(value);\\r\\n imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;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 = (`Watch;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 '0F': // Enable control.... Used for STEP COUNTING SETTINGS\\r\\n // 'FF FF 21 80'\\r\\n var StepStatus = hex2bin(value.substring(4, 6));\\r\\n var enalbleDisable = '';\\r\\n if (StepStatus.substring(7, 8) == '1') {\\r\\n var step = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var step = 'Disable, '\\r\\n };\\r\\n //var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n //hrate += detectingInterval;\\r\\n AddValue(codeValues, \\\"step\\\", step);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadStepsSettings.EnableDisableReadStepsSettings, enalbleDisable);\\r\\n //AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadStepsSettings.EnableDisableReadStepsSettings);\\r\\n //configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\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 = (`Watch;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 '34': //ContactList with name\\r\\n var contactNumber = value.substring(1, 2);\\r\\n var telLength = hexToDecimal(value.substring(2, 4));\\r\\n var tel = '';\\r\\n switch (contactNumber) {\\r\\n // Emergency Number\\r\\n case '0':\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n break;\\r\\n // Speed Dial Number\\r\\n //case '1':\\r\\n // tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n // AddValue(codeValues, \\\"SpeedDialNumber\\\", tel);\\r\\n // AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.SpeedDialNumber, tel);\\r\\n // configsToAck.push(configIds.ReadSpeedDialSettings.SpeedDialNumber);\\r\\n // break;\\r\\n // Gateway Number\\r\\n case '9': //00447781482635,Esendex UK 0034627177148,Esendex Spain 00447507288240,Esendex UK Acceptance\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n if (tel.includes('447781482635') || tel.includes('00447781482635')) {\\r\\n tel = 'Esendex UK'\\r\\n } else if (tel.includes('34627177148') || tel.includes('0034627177148')) {\\r\\n tel = 'Esendex Spain'\\r\\n } else if (tel.includes('447507288240') || tel.includes('00447507288240')) {\\r\\n tel = 'Esendex UK Acceptance'\\r\\n } else {\\r\\n tel = 'Default'\\r\\n }\\r\\n AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n break;\\r\\n default:\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n if (tel.length < 6) {\\r\\n contacts += '';\\r\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n break;\\r\\n }\\r\\n //contacts += 'A' + (contactNumber - 1) + ': ' + tel + ', ';\\r\\n contacts += tel + ', ';\\r\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n break;\\r\\n }\\r\\n break;\\r\\n case '40': // APN\\r\\n //no ACK need\\r\\n AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'));\\r\\n configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\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 = (`Watch;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 = (`Watch;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 '46': //HeartRate\\r\\n // '10 0E 00 80'\\r\\n var HeartRateStatus = hex2bin(value.substring(6, 8));\\r\\n var enalbleDisable = '';\\r\\n if (HeartRateStatus.substring(0, 1) == '1') {\\r\\n var hrate = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var hrate = 'Disable, '\\r\\n };\\r\\n var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n hrate += detectingInterval;\\r\\n AddValue(codeValues, \\\"hrate\\\", hrate);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings);\\r\\n configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\r\\n break;\\r\\n case '47': // Custom Id\\r\\n imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;ACK-CUSTID;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"customeid\\\", value);\\r\\n AddValue(configsToUpdate, configIds.ReadState.CustomId, hex_to_ascii(value)); //now it comes \\\"3036\\\"\\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 // commented until Eview fixes this function\\r\\n /*\\r\\n messageForReceiver = (`Watch;ACK-NOMOTION;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"nomotion\\\", alertSetting);\\r\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings, enableDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n configsToAck.push(configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings);\\r\\n configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n */\\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 = (`Watch;ACK-FALLALERT;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n var sesibityOptionValue = hexToDecimal(value.substring(1, 2));\\r\\n sensibility += sesibityOptionValue;\\r\\n AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n //AddValue(configsToUpdate, configIds.ReadAlertSettings.FallSettings, sensibility);\\r\\n AddValue(configsToUpdate, configIds.ReadFallSettings.EnableDisableFallSettings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadFallSettings.Sensitivity, sesibityOptionValue);\\r\\n //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n configsToAck.push(configIds.ReadFallSettings.EnableDisableFallSettings);\\r\\n configsToAck.push(configIds.ReadFallSettings.Sensitivity);\\r\\n break;\\r\\n case '73': //BeaconList\\r\\n var beaconNumber = hexToDecimal(value.substring(1, 2));\\r\\n var beaconStatus = hex2bin(value.substring(0, 1));\\r\\n beaconStatus = hex_to_ascii(value.substring(30, value.length));\\r\\n //beaconStatus = changeEndianness(value.substring(30, value.length));\\r\\n //homeBeacon += 'B' + (beaconNumber + 1) + ': ' + beaconStatus + ', ';\\r\\n homeBeacon += beaconStatus + ', ';\\r\\n AddValue(codeValues, \\\"homeBeacon\\\", homeBeacon);\\r\\n messageForReceiver = (`Watch;ACK-GDATA;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n break;\\r\\n case '4A': //Wifi Network List\\r\\n var wifiSSIDLenght = hexToDecimal(value.substring(2, 4));\\r\\n var wifiPasswordLenght = hexToDecimal(value.substring(4, 6));\\r\\n var wifiIndex = hexToDecimal(value.substring(1, 2));\\r\\n //var wifiStatus = hexToDecimal(value.substring(0, 1));\\r\\n var wifiStatus = value.substring(0, 1);\\r\\n /*var enalbleDisable = wifiSSID = wifiPassword = homeWifi = '';\\r\\n /var homeWifi = '';\\r\\n if (wifiIndex == '0') { // Only first Wifi of the list\\r\\n if (wifiStatus == '8') {\\r\\n homeWifi += ' Enable, '\\r\\n enalbleDisable = '1';\\r\\n } else {\\r\\n homeWifi += ' Disable, '\\r\\n //enalbleDisable = '0';\\r\\n };*/\\r\\n if ((wifiStatus == '8') || (wifiStatus == 'C')) { // 8 == ON OR C== ON and Connected\\r\\n var wifiSSID = hex_to_ascii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\r\\n var wifiPassword = hex_to_ascii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\r\\n var imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;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 = (`Watch;ACK-SPEED;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"speed\\\", alertSetting);\\r\\n AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\r\\n configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\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 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 = (`Watch-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 = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch-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 if (typeof configIds !== 'undefined' && configIds && configIds.ConfigureDevice && configIds.ConfigureDevice.LastConfigured) { // when is defined\\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 }\\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(hex) { // Hex to Ascii \\r\\n if (hex.length % 2 !== 0) {\\r\\n throw new Error(\\\"Hex string length must be even\\\");\\r\\n }\\r\\n let ascii = '';\\r\\n for (let i = 0; i < hex.length; i += 2) {\\r\\n const byte = hex.substr(i, 2);\\r\\n const charCode = parseInt(byte, 16);\\r\\n if (charCode !== 0) { // remove null character (\\\\u0000)\\r\\n ascii += String.fromCharCode(charCode);\\r\\n }\\r\\n }\\r\\n return ascii;\\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":1763493459},{"Type":1,"NewValue":"{\"Id\":437,\"Name\":\"Access TEC Care Watch\",\"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 // Watch protocol - please see variables and typical values in order below\\r\\n // Watch-CYC;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;SIGNAL=<>;WM=<>;GENERAL=<>\\r\\n // Watch-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\r\\n //\\r\\n // Author: Juanmi Navarro\\r\\n // Created: 01/01/0000\\r\\n // Last modified: 18/09/2025\\r\\n //\\r\\n ///////////////////////////////////////////////////////////////////////////////\\r\\n if (typeof localTesting === \\\"undefined\\\") {\\r\\n let localTesting = false;\\r\\n }\\r\\n const crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,\\r\\n 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,\\r\\n 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,\\r\\n 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,\\r\\n 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,\\r\\n 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,\\r\\n 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,\\r\\n 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,\\r\\n 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,\\r\\n 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,\\r\\n 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,\\r\\n 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,\\r\\n 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,\\r\\n 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,\\r\\n 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,\\r\\n 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,\\r\\n 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,\\r\\n 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,\\r\\n 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,\\r\\n 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,\\r\\n 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,\\r\\n 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n ];\\r\\n var codeValues = [];\\r\\n AddValue(codeValues, 'protocol_template', 'Watch');\\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 = (`Watch-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 var allowedCID = ['3036', '06'];\\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 } 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 }\\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 //<>,<>,<> \\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];\\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 //<>,<>,<> \\r\\n if (mac2) {\\r\\n AddValue(codeValues, 'beacon_mac', mac2);\\r\\n var simpleQuery2 = [{\\r\\n 'code': 'Mac',\\r\\n 'value': mac2,\\r\\n }];\\r\\n var simpleQueryLabel2 = {\\r\\n 'table': 'beacons',\\r\\n 'select': 'Name',\\r\\n 'query': simpleQuery2\\r\\n };\\r\\n var labels2 = [];\\r\\n labels2.push(JSON.stringify(simpleQueryLabel2));\\r\\n AddValue(codeValues, 'oysta_labels', JSON.stringify(labels2));\\r\\n }\\r\\n if (params.beacon_major) {\\r\\n AddValue(codeValues, 'beacon_major', params.beacon_major);\\r\\n } else {\\r\\n AddValue(codeValues, 'beacon_major', 0);\\r\\n }\\r\\n if (params.beacon_minor) {\\r\\n AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\r\\n } else {\\r\\n AddValue(codeValues, 'beacon_minor', 0);\\r\\n }\\r\\n //AddValue(codeValues,'oysta_labels', label);\\r\\n //AddValue(codeValues,'oysta_value', mac);\\r\\n }\\r\\n /* meter mas tarde... \\r\\n if (params.smart_data !== 'undefined') {\\r\\n var gen_location = params.smart_data.split(',')\\r\\n var latitude = gen_location[0]\\r\\n var longitude = gen_location[1]\\r\\n var location_accuracy = gen_location[2]\\r\\n var altitude = gen_location[3]\\r\\n AddValue(codeValues,'latitude', latitude);\\r\\n AddValue(codeValues,'longitude', longitude);\\r\\n AddValue(codeValues,'altitude', altitude);\\r\\n AddValue(codeValues,'location_accuracy', location_accuracy);\\r\\n }\\r\\n */\\r\\n /*else if ((params.event_time) && (params.event_time == '')) {\\r\\n var event_time = moment.utc().unix();\\r\\n AddValue(codeValues,'event_time', event_time);\\r\\n } revisar mas adelante*/\\r\\n if (params.location_time) {\\r\\n AddValue(codeValues, 'location_time', params.location_time);\\r\\n }\\r\\n if (params.event_time) {\\r\\n AddValue(codeValues, 'event_time', params.event_time);\\r\\n }\\r\\n // to parse SMS info from the device\\r\\n switch (messageTypeLocalCode) {\\r\\n case 'COMM-SMS': // SMS message sent in\\r\\n if (params.data.startsWith('Device location request')) {\\r\\n configsToAck.push(configIds.Controls.RealTimeLocate);\\r\\n } else if (params.data.startsWith('Set IP ok')) {\\r\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n } else if (params.data.startsWith('IMEI:')) {\\r\\n configsToAck.push(configIds.Controls.GetFirmwareVersion);\\r\\n } else if (params.data.startsWith('Set IP ok')) {\\r\\n configsToAck.push(configIds.Controls.ClearBufferedMessages);\\r\\n } else if (params.data.startsWith('flush ok')) {\\r\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n } else if (params.data.startsWith('Set Watch-')) {\\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 = (`Watch-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 = (`Watch;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 = (`Watch;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 = (`Watch-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 // decode global msg\\r\\n function decoder(str) { // decode rawdata\\r\\n // CARE Decoder\\r\\n //AddValue(codeValues, 'Message : ', str);\\r\\n var message = str;\\r\\n var index = 18;\\r\\n //parse header & properties\\r\\n var properties = message.substring(2, 4);\\r\\n var lengthLittleEndian = message.substring(4, 8);\\r\\n var total_length = lengthLittleEndian.substring(2, 4) + lengthLittleEndian.substring(0, 2);\\r\\n total_length = 2 * hexToDecimal(total_length.substring(0, 4));\\r\\n var sequenceID = message.substring(12, 16);\\r\\n var command = message.substring(16, 18);\\r\\n //mask bitwise (properties should be '10')\\r\\n if ((parseInt(properties) & 8) == 8) {\\r\\n needsAck = true;\\r\\n } else needsAck = false;\\r\\n // need to check if checksum is correct for possible msg corruption 10/03/23\\r\\n var checksum = message.substring(8, 12);\\r\\n var messageBody = message.substring(16, message.length);\\r\\n debug('message =' + message);\\r\\n debug('checksum =' + checksum);\\r\\n debug('calculateCheckSum =' + calculateCheckSum(messageBody));\\r\\n if (calculateCheckSum(messageBody) == checksum) { // payload is valid\\r\\n debug(\\\"message has valid checksum\\\");\\r\\n var messageBody = command; // update value for the ACK\\r\\n debug('command =' + command);\\r\\n if (command == '01') {\\r\\n while (index < total_length + 16) {\\r\\n 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\\r\\n if ((alarmCodeExtInt & 1) == 1) {\\r\\n var alarm = 'ALF-C';\\r\\n }\\r\\n // Welfare Check-out\\r\\n else if ((alarmCodeExtInt & 2) == 2) {\\r\\n var alarm = 'ALA-C';\\r\\n }\\r\\n // Standard Alerts\\r\\n //Battery low\\r\\n else if ((alarmCodeInt & 1) == 1) {\\r\\n var alarm = 'BATL';\\r\\n }\\r\\n //Overspeed\\r\\n else if ((alarmCodeInt & 2) == 2) {\\r\\n var alarm = 'ALSP';\\r\\n }\\r\\n //Fall\\r\\n else if ((alarmCodeInt & 4) == 4) {\\r\\n var alarm = 'ALF';\\r\\n }\\r\\n //Tilt\\r\\n else if ((alarmCodeInt & 8) == 8) {\\r\\n var alarm = 'TLT';\\r\\n } else if ((alarmCodeInt & 16) == 16) {\\r\\n if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n var alarm = 'Geo1-IN';\\r\\n } else {\\r\\n var alarm = 'Geo1-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 32) == 32) {\\r\\n if ((alarmCodeInt & 33554432) == 33554432) {\\r\\n var alarm = 'Geo2-IN';\\r\\n } else {\\r\\n var alarm = 'Geo2-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 64) == 64) {\\r\\n if ((alarmCodeInt & 67108864) == 67108864) {\\r\\n var alarm = 'Geo3-IN';\\r\\n } else {\\r\\n var alarm = 'Geo3-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 128) == 128) {\\r\\n if ((alarmCodeInt & 134217728) == 134217728) {\\r\\n var alarm = 'Geo4-IN';\\r\\n } else {\\r\\n var alarm = 'Geo4-OUT';\\r\\n }\\r\\n }\\r\\n //Power Off\\r\\n else if ((alarmCodeInt & 256) == 256) {\\r\\n var alarm = 'PWRF';\\r\\n }\\r\\n //Power On\\r\\n else if ((alarmCodeInt & 512) == 512) {\\r\\n var alarm = 'PWRN';\\r\\n }\\r\\n //Motion\\r\\n else if ((alarmCodeInt & 1024) == 1024) {\\r\\n var alarm = 'ALMOV';\\r\\n }\\r\\n //No Motion\\r\\n else if ((alarmCodeInt & 2048) == 2048) {\\r\\n var alarm = 'ALNM';\\r\\n }\\r\\n //SOS\\r\\n else if ((alarmCodeInt & 4096) == 4096) {\\r\\n var alarm = 'ALSOS';\\r\\n } else if ((alarmCodeInt & 8192) == 8192) {\\r\\n var alarm = 'Side1';\\r\\n } else if ((alarmCodeInt & 16384) == 16384) {\\r\\n var alarm = 'Side2';\\r\\n }\\r\\n //Battery charging\\r\\n else if ((alarmCodeInt & 32768) == 32768) {\\r\\n var alarm = 'BATCN';\\r\\n }\\r\\n //Battery no charging\\r\\n else if ((alarmCodeInt & 65536) == 65536) {\\r\\n var alarm = 'BATCF';\\r\\n }\\r\\n //SOS Ending\\r\\n // Temporary Commented until we know exactly how it works. 22/09/2022\\r\\n else if ((alarmCodeInt & 131072) == 131072) {\\r\\n var alarm = 'ALA-F';\\r\\n info = 'Alarm Finished';\\r\\n }\\r\\n //Amber Alert EC03 only\\r\\n else if ((alarmCodeInt & 262144) == 262144) {\\r\\n var alarm = 'ALA';\\r\\n }\\r\\n // welfare Alert check-in ALA-O\\r\\n else if ((alarmCodeInt & 524288) == 524288) {\\r\\n var alarm = 'ALA-O';\\r\\n }\\r\\n // Amber alert Ending ALA-C\\r\\n else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n var alarm = 'ALA-C';\\r\\n }\\r\\n // Amber alert Ending ALA-C\\r\\n //else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n // var alarm = 'ALA-C';\\r\\n //}\\r\\n // Fall-Down Alert ending\\r\\n else if ((alarmCodeInt & 2097152) == 2097152) {\\r\\n var alarm = 'ALF-C';\\r\\n }\\r\\n // welfare Alert Ending ALA\\r\\n else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n var alarm = 'ALA';\\r\\n }\\r\\n // Beacon absent Alert 11/10/22. Need to be added in msg types\\r\\n //else if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n // var alarm = 'BEA';\\r\\n //}\\r\\n general += 'alarm:' + alarm + ',';\\r\\n break;\\r\\n //Custom ID\\r\\n case '03':\\r\\n customID = value;\\r\\n if (!allowedCID.includes(value)) {\\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 //<>,<>,<>,<>,<>\\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 if (!allowedCID.includes(customID)) {\\r\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n AddValue(codeValues, \\\"customID\\\", customID);\\r\\n return\\r\\n }\\r\\n if (statusDevice) {\\r\\n messageForReceiver = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n }\\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;\\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 }\\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 = 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 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 = (`Watch-${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 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 = (`Watch-${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 // SPO2\\r\\n case '41':\\r\\n var numSPO = (keyLength - 2) / 12;\\r\\n for (let j = 0; j < numSPO; 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 SPOHex = value.substring(8, 10);\\r\\n var SPO = hexToDecimal(SPOHex);\\r\\n var trustLevelHex = value.substring(10, 12);\\r\\n var trustLevel = hexToDecimal(trustLevelHex);\\r\\n info = SPO;\\r\\n //var alarmCode = 'True';\\r\\n var alarm = 'SPO2';\\r\\n general += ' SPO2 rate' + j + ':' + SPO + ',';\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};SPO2=${info};TLEVEL=${trustLevel};LABEL=%`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n }\\r\\n break;\\r\\n //BLE Connected . For Flic button\\r\\n case '62':\\r\\n location_type = 'BLE';\\r\\n //var alarm = 'EBZI'; \\r\\n //var latitudeHex = '00';\\r\\n //var longitudeHex = '00';\\r\\n //var descr = 'empty';\\r\\n var flag = hexToDecimal(value.substring(0, 2)); // 0= Disconnected, 1= Connected\\r\\n var mac = value.substring(2, 14); // No hace falta darle la vuelta\\r\\n // add : format in MAC\\r\\n mac = mac.match(/.{1,2}/g).join(':');\\r\\n var batLevel = hexToDecimal(value.substring(14, 16)); // 0-100\\r\\n //location_time = timestamp;\\r\\n ble_data = `${flag},${batLevel},${mac}`;\\r\\n general += 'BLE location (State):' + flag + ', (bat):' + batLevel + ', (mac):' + mac + ',';\\r\\n break;\\r\\n }\\r\\n }\\r\\n if (alarmCode) {\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch;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 = (`Watch;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': // Ringer Volume\\r\\n var volume = hexToDecimal(value);\\r\\n imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;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 = (`Watch;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 '0F': // Enable control.... Used for STEP COUNTING SETTINGS\\r\\n // 'FF FF 21 80'\\r\\n var StepStatus = hex2bin(value.substring(4, 6));\\r\\n var enalbleDisable = '';\\r\\n if (StepStatus.substring(7, 8) == '1') {\\r\\n var step = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var step = 'Disable, '\\r\\n };\\r\\n //var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n //hrate += detectingInterval;\\r\\n AddValue(codeValues, \\\"step\\\", step);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadStepsSettings.EnableDisableReadStepsSettings, enalbleDisable);\\r\\n //AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadStepsSettings.EnableDisableReadStepsSettings);\\r\\n //configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\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 = (`Watch;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 '34': //ContactList with name\\r\\n var contactNumber = value.substring(1, 2);\\r\\n var telLength = hexToDecimal(value.substring(2, 4));\\r\\n var tel = '';\\r\\n switch (contactNumber) {\\r\\n // Emergency Number\\r\\n case '0':\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n break;\\r\\n // Speed Dial Number\\r\\n //case '1':\\r\\n // tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n // AddValue(codeValues, \\\"SpeedDialNumber\\\", tel);\\r\\n // AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.SpeedDialNumber, tel);\\r\\n // configsToAck.push(configIds.ReadSpeedDialSettings.SpeedDialNumber);\\r\\n // break;\\r\\n // Gateway Number\\r\\n case '9': //00447781482635,Esendex UK 0034627177148,Esendex Spain 00447507288240,Esendex UK Acceptance\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n if (tel.includes('447781482635') || tel.includes('00447781482635')) {\\r\\n tel = 'Esendex UK'\\r\\n } else if (tel.includes('34627177148') || tel.includes('0034627177148')) {\\r\\n tel = 'Esendex Spain'\\r\\n } else if (tel.includes('447507288240') || tel.includes('00447507288240')) {\\r\\n tel = 'Esendex UK Acceptance'\\r\\n } else {\\r\\n tel = 'Default'\\r\\n }\\r\\n AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n break;\\r\\n default:\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n if (tel.length < 6) {\\r\\n contacts += '';\\r\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n break;\\r\\n }\\r\\n //contacts += 'A' + (contactNumber - 1) + ': ' + tel + ', ';\\r\\n contacts += tel + ', ';\\r\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n break;\\r\\n }\\r\\n break;\\r\\n case '40': // APN\\r\\n //no ACK need\\r\\n AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'));\\r\\n configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\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 = (`Watch;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 = (`Watch;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 '46': //HeartRate\\r\\n // '10 0E 00 80'\\r\\n var HeartRateStatus = hex2bin(value.substring(6, 8));\\r\\n var enalbleDisable = '';\\r\\n if (HeartRateStatus.substring(0, 1) == '1') {\\r\\n var hrate = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var hrate = 'Disable, '\\r\\n };\\r\\n var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n hrate += detectingInterval;\\r\\n AddValue(codeValues, \\\"hrate\\\", hrate);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings);\\r\\n configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\r\\n break;\\r\\n case '47': // Custom Id\\r\\n imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;ACK-CUSTID;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"customeid\\\", value);\\r\\n AddValue(configsToUpdate, configIds.ReadState.CustomId, hex_to_ascii(value)); //now it comes \\\"3036\\\"\\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 // commented until Eview fixes this function\\r\\n /*\\r\\n messageForReceiver = (`Watch;ACK-NOMOTION;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"nomotion\\\", alertSetting);\\r\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings, enableDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n configsToAck.push(configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings);\\r\\n configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n */\\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 = (`Watch;ACK-FALLALERT;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n var sesibityOptionValue = hexToDecimal(value.substring(1, 2));\\r\\n sensibility += sesibityOptionValue;\\r\\n AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n //AddValue(configsToUpdate, configIds.ReadAlertSettings.FallSettings, sensibility);\\r\\n AddValue(configsToUpdate, configIds.ReadFallSettings.EnableDisableFallSettings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadFallSettings.Sensitivity, sesibityOptionValue);\\r\\n //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n configsToAck.push(configIds.ReadFallSettings.EnableDisableFallSettings);\\r\\n configsToAck.push(configIds.ReadFallSettings.Sensitivity);\\r\\n break;\\r\\n case '73': //BeaconList\\r\\n var beaconNumber = hexToDecimal(value.substring(1, 2));\\r\\n var beaconStatus = hex2bin(value.substring(0, 1));\\r\\n beaconStatus = hex_to_ascii(value.substring(30, value.length));\\r\\n //beaconStatus = changeEndianness(value.substring(30, value.length));\\r\\n //homeBeacon += 'B' + (beaconNumber + 1) + ': ' + beaconStatus + ', ';\\r\\n homeBeacon += beaconStatus + ', ';\\r\\n AddValue(codeValues, \\\"homeBeacon\\\", homeBeacon);\\r\\n messageForReceiver = (`Watch;ACK-GDATA;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n break;\\r\\n case '4A': //Wifi Network List\\r\\n var wifiSSIDLenght = hexToDecimal(value.substring(2, 4));\\r\\n var wifiPasswordLenght = hexToDecimal(value.substring(4, 6));\\r\\n var wifiIndex = hexToDecimal(value.substring(1, 2));\\r\\n //var wifiStatus = hexToDecimal(value.substring(0, 1));\\r\\n var wifiStatus = value.substring(0, 1);\\r\\n /*var enalbleDisable = wifiSSID = wifiPassword = homeWifi = '';\\r\\n /var homeWifi = '';\\r\\n if (wifiIndex == '0') { // Only first Wifi of the list\\r\\n if (wifiStatus == '8') {\\r\\n homeWifi += ' Enable, '\\r\\n enalbleDisable = '1';\\r\\n } else {\\r\\n homeWifi += ' Disable, '\\r\\n //enalbleDisable = '0';\\r\\n };*/\\r\\n if ((wifiStatus == '8') || (wifiStatus == 'C')) { // 8 == ON OR C== ON and Connected\\r\\n var wifiSSID = hex_to_ascii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\r\\n var wifiPassword = hex_to_ascii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\r\\n var imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;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 = (`Watch;ACK-SPEED;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"speed\\\", alertSetting);\\r\\n AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\r\\n configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\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 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 = (`Watch-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 = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch-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 if (typeof configIds !== 'undefined' && configIds && configIds.ConfigureDevice && configIds.ConfigureDevice.LastConfigured) { // when is defined\\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 }\\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(hex) { // Hex to Ascii \\r\\n if (hex.length % 2 !== 0) {\\r\\n throw new Error(\\\"Hex string length must be even\\\");\\r\\n }\\r\\n let ascii = '';\\r\\n for (let i = 0; i < hex.length; i += 2) {\\r\\n const byte = hex.substr(i, 2);\\r\\n const charCode = parseInt(byte, 16);\\r\\n if (charCode !== 0) { // remove null character (\\\\u0000)\\r\\n ascii += String.fromCharCode(charCode);\\r\\n }\\r\\n }\\r\\n return ascii;\\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":1763495297},{"Type":1,"NewValue":"{\"Id\":437,\"Name\":\"Access TEC Care Watch\",\"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 // Watch protocol - please see variables and typical values in order below\\r\\n // Watch-CYC;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;SIGNAL=<>;WM=<>;GENERAL=<>\\r\\n // Watch-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\r\\n //\\r\\n // Author: Juanmi Navarro\\r\\n // Created: 01/01/0000\\r\\n // Last modified: 18/09/2025\\r\\n //\\r\\n ///////////////////////////////////////////////////////////////////////////////\\r\\n if (typeof localTesting === \\\"undefined\\\") {\\r\\n let localTesting = false;\\r\\n }\\r\\n const crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,\\r\\n 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,\\r\\n 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,\\r\\n 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,\\r\\n 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,\\r\\n 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,\\r\\n 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,\\r\\n 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,\\r\\n 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,\\r\\n 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,\\r\\n 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,\\r\\n 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,\\r\\n 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,\\r\\n 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,\\r\\n 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,\\r\\n 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,\\r\\n 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,\\r\\n 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,\\r\\n 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,\\r\\n 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,\\r\\n 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,\\r\\n 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n ];\\r\\n var codeValues = [];\\r\\n AddValue(codeValues, 'protocol_template', 'Watch');\\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 = (`Watch-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 var allowedCID = ['3036', '06'];\\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 } 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 }\\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 //<>,<>,<> \\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];\\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 //<>,<>,<> \\r\\n if (mac2) {\\r\\n AddValue(codeValues, 'beacon_mac', mac2);\\r\\n var simpleQuery2 = [{\\r\\n 'code': 'Mac',\\r\\n 'value': mac2,\\r\\n }];\\r\\n var simpleQueryLabel2 = {\\r\\n 'table': 'beacons',\\r\\n 'select': 'Name',\\r\\n 'query': simpleQuery2\\r\\n };\\r\\n var labels2 = [];\\r\\n labels2.push(JSON.stringify(simpleQueryLabel2));\\r\\n AddValue(codeValues, 'oysta_labels', JSON.stringify(labels2));\\r\\n }\\r\\n if (params.beacon_major) {\\r\\n AddValue(codeValues, 'beacon_major', params.beacon_major);\\r\\n } else {\\r\\n AddValue(codeValues, 'beacon_major', 0);\\r\\n }\\r\\n if (params.beacon_minor) {\\r\\n AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\r\\n } else {\\r\\n AddValue(codeValues, 'beacon_minor', 0);\\r\\n }\\r\\n //AddValue(codeValues,'oysta_labels', label);\\r\\n //AddValue(codeValues,'oysta_value', mac);\\r\\n }\\r\\n /* meter mas tarde... \\r\\n if (params.smart_data !== 'undefined') {\\r\\n var gen_location = params.smart_data.split(',')\\r\\n var latitude = gen_location[0]\\r\\n var longitude = gen_location[1]\\r\\n var location_accuracy = gen_location[2]\\r\\n var altitude = gen_location[3]\\r\\n AddValue(codeValues,'latitude', latitude);\\r\\n AddValue(codeValues,'longitude', longitude);\\r\\n AddValue(codeValues,'altitude', altitude);\\r\\n AddValue(codeValues,'location_accuracy', location_accuracy);\\r\\n }\\r\\n */\\r\\n /*else if ((params.event_time) && (params.event_time == '')) {\\r\\n var event_time = moment.utc().unix();\\r\\n AddValue(codeValues,'event_time', event_time);\\r\\n } revisar mas adelante*/\\r\\n if (params.location_time) {\\r\\n AddValue(codeValues, 'location_time', params.location_time);\\r\\n }\\r\\n if (params.event_time) {\\r\\n AddValue(codeValues, 'event_time', params.event_time);\\r\\n }\\r\\n // to parse SMS info from the device\\r\\n switch (messageTypeLocalCode) {\\r\\n case 'COMM-SMS': // SMS message sent in\\r\\n if (params.data.startsWith('Device location request')) {\\r\\n configsToAck.push(configIds.Controls.RealTimeLocate);\\r\\n } else if (params.data.startsWith('Set IP ok')) {\\r\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n } else if (params.data.startsWith('IMEI:')) {\\r\\n configsToAck.push(configIds.Controls.GetFirmwareVersion);\\r\\n } else if (params.data.startsWith('Set IP ok')) {\\r\\n configsToAck.push(configIds.Controls.ClearBufferedMessages);\\r\\n } else if (params.data.startsWith('flush ok')) {\\r\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n } else if (params.data.startsWith('Set Watch-')) {\\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 = (`Watch-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 = (`Watch;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 = (`Watch;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 = (`Watch-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 // decode global msg\\r\\n function decoder(str) { // decode rawdata\\r\\n // CARE Decoder\\r\\n //AddValue(codeValues, 'Message : ', str);\\r\\n var message = str;\\r\\n var index = 18;\\r\\n //parse header & properties\\r\\n var properties = message.substring(2, 4);\\r\\n var lengthLittleEndian = message.substring(4, 8);\\r\\n var total_length = lengthLittleEndian.substring(2, 4) + lengthLittleEndian.substring(0, 2);\\r\\n total_length = 2 * hexToDecimal(total_length.substring(0, 4));\\r\\n var sequenceID = message.substring(12, 16);\\r\\n var command = message.substring(16, 18);\\r\\n //mask bitwise (properties should be '10')\\r\\n if ((parseInt(properties) & 8) == 8) {\\r\\n needsAck = true;\\r\\n } else needsAck = false;\\r\\n // need to check if checksum is correct for possible msg corruption 10/03/23\\r\\n var checksum = message.substring(8, 12);\\r\\n var messageBody = message.substring(16, message.length);\\r\\n debug('message =' + message);\\r\\n debug('checksum =' + checksum);\\r\\n debug('calculateCheckSum =' + calculateCheckSum(messageBody));\\r\\n if (calculateCheckSum(messageBody) == checksum) { // payload is valid\\r\\n debug(\\\"message has valid checksum\\\");\\r\\n var messageBody = command; // update value for the ACK\\r\\n debug('command =' + command);\\r\\n if (command == '01') {\\r\\n while (index < total_length + 16) {\\r\\n 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\\r\\n if ((alarmCodeExtInt & 1) == 1) {\\r\\n var alarm = 'ALF-C';\\r\\n }\\r\\n // Welfare Check-out\\r\\n else if ((alarmCodeExtInt & 2) == 2) {\\r\\n var alarm = 'ALA-C';\\r\\n }\\r\\n // Standard Alerts\\r\\n //Battery low\\r\\n else if ((alarmCodeInt & 1) == 1) {\\r\\n var alarm = 'BATL';\\r\\n }\\r\\n //Overspeed\\r\\n else if ((alarmCodeInt & 2) == 2) {\\r\\n var alarm = 'ALSP';\\r\\n }\\r\\n //Fall\\r\\n else if ((alarmCodeInt & 4) == 4) {\\r\\n var alarm = 'ALF';\\r\\n }\\r\\n //Tilt\\r\\n else if ((alarmCodeInt & 8) == 8) {\\r\\n var alarm = 'TLT';\\r\\n } else if ((alarmCodeInt & 16) == 16) {\\r\\n if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n var alarm = 'Geo1-IN';\\r\\n } else {\\r\\n var alarm = 'Geo1-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 32) == 32) {\\r\\n if ((alarmCodeInt & 33554432) == 33554432) {\\r\\n var alarm = 'Geo2-IN';\\r\\n } else {\\r\\n var alarm = 'Geo2-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 64) == 64) {\\r\\n if ((alarmCodeInt & 67108864) == 67108864) {\\r\\n var alarm = 'Geo3-IN';\\r\\n } else {\\r\\n var alarm = 'Geo3-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 128) == 128) {\\r\\n if ((alarmCodeInt & 134217728) == 134217728) {\\r\\n var alarm = 'Geo4-IN';\\r\\n } else {\\r\\n var alarm = 'Geo4-OUT';\\r\\n }\\r\\n }\\r\\n //Power Off\\r\\n else if ((alarmCodeInt & 256) == 256) {\\r\\n var alarm = 'PWRF';\\r\\n }\\r\\n //Power On\\r\\n else if ((alarmCodeInt & 512) == 512) {\\r\\n var alarm = 'PWRN';\\r\\n }\\r\\n //Motion\\r\\n else if ((alarmCodeInt & 1024) == 1024) {\\r\\n var alarm = 'ALMOV';\\r\\n }\\r\\n //No Motion\\r\\n else if ((alarmCodeInt & 2048) == 2048) {\\r\\n var alarm = 'ALNM';\\r\\n }\\r\\n //SOS\\r\\n else if ((alarmCodeInt & 4096) == 4096) {\\r\\n var alarm = 'ALSOS';\\r\\n } else if ((alarmCodeInt & 8192) == 8192) {\\r\\n var alarm = 'Side1';\\r\\n } else if ((alarmCodeInt & 16384) == 16384) {\\r\\n var alarm = 'Side2';\\r\\n }\\r\\n //Battery charging\\r\\n else if ((alarmCodeInt & 32768) == 32768) {\\r\\n var alarm = 'BATCN';\\r\\n }\\r\\n //Battery no charging\\r\\n else if ((alarmCodeInt & 65536) == 65536) {\\r\\n var alarm = 'BATCF';\\r\\n }\\r\\n //SOS Ending\\r\\n // Temporary Commented until we know exactly how it works. 22/09/2022\\r\\n else if ((alarmCodeInt & 131072) == 131072) {\\r\\n var alarm = 'ALA-F';\\r\\n info = 'Alarm Finished';\\r\\n }\\r\\n //Amber Alert EC03 only\\r\\n else if ((alarmCodeInt & 262144) == 262144) {\\r\\n var alarm = 'ALA';\\r\\n }\\r\\n // welfare Alert check-in ALA-O\\r\\n else if ((alarmCodeInt & 524288) == 524288) {\\r\\n var alarm = 'ALA-O';\\r\\n }\\r\\n // Amber alert Ending ALA-C\\r\\n else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n var alarm = 'ALA-C';\\r\\n }\\r\\n // Amber alert Ending ALA-C\\r\\n //else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n // var alarm = 'ALA-C';\\r\\n //}\\r\\n // Fall-Down Alert ending\\r\\n else if ((alarmCodeInt & 2097152) == 2097152) {\\r\\n var alarm = 'ALF-C';\\r\\n }\\r\\n // welfare Alert Ending ALA\\r\\n else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n var alarm = 'ALA';\\r\\n }\\r\\n // Beacon absent Alert 11/10/22. Need to be added in msg types\\r\\n //else if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n // var alarm = 'BEA';\\r\\n //}\\r\\n general += 'alarm:' + alarm + ',';\\r\\n break;\\r\\n //Custom ID\\r\\n case '03':\\r\\n customID = value;\\r\\n if (!allowedCID.includes(value)) {\\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 //<>,<>,<>,<>,<>\\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 if (!allowedCID.includes(customID)) {\\r\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n AddValue(codeValues, \\\"customID\\\", customID);\\r\\n return\\r\\n }\\r\\n if (statusDevice) {\\r\\n messageForReceiver = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n }\\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;\\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 }\\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 = 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 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 = (`Watch-${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 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 = (`Watch-${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 // SPO2\\r\\n case '41':\\r\\n var numSPO = (keyLength - 2) / 12;\\r\\n for (let j = 0; j < numSPO; 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 SPOHex = value.substring(8, 10);\\r\\n var SPO = hexToDecimal(SPOHex);\\r\\n var trustLevelHex = value.substring(10, 12);\\r\\n var trustLevel = hexToDecimal(trustLevelHex);\\r\\n info = SPO;\\r\\n //var alarmCode = 'True';\\r\\n var alarm = 'SPO2';\\r\\n general += ' SPO2 rate' + j + ':' + SPO + ',';\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};SPO2=${info};TLEVEL=${trustLevel};LABEL=%`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n }\\r\\n break;\\r\\n //BLE Connected . For Flic button\\r\\n case '62':\\r\\n location_type = 'BLE';\\r\\n //var alarm = 'EBZI'; \\r\\n //var latitudeHex = '00';\\r\\n //var longitudeHex = '00';\\r\\n //var descr = 'empty';\\r\\n var flag = hexToDecimal(value.substring(0, 2)); // 0= Disconnected, 1= Connected\\r\\n var mac = value.substring(2, 14); // No hace falta darle la vuelta\\r\\n // add : format in MAC\\r\\n mac = mac.match(/.{1,2}/g).join(':');\\r\\n var batLevel = hexToDecimal(value.substring(14, 16)); // 0-100\\r\\n //location_time = timestamp;\\r\\n ble_data = `${flag},${batLevel},${mac}`;\\r\\n general += 'BLE location (State):' + flag + ', (bat):' + batLevel + ', (mac):' + mac + ',';\\r\\n break;\\r\\n }\\r\\n }\\r\\n if (alarmCode) {\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch;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 = (`Watch;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': // Ringer Volume\\r\\n var volume = hexToDecimal(value);\\r\\n imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;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 = (`Watch;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 '0F': // Enable control.... Used for STEP COUNTING SETTINGS\\r\\n // 'FF FF 21 80'\\r\\n var StepStatus = hex2bin(value.substring(4, 6));\\r\\n var enalbleDisable = '';\\r\\n if (StepStatus.substring(7, 8) == '1') {\\r\\n var step = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var step = 'Disable, '\\r\\n };\\r\\n //var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n //hrate += detectingInterval;\\r\\n AddValue(codeValues, \\\"step\\\", step);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadStepsSettings.EnableDisableReadStepsSettings, enalbleDisable);\\r\\n //AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadStepsSettings.EnableDisableReadStepsSettings);\\r\\n //configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\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 = (`Watch;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 '34': //ContactList with name\\r\\n var contactNumber = value.substring(1, 2);\\r\\n var telLength = hexToDecimal(value.substring(2, 4));\\r\\n var tel = '';\\r\\n switch (contactNumber) {\\r\\n // Emergency Number\\r\\n case '0':\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n break;\\r\\n // Speed Dial Number\\r\\n //case '1':\\r\\n // tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n // AddValue(codeValues, \\\"SpeedDialNumber\\\", tel);\\r\\n // AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.SpeedDialNumber, tel);\\r\\n // configsToAck.push(configIds.ReadSpeedDialSettings.SpeedDialNumber);\\r\\n // break;\\r\\n // Gateway Number\\r\\n case '9': //00447781482635,Esendex UK 0034627177148,Esendex Spain 00447507288240,Esendex UK Acceptance\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n if (tel.includes('447781482635') || tel.includes('00447781482635')) {\\r\\n tel = 'Esendex UK'\\r\\n } else if (tel.includes('34627177148') || tel.includes('0034627177148')) {\\r\\n tel = 'Esendex Spain'\\r\\n } else if (tel.includes('447507288240') || tel.includes('00447507288240')) {\\r\\n tel = 'Esendex UK Acceptance'\\r\\n } else {\\r\\n tel = 'Default'\\r\\n }\\r\\n AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n break;\\r\\n default:\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n if (tel.length < 6) {\\r\\n contacts += '';\\r\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n break;\\r\\n }\\r\\n //contacts += 'A' + (contactNumber - 1) + ': ' + tel + ', ';\\r\\n contacts += tel + ', ';\\r\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n break;\\r\\n }\\r\\n break;\\r\\n case '40': // APN\\r\\n //no ACK need\\r\\n AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'));\\r\\n configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\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 = (`Watch;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 = (`Watch;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 '46': //HeartRate\\r\\n // '10 0E 00 80'\\r\\n var HeartRateStatus = hex2bin(value.substring(6, 8));\\r\\n var enalbleDisable = '';\\r\\n if (HeartRateStatus.substring(0, 1) == '1') {\\r\\n var hrate = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var hrate = 'Disable, '\\r\\n };\\r\\n var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n hrate += detectingInterval;\\r\\n AddValue(codeValues, \\\"hrate\\\", hrate);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings);\\r\\n configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\r\\n break;\\r\\n case '47': // Custom Id\\r\\n imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;ACK-CUSTID;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"customeid\\\", value);\\r\\n AddValue(configsToUpdate, configIds.ReadState.CustomId, hex_to_ascii(value)); //now it comes \\\"3036\\\"\\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 // commented until Eview fixes this function\\r\\n /*\\r\\n messageForReceiver = (`Watch;ACK-NOMOTION;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"nomotion\\\", alertSetting);\\r\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings, enableDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n configsToAck.push(configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings);\\r\\n configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n */\\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 = (`Watch;ACK-FALLALERT;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n var sesibityOptionValue = hexToDecimal(value.substring(1, 2));\\r\\n sensibility += sesibityOptionValue;\\r\\n AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n //AddValue(configsToUpdate, configIds.ReadAlertSettings.FallSettings, sensibility);\\r\\n AddValue(configsToUpdate, configIds.ReadFallSettings.EnableDisableFallSettings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadFallSettings.Sensitivity, sesibityOptionValue);\\r\\n //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n configsToAck.push(configIds.ReadFallSettings.EnableDisableFallSettings);\\r\\n configsToAck.push(configIds.ReadFallSettings.Sensitivity);\\r\\n break;\\r\\n case '73': //BeaconList\\r\\n var beaconNumber = hexToDecimal(value.substring(1, 2));\\r\\n var beaconStatus = hex2bin(value.substring(0, 1));\\r\\n beaconStatus = hex_to_ascii(value.substring(30, value.length));\\r\\n //beaconStatus = changeEndianness(value.substring(30, value.length));\\r\\n //homeBeacon += 'B' + (beaconNumber + 1) + ': ' + beaconStatus + ', ';\\r\\n homeBeacon += beaconStatus + ', ';\\r\\n AddValue(codeValues, \\\"homeBeacon\\\", homeBeacon);\\r\\n messageForReceiver = (`Watch;ACK-GDATA;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n break;\\r\\n case '4A': //Wifi Network List\\r\\n var wifiSSIDLenght = hexToDecimal(value.substring(2, 4));\\r\\n var wifiPasswordLenght = hexToDecimal(value.substring(4, 6));\\r\\n var wifiIndex = hexToDecimal(value.substring(1, 2));\\r\\n //var wifiStatus = hexToDecimal(value.substring(0, 1));\\r\\n var wifiStatus = value.substring(0, 1);\\r\\n /*var enalbleDisable = wifiSSID = wifiPassword = homeWifi = '';\\r\\n /var homeWifi = '';\\r\\n if (wifiIndex == '0') { // Only first Wifi of the list\\r\\n if (wifiStatus == '8') {\\r\\n homeWifi += ' Enable, '\\r\\n enalbleDisable = '1';\\r\\n } else {\\r\\n homeWifi += ' Disable, '\\r\\n //enalbleDisable = '0';\\r\\n };*/\\r\\n if ((wifiStatus == '8') || (wifiStatus == 'C')) { // 8 == ON OR C== ON and Connected\\r\\n var wifiSSID = hex_to_ascii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\r\\n var wifiPassword = hex_to_ascii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\r\\n var imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;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 = (`Watch;ACK-SPEED;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"speed\\\", alertSetting);\\r\\n AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\r\\n configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n break;\\r\\n case '7A': //[Length]:05 [Key]:7A [Value]:60 54 00 80\\r\\n // {\\\"spo2Interval\\\":{\\\"interval\\\":21600,\\\"status\\\":1}}\\r\\n var SPOStatus = hex2bin(value.substring(6, 8));\\r\\n var enalbleDisable = '';\\r\\n if (SPOStatus.substring(0, 1) == '1') {\\r\\n var spo = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var spo = 'Disable, '\\r\\n };\\r\\n var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n spo += detectingInterval;\\r\\n AddValue(codeValues, \\\"SPO2\\\", spo);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadSPO2Settings.EnableDisableReadSPO2Settings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadSPO2Settings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadSPO2Settings.EnableDisableReadSPO2Settings);\\r\\n configsToAck.push(configIds.ReadSPO2Settings.ReportingFrequency);\\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 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 = (`Watch-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 = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch-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 if (typeof configIds !== 'undefined' && configIds && configIds.ConfigureDevice && configIds.ConfigureDevice.LastConfigured) { // when is defined\\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 }\\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(hex) { // Hex to Ascii \\r\\n if (hex.length % 2 !== 0) {\\r\\n throw new Error(\\\"Hex string length must be even\\\");\\r\\n }\\r\\n let ascii = '';\\r\\n for (let i = 0; i < hex.length; i += 2) {\\r\\n const byte = hex.substr(i, 2);\\r\\n const charCode = parseInt(byte, 16);\\r\\n if (charCode !== 0) { // remove null character (\\\\u0000)\\r\\n ascii += String.fromCharCode(charCode);\\r\\n }\\r\\n }\\r\\n return ascii;\\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":1763496553},{"Type":1,"NewValue":"{\"Id\":437,\"Name\":\"Access TEC Care Watch\",\"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 // Watch protocol - please see variables and typical values in order below\\r\\n // Watch-CYC;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;SIGNAL=<>;WM=<>;GENERAL=<>\\r\\n // Watch-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\r\\n //\\r\\n // Author: Juanmi Navarro\\r\\n // Created: 01/01/0000\\r\\n // Last modified: 18/09/2025\\r\\n //\\r\\n ///////////////////////////////////////////////////////////////////////////////\\r\\n if (typeof localTesting === \\\"undefined\\\") {\\r\\n let localTesting = false;\\r\\n }\\r\\n const crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,\\r\\n 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,\\r\\n 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,\\r\\n 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,\\r\\n 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,\\r\\n 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,\\r\\n 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,\\r\\n 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,\\r\\n 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,\\r\\n 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,\\r\\n 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,\\r\\n 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,\\r\\n 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,\\r\\n 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,\\r\\n 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,\\r\\n 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,\\r\\n 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,\\r\\n 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,\\r\\n 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,\\r\\n 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,\\r\\n 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,\\r\\n 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n ];\\r\\n var codeValues = [];\\r\\n AddValue(codeValues, 'protocol_template', 'Watch');\\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 = (`Watch-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 var allowedCID = ['3036', '06'];\\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 } 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 }\\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 //<>,<>,<> \\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];\\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 //<>,<>,<> \\r\\n if (mac2) {\\r\\n AddValue(codeValues, 'beacon_mac', mac2);\\r\\n var simpleQuery2 = [{\\r\\n 'code': 'Mac',\\r\\n 'value': mac2,\\r\\n }];\\r\\n var simpleQueryLabel2 = {\\r\\n 'table': 'beacons',\\r\\n 'select': 'Name',\\r\\n 'query': simpleQuery2\\r\\n };\\r\\n var labels2 = [];\\r\\n labels2.push(JSON.stringify(simpleQueryLabel2));\\r\\n AddValue(codeValues, 'oysta_labels', JSON.stringify(labels2));\\r\\n }\\r\\n if (params.beacon_major) {\\r\\n AddValue(codeValues, 'beacon_major', params.beacon_major);\\r\\n } else {\\r\\n AddValue(codeValues, 'beacon_major', 0);\\r\\n }\\r\\n if (params.beacon_minor) {\\r\\n AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\r\\n } else {\\r\\n AddValue(codeValues, 'beacon_minor', 0);\\r\\n }\\r\\n //AddValue(codeValues,'oysta_labels', label);\\r\\n //AddValue(codeValues,'oysta_value', mac);\\r\\n }\\r\\n /* meter mas tarde... \\r\\n if (params.smart_data !== 'undefined') {\\r\\n var gen_location = params.smart_data.split(',')\\r\\n var latitude = gen_location[0]\\r\\n var longitude = gen_location[1]\\r\\n var location_accuracy = gen_location[2]\\r\\n var altitude = gen_location[3]\\r\\n AddValue(codeValues,'latitude', latitude);\\r\\n AddValue(codeValues,'longitude', longitude);\\r\\n AddValue(codeValues,'altitude', altitude);\\r\\n AddValue(codeValues,'location_accuracy', location_accuracy);\\r\\n }\\r\\n */\\r\\n /*else if ((params.event_time) && (params.event_time == '')) {\\r\\n var event_time = moment.utc().unix();\\r\\n AddValue(codeValues,'event_time', event_time);\\r\\n } revisar mas adelante*/\\r\\n if (params.location_time) {\\r\\n AddValue(codeValues, 'location_time', params.location_time);\\r\\n }\\r\\n if (params.event_time) {\\r\\n AddValue(codeValues, 'event_time', params.event_time);\\r\\n }\\r\\n // to parse SMS info from the device\\r\\n switch (messageTypeLocalCode) {\\r\\n case 'COMM-SMS': // SMS message sent in\\r\\n if (params.data.startsWith('Device location request')) {\\r\\n configsToAck.push(configIds.Controls.RealTimeLocate);\\r\\n } else if (params.data.startsWith('Set IP ok')) {\\r\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n } else if (params.data.startsWith('IMEI:')) {\\r\\n configsToAck.push(configIds.Controls.GetFirmwareVersion);\\r\\n } else if (params.data.startsWith('Set IP ok')) {\\r\\n configsToAck.push(configIds.Controls.ClearBufferedMessages);\\r\\n } else if (params.data.startsWith('flush ok')) {\\r\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n } else if (params.data.startsWith('Set Watch-')) {\\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 = (`Watch-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 = (`Watch;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 = (`Watch;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 = (`Watch-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 // decode global msg\\r\\n function decoder(str) { // decode rawdata\\r\\n // CARE Decoder\\r\\n //AddValue(codeValues, 'Message : ', str);\\r\\n var message = str;\\r\\n var index = 18;\\r\\n //parse header & properties\\r\\n var properties = message.substring(2, 4);\\r\\n var lengthLittleEndian = message.substring(4, 8);\\r\\n var total_length = lengthLittleEndian.substring(2, 4) + lengthLittleEndian.substring(0, 2);\\r\\n total_length = 2 * hexToDecimal(total_length.substring(0, 4));\\r\\n var sequenceID = message.substring(12, 16);\\r\\n var command = message.substring(16, 18);\\r\\n //mask bitwise (properties should be '10')\\r\\n if ((parseInt(properties) & 8) == 8) {\\r\\n needsAck = true;\\r\\n } else needsAck = false;\\r\\n // need to check if checksum is correct for possible msg corruption 10/03/23\\r\\n var checksum = message.substring(8, 12);\\r\\n var messageBody = message.substring(16, message.length);\\r\\n debug('message =' + message);\\r\\n debug('checksum =' + checksum);\\r\\n debug('calculateCheckSum =' + calculateCheckSum(messageBody));\\r\\n if (calculateCheckSum(messageBody) == checksum) { // payload is valid\\r\\n debug(\\\"message has valid checksum\\\");\\r\\n var messageBody = command; // update value for the ACK\\r\\n debug('command =' + command);\\r\\n if (command == '01') {\\r\\n while (index < total_length + 16) {\\r\\n 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\\r\\n if ((alarmCodeExtInt & 1) == 1) {\\r\\n var alarm = 'ALF-C';\\r\\n }\\r\\n // Welfare Check-out\\r\\n else if ((alarmCodeExtInt & 2) == 2) {\\r\\n var alarm = 'ALA-C';\\r\\n }\\r\\n // Standard Alerts\\r\\n //Battery low\\r\\n else if ((alarmCodeInt & 1) == 1) {\\r\\n var alarm = 'BATL';\\r\\n }\\r\\n //Overspeed\\r\\n else if ((alarmCodeInt & 2) == 2) {\\r\\n var alarm = 'ALSP';\\r\\n }\\r\\n //Fall\\r\\n else if ((alarmCodeInt & 4) == 4) {\\r\\n var alarm = 'ALF';\\r\\n }\\r\\n //Tilt\\r\\n else if ((alarmCodeInt & 8) == 8) {\\r\\n var alarm = 'TLT';\\r\\n } else if ((alarmCodeInt & 16) == 16) {\\r\\n if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n var alarm = 'Geo1-IN';\\r\\n } else {\\r\\n var alarm = 'Geo1-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 32) == 32) {\\r\\n if ((alarmCodeInt & 33554432) == 33554432) {\\r\\n var alarm = 'Geo2-IN';\\r\\n } else {\\r\\n var alarm = 'Geo2-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 64) == 64) {\\r\\n if ((alarmCodeInt & 67108864) == 67108864) {\\r\\n var alarm = 'Geo3-IN';\\r\\n } else {\\r\\n var alarm = 'Geo3-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 128) == 128) {\\r\\n if ((alarmCodeInt & 134217728) == 134217728) {\\r\\n var alarm = 'Geo4-IN';\\r\\n } else {\\r\\n var alarm = 'Geo4-OUT';\\r\\n }\\r\\n }\\r\\n //Power Off\\r\\n else if ((alarmCodeInt & 256) == 256) {\\r\\n var alarm = 'PWRF';\\r\\n }\\r\\n //Power On\\r\\n else if ((alarmCodeInt & 512) == 512) {\\r\\n var alarm = 'PWRN';\\r\\n }\\r\\n //Motion\\r\\n else if ((alarmCodeInt & 1024) == 1024) {\\r\\n var alarm = 'ALMOV';\\r\\n }\\r\\n //No Motion\\r\\n else if ((alarmCodeInt & 2048) == 2048) {\\r\\n var alarm = 'ALNM';\\r\\n }\\r\\n //SOS\\r\\n else if ((alarmCodeInt & 4096) == 4096) {\\r\\n var alarm = 'ALSOS';\\r\\n } else if ((alarmCodeInt & 8192) == 8192) {\\r\\n var alarm = 'Side1';\\r\\n } else if ((alarmCodeInt & 16384) == 16384) {\\r\\n var alarm = 'Side2';\\r\\n }\\r\\n //Battery charging\\r\\n else if ((alarmCodeInt & 32768) == 32768) {\\r\\n var alarm = 'BATCN';\\r\\n }\\r\\n //Battery no charging\\r\\n else if ((alarmCodeInt & 65536) == 65536) {\\r\\n var alarm = 'BATCF';\\r\\n }\\r\\n //SOS Ending\\r\\n // Temporary Commented until we know exactly how it works. 22/09/2022\\r\\n else if ((alarmCodeInt & 131072) == 131072) {\\r\\n var alarm = 'ALA-F';\\r\\n info = 'Alarm Finished';\\r\\n }\\r\\n //Amber Alert EC03 only\\r\\n else if ((alarmCodeInt & 262144) == 262144) {\\r\\n var alarm = 'ALA';\\r\\n }\\r\\n // welfare Alert check-in ALA-O\\r\\n else if ((alarmCodeInt & 524288) == 524288) {\\r\\n var alarm = 'ALA-O';\\r\\n }\\r\\n // Amber alert Ending ALA-C\\r\\n else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n var alarm = 'ALA-C';\\r\\n }\\r\\n // Amber alert Ending ALA-C\\r\\n //else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n // var alarm = 'ALA-C';\\r\\n //}\\r\\n // Fall-Down Alert ending\\r\\n else if ((alarmCodeInt & 2097152) == 2097152) {\\r\\n var alarm = 'ALF-C';\\r\\n }\\r\\n // welfare Alert Ending ALA\\r\\n else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n var alarm = 'ALA';\\r\\n }\\r\\n // Beacon absent Alert 11/10/22. Need to be added in msg types\\r\\n //else if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n // var alarm = 'BEA';\\r\\n //}\\r\\n general += 'alarm:' + alarm + ',';\\r\\n break;\\r\\n //Custom ID\\r\\n case '03':\\r\\n customID = value;\\r\\n if (!allowedCID.includes(value)) {\\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 //<>,<>,<>,<>,<>\\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 if (!allowedCID.includes(customID)) {\\r\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n AddValue(codeValues, \\\"customID\\\", customID);\\r\\n return\\r\\n }\\r\\n if (statusDevice) {\\r\\n messageForReceiver = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n }\\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;\\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 }\\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 = 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 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 var rawlabel = 'steps';\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=${rawlabel}`);\\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 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 = (`Watch-${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 // SPO2\\r\\n case '41':\\r\\n var numSPO = (keyLength - 2) / 12;\\r\\n for (let j = 0; j < numSPO; 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 SPOHex = value.substring(8, 10);\\r\\n var SPO = hexToDecimal(SPOHex);\\r\\n var trustLevelHex = value.substring(10, 12);\\r\\n var trustLevel = hexToDecimal(trustLevelHex);\\r\\n info = SPO;\\r\\n //var alarmCode = 'True';\\r\\n var alarm = 'SPO2';\\r\\n general += ' SPO2 rate' + j + ':' + SPO + ',';\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};SPO2=${info};TLEVEL=${trustLevel};LABEL=%`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n }\\r\\n break;\\r\\n //BLE Connected . For Flic button\\r\\n case '62':\\r\\n location_type = 'BLE';\\r\\n //var alarm = 'EBZI'; \\r\\n //var latitudeHex = '00';\\r\\n //var longitudeHex = '00';\\r\\n //var descr = 'empty';\\r\\n var flag = hexToDecimal(value.substring(0, 2)); // 0= Disconnected, 1= Connected\\r\\n var mac = value.substring(2, 14); // No hace falta darle la vuelta\\r\\n // add : format in MAC\\r\\n mac = mac.match(/.{1,2}/g).join(':');\\r\\n var batLevel = hexToDecimal(value.substring(14, 16)); // 0-100\\r\\n //location_time = timestamp;\\r\\n ble_data = `${flag},${batLevel},${mac}`;\\r\\n general += 'BLE location (State):' + flag + ', (bat):' + batLevel + ', (mac):' + mac + ',';\\r\\n break;\\r\\n }\\r\\n }\\r\\n if (alarmCode) {\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch;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 = (`Watch;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': // Ringer Volume\\r\\n var volume = hexToDecimal(value);\\r\\n imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;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 = (`Watch;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 '0F': // Enable control.... Used for STEP COUNTING SETTINGS\\r\\n // 'FF FF 21 80'\\r\\n var StepStatus = hex2bin(value.substring(4, 6));\\r\\n var enalbleDisable = '';\\r\\n if (StepStatus.substring(7, 8) == '1') {\\r\\n var step = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var step = 'Disable, '\\r\\n };\\r\\n //var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n //hrate += detectingInterval;\\r\\n AddValue(codeValues, \\\"step\\\", step);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadStepsSettings.EnableDisableReadStepsSettings, enalbleDisable);\\r\\n //AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadStepsSettings.EnableDisableReadStepsSettings);\\r\\n //configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\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 = (`Watch;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 '34': //ContactList with name\\r\\n var contactNumber = value.substring(1, 2);\\r\\n var telLength = hexToDecimal(value.substring(2, 4));\\r\\n var tel = '';\\r\\n switch (contactNumber) {\\r\\n // Emergency Number\\r\\n case '0':\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n break;\\r\\n // Speed Dial Number\\r\\n //case '1':\\r\\n // tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n // AddValue(codeValues, \\\"SpeedDialNumber\\\", tel);\\r\\n // AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.SpeedDialNumber, tel);\\r\\n // configsToAck.push(configIds.ReadSpeedDialSettings.SpeedDialNumber);\\r\\n // break;\\r\\n // Gateway Number\\r\\n case '9': //00447781482635,Esendex UK 0034627177148,Esendex Spain 00447507288240,Esendex UK Acceptance\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n if (tel.includes('447781482635') || tel.includes('00447781482635')) {\\r\\n tel = 'Esendex UK'\\r\\n } else if (tel.includes('34627177148') || tel.includes('0034627177148')) {\\r\\n tel = 'Esendex Spain'\\r\\n } else if (tel.includes('447507288240') || tel.includes('00447507288240')) {\\r\\n tel = 'Esendex UK Acceptance'\\r\\n } else {\\r\\n tel = 'Default'\\r\\n }\\r\\n AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n break;\\r\\n default:\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n if (tel.length < 6) {\\r\\n contacts += '';\\r\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n break;\\r\\n }\\r\\n //contacts += 'A' + (contactNumber - 1) + ': ' + tel + ', ';\\r\\n contacts += tel + ', ';\\r\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n break;\\r\\n }\\r\\n break;\\r\\n case '40': // APN\\r\\n //no ACK need\\r\\n AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'));\\r\\n configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\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 = (`Watch;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 = (`Watch;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 '46': //HeartRate\\r\\n // '10 0E 00 80'\\r\\n var HeartRateStatus = hex2bin(value.substring(6, 8));\\r\\n var enalbleDisable = '';\\r\\n if (HeartRateStatus.substring(0, 1) == '1') {\\r\\n var hrate = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var hrate = 'Disable, '\\r\\n };\\r\\n var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n hrate += detectingInterval;\\r\\n AddValue(codeValues, \\\"hrate\\\", hrate);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings);\\r\\n configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\r\\n break;\\r\\n case '47': // Custom Id\\r\\n imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;ACK-CUSTID;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"customeid\\\", value);\\r\\n AddValue(configsToUpdate, configIds.ReadState.CustomId, hex_to_ascii(value)); //now it comes \\\"3036\\\"\\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 // commented until Eview fixes this function\\r\\n /*\\r\\n messageForReceiver = (`Watch;ACK-NOMOTION;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"nomotion\\\", alertSetting);\\r\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings, enableDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n configsToAck.push(configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings);\\r\\n configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n */\\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 = (`Watch;ACK-FALLALERT;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n var sesibityOptionValue = hexToDecimal(value.substring(1, 2));\\r\\n sensibility += sesibityOptionValue;\\r\\n AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n //AddValue(configsToUpdate, configIds.ReadAlertSettings.FallSettings, sensibility);\\r\\n AddValue(configsToUpdate, configIds.ReadFallSettings.EnableDisableFallSettings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadFallSettings.Sensitivity, sesibityOptionValue);\\r\\n //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n configsToAck.push(configIds.ReadFallSettings.EnableDisableFallSettings);\\r\\n configsToAck.push(configIds.ReadFallSettings.Sensitivity);\\r\\n break;\\r\\n case '73': //BeaconList\\r\\n var beaconNumber = hexToDecimal(value.substring(1, 2));\\r\\n var beaconStatus = hex2bin(value.substring(0, 1));\\r\\n beaconStatus = hex_to_ascii(value.substring(30, value.length));\\r\\n //beaconStatus = changeEndianness(value.substring(30, value.length));\\r\\n //homeBeacon += 'B' + (beaconNumber + 1) + ': ' + beaconStatus + ', ';\\r\\n homeBeacon += beaconStatus + ', ';\\r\\n AddValue(codeValues, \\\"homeBeacon\\\", homeBeacon);\\r\\n messageForReceiver = (`Watch;ACK-GDATA;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n break;\\r\\n case '4A': //Wifi Network List\\r\\n var wifiSSIDLenght = hexToDecimal(value.substring(2, 4));\\r\\n var wifiPasswordLenght = hexToDecimal(value.substring(4, 6));\\r\\n var wifiIndex = hexToDecimal(value.substring(1, 2));\\r\\n //var wifiStatus = hexToDecimal(value.substring(0, 1));\\r\\n var wifiStatus = value.substring(0, 1);\\r\\n /*var enalbleDisable = wifiSSID = wifiPassword = homeWifi = '';\\r\\n /var homeWifi = '';\\r\\n if (wifiIndex == '0') { // Only first Wifi of the list\\r\\n if (wifiStatus == '8') {\\r\\n homeWifi += ' Enable, '\\r\\n enalbleDisable = '1';\\r\\n } else {\\r\\n homeWifi += ' Disable, '\\r\\n //enalbleDisable = '0';\\r\\n };*/\\r\\n if ((wifiStatus == '8') || (wifiStatus == 'C')) { // 8 == ON OR C== ON and Connected\\r\\n var wifiSSID = hex_to_ascii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\r\\n var wifiPassword = hex_to_ascii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\r\\n var imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;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 = (`Watch;ACK-SPEED;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"speed\\\", alertSetting);\\r\\n AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\r\\n configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n break;\\r\\n case '7A': //[Length]:05 [Key]:7A [Value]:60 54 00 80\\r\\n // {\\\"spo2Interval\\\":{\\\"interval\\\":21600,\\\"status\\\":1}}\\r\\n var SPOStatus = hex2bin(value.substring(6, 8));\\r\\n var enalbleDisable = '';\\r\\n if (SPOStatus.substring(0, 1) == '1') {\\r\\n var spo = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var spo = 'Disable, '\\r\\n };\\r\\n var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n spo += detectingInterval;\\r\\n AddValue(codeValues, \\\"SPO2\\\", spo);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadSPO2Settings.EnableDisableReadSPO2Settings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadSPO2Settings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadSPO2Settings.EnableDisableReadSPO2Settings);\\r\\n configsToAck.push(configIds.ReadSPO2Settings.ReportingFrequency);\\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 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 = (`Watch-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 = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch-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 if (typeof configIds !== 'undefined' && configIds && configIds.ConfigureDevice && configIds.ConfigureDevice.LastConfigured) { // when is defined\\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 }\\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(hex) { // Hex to Ascii \\r\\n if (hex.length % 2 !== 0) {\\r\\n throw new Error(\\\"Hex string length must be even\\\");\\r\\n }\\r\\n let ascii = '';\\r\\n for (let i = 0; i < hex.length; i += 2) {\\r\\n const byte = hex.substr(i, 2);\\r\\n const charCode = parseInt(byte, 16);\\r\\n if (charCode !== 0) { // remove null character (\\\\u0000)\\r\\n ascii += String.fromCharCode(charCode);\\r\\n }\\r\\n }\\r\\n return ascii;\\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":1765479698},{"Type":1,"NewValue":"{\"Id\":437,\"Name\":\"Access TEC Care Watch\",\"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 // Watch protocol - please see variables and typical values in order below\\r\\n // Watch-CYC;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;SIGNAL=<>;WM=<>;GENERAL=<>\\r\\n // Watch-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\r\\n //\\r\\n // Author: Juanmi Navarro\\r\\n // Created: 01/01/0000\\r\\n // Last modified: 18/09/2025\\r\\n //\\r\\n ///////////////////////////////////////////////////////////////////////////////\\r\\n if (typeof localTesting === \\\"undefined\\\") {\\r\\n let localTesting = false;\\r\\n }\\r\\n const crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,\\r\\n 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,\\r\\n 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,\\r\\n 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,\\r\\n 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,\\r\\n 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,\\r\\n 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,\\r\\n 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,\\r\\n 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,\\r\\n 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,\\r\\n 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,\\r\\n 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,\\r\\n 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,\\r\\n 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,\\r\\n 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,\\r\\n 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,\\r\\n 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,\\r\\n 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,\\r\\n 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,\\r\\n 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,\\r\\n 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,\\r\\n 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n ];\\r\\n var codeValues = [];\\r\\n AddValue(codeValues, 'protocol_template', 'Watch');\\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 = (`Watch-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 var allowedCID = ['3036', '06'];\\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 } 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 }\\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 //<>,<>,<> \\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];\\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 //<>,<>,<> \\r\\n if (mac2) {\\r\\n AddValue(codeValues, 'beacon_mac', mac2);\\r\\n var simpleQuery2 = [{\\r\\n 'code': 'Mac',\\r\\n 'value': mac2,\\r\\n }];\\r\\n var simpleQueryLabel2 = {\\r\\n 'table': 'beacons',\\r\\n 'select': 'Name',\\r\\n 'query': simpleQuery2\\r\\n };\\r\\n var labels2 = [];\\r\\n labels2.push(JSON.stringify(simpleQueryLabel2));\\r\\n AddValue(codeValues, 'oysta_labels', JSON.stringify(labels2));\\r\\n }\\r\\n if (params.beacon_major) {\\r\\n AddValue(codeValues, 'beacon_major', params.beacon_major);\\r\\n } else {\\r\\n AddValue(codeValues, 'beacon_major', 0);\\r\\n }\\r\\n if (params.beacon_minor) {\\r\\n AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\r\\n } else {\\r\\n AddValue(codeValues, 'beacon_minor', 0);\\r\\n }\\r\\n //AddValue(codeValues,'oysta_labels', label);\\r\\n //AddValue(codeValues,'oysta_value', mac);\\r\\n }\\r\\n /* meter mas tarde... \\r\\n if (params.smart_data !== 'undefined') {\\r\\n var gen_location = params.smart_data.split(',')\\r\\n var latitude = gen_location[0]\\r\\n var longitude = gen_location[1]\\r\\n var location_accuracy = gen_location[2]\\r\\n var altitude = gen_location[3]\\r\\n AddValue(codeValues,'latitude', latitude);\\r\\n AddValue(codeValues,'longitude', longitude);\\r\\n AddValue(codeValues,'altitude', altitude);\\r\\n AddValue(codeValues,'location_accuracy', location_accuracy);\\r\\n }\\r\\n */\\r\\n /*else if ((params.event_time) && (params.event_time == '')) {\\r\\n var event_time = moment.utc().unix();\\r\\n AddValue(codeValues,'event_time', event_time);\\r\\n } revisar mas adelante*/\\r\\n if (params.location_time) {\\r\\n AddValue(codeValues, 'location_time', params.location_time);\\r\\n }\\r\\n if (params.event_time) {\\r\\n AddValue(codeValues, 'event_time', params.event_time);\\r\\n }\\r\\n // to parse SMS info from the device\\r\\n switch (messageTypeLocalCode) {\\r\\n case 'COMM-SMS': // SMS message sent in\\r\\n if (params.data.startsWith('Device location request')) {\\r\\n configsToAck.push(configIds.Controls.RealTimeLocate);\\r\\n } else if (params.data.startsWith('Set IP ok')) {\\r\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n } else if (params.data.startsWith('IMEI:')) {\\r\\n configsToAck.push(configIds.Controls.GetFirmwareVersion);\\r\\n } else if (params.data.startsWith('Set IP ok')) {\\r\\n configsToAck.push(configIds.Controls.ClearBufferedMessages);\\r\\n } else if (params.data.startsWith('flush ok')) {\\r\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n } else if (params.data.startsWith('Set Watch-')) {\\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 = (`Watch-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 = (`Watch;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 = (`Watch;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 = (`Watch-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 // decode global msg\\r\\n function decoder(str) { // decode rawdata\\r\\n // CARE Decoder\\r\\n //AddValue(codeValues, 'Message : ', str);\\r\\n var message = str;\\r\\n var index = 18;\\r\\n //parse header & properties\\r\\n var properties = message.substring(2, 4);\\r\\n var lengthLittleEndian = message.substring(4, 8);\\r\\n var total_length = lengthLittleEndian.substring(2, 4) + lengthLittleEndian.substring(0, 2);\\r\\n total_length = 2 * hexToDecimal(total_length.substring(0, 4));\\r\\n var sequenceID = message.substring(12, 16);\\r\\n var command = message.substring(16, 18);\\r\\n //mask bitwise (properties should be '10')\\r\\n if ((parseInt(properties) & 8) == 8) {\\r\\n needsAck = true;\\r\\n } else needsAck = false;\\r\\n // need to check if checksum is correct for possible msg corruption 10/03/23\\r\\n var checksum = message.substring(8, 12);\\r\\n var messageBody = message.substring(16, message.length);\\r\\n debug('message =' + message);\\r\\n debug('checksum =' + checksum);\\r\\n debug('calculateCheckSum =' + calculateCheckSum(messageBody));\\r\\n if (calculateCheckSum(messageBody) == checksum) { // payload is valid\\r\\n debug(\\\"message has valid checksum\\\");\\r\\n var messageBody = command; // update value for the ACK\\r\\n debug('command =' + command);\\r\\n if (command == '01') {\\r\\n while (index < total_length + 16) {\\r\\n 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\\r\\n if ((alarmCodeExtInt & 1) == 1) {\\r\\n var alarm = 'ALF-C';\\r\\n }\\r\\n // Welfare Check-out\\r\\n else if ((alarmCodeExtInt & 2) == 2) {\\r\\n var alarm = 'ALA-C';\\r\\n }\\r\\n // Standard Alerts\\r\\n //Battery low\\r\\n else if ((alarmCodeInt & 1) == 1) {\\r\\n var alarm = 'BATL';\\r\\n }\\r\\n //Overspeed\\r\\n else if ((alarmCodeInt & 2) == 2) {\\r\\n var alarm = 'ALSP';\\r\\n }\\r\\n //Fall\\r\\n else if ((alarmCodeInt & 4) == 4) {\\r\\n var alarm = 'ALF';\\r\\n }\\r\\n //Tilt\\r\\n else if ((alarmCodeInt & 8) == 8) {\\r\\n var alarm = 'TLT';\\r\\n } else if ((alarmCodeInt & 16) == 16) {\\r\\n if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n var alarm = 'Geo1-IN';\\r\\n } else {\\r\\n var alarm = 'Geo1-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 32) == 32) {\\r\\n if ((alarmCodeInt & 33554432) == 33554432) {\\r\\n var alarm = 'Geo2-IN';\\r\\n } else {\\r\\n var alarm = 'Geo2-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 64) == 64) {\\r\\n if ((alarmCodeInt & 67108864) == 67108864) {\\r\\n var alarm = 'Geo3-IN';\\r\\n } else {\\r\\n var alarm = 'Geo3-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 128) == 128) {\\r\\n if ((alarmCodeInt & 134217728) == 134217728) {\\r\\n var alarm = 'Geo4-IN';\\r\\n } else {\\r\\n var alarm = 'Geo4-OUT';\\r\\n }\\r\\n }\\r\\n //Power Off\\r\\n else if ((alarmCodeInt & 256) == 256) {\\r\\n var alarm = 'PWRF';\\r\\n }\\r\\n //Power On\\r\\n else if ((alarmCodeInt & 512) == 512) {\\r\\n var alarm = 'PWRN';\\r\\n }\\r\\n //Motion\\r\\n else if ((alarmCodeInt & 1024) == 1024) {\\r\\n var alarm = 'ALMOV';\\r\\n }\\r\\n //No Motion\\r\\n else if ((alarmCodeInt & 2048) == 2048) {\\r\\n var alarm = 'ALNM';\\r\\n }\\r\\n //SOS\\r\\n else if ((alarmCodeInt & 4096) == 4096) {\\r\\n var alarm = 'ALSOS';\\r\\n } else if ((alarmCodeInt & 8192) == 8192) {\\r\\n var alarm = 'Side1';\\r\\n } else if ((alarmCodeInt & 16384) == 16384) {\\r\\n var alarm = 'Side2';\\r\\n }\\r\\n //Battery charging\\r\\n else if ((alarmCodeInt & 32768) == 32768) {\\r\\n var alarm = 'BATCN';\\r\\n }\\r\\n //Battery no charging\\r\\n else if ((alarmCodeInt & 65536) == 65536) {\\r\\n var alarm = 'BATCF';\\r\\n }\\r\\n //SOS Ending\\r\\n // Temporary Commented until we know exactly how it works. 22/09/2022\\r\\n else if ((alarmCodeInt & 131072) == 131072) {\\r\\n var alarm = 'ALA-F';\\r\\n info = 'Alarm Finished';\\r\\n }\\r\\n //Amber Alert EC03 only\\r\\n else if ((alarmCodeInt & 262144) == 262144) {\\r\\n var alarm = 'ALA';\\r\\n }\\r\\n // welfare Alert check-in ALA-O\\r\\n else if ((alarmCodeInt & 524288) == 524288) {\\r\\n var alarm = 'ALA-O';\\r\\n }\\r\\n // Amber alert Ending ALA-C\\r\\n else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n var alarm = 'ALA-C';\\r\\n }\\r\\n // Amber alert Ending ALA-C\\r\\n //else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n // var alarm = 'ALA-C';\\r\\n //}\\r\\n // Fall-Down Alert ending\\r\\n else if ((alarmCodeInt & 2097152) == 2097152) {\\r\\n var alarm = 'ALF-C';\\r\\n }\\r\\n // welfare Alert Ending ALA\\r\\n else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n var alarm = 'ALA';\\r\\n }\\r\\n // Beacon absent Alert 11/10/22. Need to be added in msg types\\r\\n //else if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n // var alarm = 'BEA';\\r\\n //}\\r\\n general += 'alarm:' + alarm + ',';\\r\\n break;\\r\\n //Custom ID\\r\\n case '03':\\r\\n customID = value;\\r\\n if (!allowedCID.includes(value)) {\\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 //<>,<>,<>,<>,<>\\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 if (!allowedCID.includes(customID)) {\\r\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n AddValue(codeValues, \\\"customID\\\", customID);\\r\\n return\\r\\n }\\r\\n if (statusDevice) {\\r\\n messageForReceiver = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n }\\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;\\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 }\\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 = 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 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 var rawlabel = 'steps';\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=${rawlabel}`);\\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 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 var rawlabel = 'bpm';\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=${rawlabel}`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n }\\r\\n break;\\r\\n // SPO2\\r\\n case '41':\\r\\n var numSPO = (keyLength - 2) / 12;\\r\\n for (let j = 0; j < numSPO; 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 SPOHex = value.substring(8, 10);\\r\\n var SPO = hexToDecimal(SPOHex);\\r\\n var trustLevelHex = value.substring(10, 12);\\r\\n var trustLevel = hexToDecimal(trustLevelHex);\\r\\n info = SPO;\\r\\n //var alarmCode = 'True';\\r\\n var alarm = 'SPO2';\\r\\n general += ' SPO2 rate' + j + ':' + SPO + ',';\\r\\n var rawlabel = '%';\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};SPO2=${info};TLEVEL=${trustLevel};LABEL=${rawlabel}`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n }\\r\\n break;\\r\\n //BLE Connected . For Flic button\\r\\n case '62':\\r\\n location_type = 'BLE';\\r\\n //var alarm = 'EBZI'; \\r\\n //var latitudeHex = '00';\\r\\n //var longitudeHex = '00';\\r\\n //var descr = 'empty';\\r\\n var flag = hexToDecimal(value.substring(0, 2)); // 0= Disconnected, 1= Connected\\r\\n var mac = value.substring(2, 14); // No hace falta darle la vuelta\\r\\n // add : format in MAC\\r\\n mac = mac.match(/.{1,2}/g).join(':');\\r\\n var batLevel = hexToDecimal(value.substring(14, 16)); // 0-100\\r\\n //location_time = timestamp;\\r\\n ble_data = `${flag},${batLevel},${mac}`;\\r\\n general += 'BLE location (State):' + flag + ', (bat):' + batLevel + ', (mac):' + mac + ',';\\r\\n break;\\r\\n }\\r\\n }\\r\\n if (alarmCode) {\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch;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 = (`Watch;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': // Ringer Volume\\r\\n var volume = hexToDecimal(value);\\r\\n imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;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 = (`Watch;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 '0F': // Enable control.... Used for STEP COUNTING SETTINGS\\r\\n // 'FF FF 21 80'\\r\\n var StepStatus = hex2bin(value.substring(4, 6));\\r\\n var enalbleDisable = '';\\r\\n if (StepStatus.substring(7, 8) == '1') {\\r\\n var step = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var step = 'Disable, '\\r\\n };\\r\\n //var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n //hrate += detectingInterval;\\r\\n AddValue(codeValues, \\\"step\\\", step);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadStepsSettings.EnableDisableReadStepsSettings, enalbleDisable);\\r\\n //AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadStepsSettings.EnableDisableReadStepsSettings);\\r\\n //configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\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 = (`Watch;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 '34': //ContactList with name\\r\\n var contactNumber = value.substring(1, 2);\\r\\n var telLength = hexToDecimal(value.substring(2, 4));\\r\\n var tel = '';\\r\\n switch (contactNumber) {\\r\\n // Emergency Number\\r\\n case '0':\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n break;\\r\\n // Speed Dial Number\\r\\n //case '1':\\r\\n // tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n // AddValue(codeValues, \\\"SpeedDialNumber\\\", tel);\\r\\n // AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.SpeedDialNumber, tel);\\r\\n // configsToAck.push(configIds.ReadSpeedDialSettings.SpeedDialNumber);\\r\\n // break;\\r\\n // Gateway Number\\r\\n case '9': //00447781482635,Esendex UK 0034627177148,Esendex Spain 00447507288240,Esendex UK Acceptance\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n if (tel.includes('447781482635') || tel.includes('00447781482635')) {\\r\\n tel = 'Esendex UK'\\r\\n } else if (tel.includes('34627177148') || tel.includes('0034627177148')) {\\r\\n tel = 'Esendex Spain'\\r\\n } else if (tel.includes('447507288240') || tel.includes('00447507288240')) {\\r\\n tel = 'Esendex UK Acceptance'\\r\\n } else {\\r\\n tel = 'Default'\\r\\n }\\r\\n AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n break;\\r\\n default:\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n if (tel.length < 6) {\\r\\n contacts += '';\\r\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n break;\\r\\n }\\r\\n //contacts += 'A' + (contactNumber - 1) + ': ' + tel + ', ';\\r\\n contacts += tel + ', ';\\r\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n break;\\r\\n }\\r\\n break;\\r\\n case '40': // APN\\r\\n //no ACK need\\r\\n AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'));\\r\\n configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\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 = (`Watch;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 = (`Watch;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 '46': //HeartRate\\r\\n // '10 0E 00 80'\\r\\n var HeartRateStatus = hex2bin(value.substring(6, 8));\\r\\n var enalbleDisable = '';\\r\\n if (HeartRateStatus.substring(0, 1) == '1') {\\r\\n var hrate = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var hrate = 'Disable, '\\r\\n };\\r\\n var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n hrate += detectingInterval;\\r\\n AddValue(codeValues, \\\"hrate\\\", hrate);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings);\\r\\n configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\r\\n break;\\r\\n case '47': // Custom Id\\r\\n imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;ACK-CUSTID;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"customeid\\\", value);\\r\\n AddValue(configsToUpdate, configIds.ReadState.CustomId, hex_to_ascii(value)); //now it comes \\\"3036\\\"\\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 // commented until Eview fixes this function\\r\\n /*\\r\\n messageForReceiver = (`Watch;ACK-NOMOTION;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"nomotion\\\", alertSetting);\\r\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings, enableDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n configsToAck.push(configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings);\\r\\n configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n */\\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 = (`Watch;ACK-FALLALERT;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n var sesibityOptionValue = hexToDecimal(value.substring(1, 2));\\r\\n sensibility += sesibityOptionValue;\\r\\n AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n //AddValue(configsToUpdate, configIds.ReadAlertSettings.FallSettings, sensibility);\\r\\n AddValue(configsToUpdate, configIds.ReadFallSettings.EnableDisableFallSettings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadFallSettings.Sensitivity, sesibityOptionValue);\\r\\n //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n configsToAck.push(configIds.ReadFallSettings.EnableDisableFallSettings);\\r\\n configsToAck.push(configIds.ReadFallSettings.Sensitivity);\\r\\n break;\\r\\n case '73': //BeaconList\\r\\n var beaconNumber = hexToDecimal(value.substring(1, 2));\\r\\n var beaconStatus = hex2bin(value.substring(0, 1));\\r\\n beaconStatus = hex_to_ascii(value.substring(30, value.length));\\r\\n //beaconStatus = changeEndianness(value.substring(30, value.length));\\r\\n //homeBeacon += 'B' + (beaconNumber + 1) + ': ' + beaconStatus + ', ';\\r\\n homeBeacon += beaconStatus + ', ';\\r\\n AddValue(codeValues, \\\"homeBeacon\\\", homeBeacon);\\r\\n messageForReceiver = (`Watch;ACK-GDATA;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n break;\\r\\n case '4A': //Wifi Network List\\r\\n var wifiSSIDLenght = hexToDecimal(value.substring(2, 4));\\r\\n var wifiPasswordLenght = hexToDecimal(value.substring(4, 6));\\r\\n var wifiIndex = hexToDecimal(value.substring(1, 2));\\r\\n //var wifiStatus = hexToDecimal(value.substring(0, 1));\\r\\n var wifiStatus = value.substring(0, 1);\\r\\n /*var enalbleDisable = wifiSSID = wifiPassword = homeWifi = '';\\r\\n /var homeWifi = '';\\r\\n if (wifiIndex == '0') { // Only first Wifi of the list\\r\\n if (wifiStatus == '8') {\\r\\n homeWifi += ' Enable, '\\r\\n enalbleDisable = '1';\\r\\n } else {\\r\\n homeWifi += ' Disable, '\\r\\n //enalbleDisable = '0';\\r\\n };*/\\r\\n if ((wifiStatus == '8') || (wifiStatus == 'C')) { // 8 == ON OR C== ON and Connected\\r\\n var wifiSSID = hex_to_ascii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\r\\n var wifiPassword = hex_to_ascii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\r\\n var imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;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 = (`Watch;ACK-SPEED;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"speed\\\", alertSetting);\\r\\n AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\r\\n configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n break;\\r\\n case '7A': //[Length]:05 [Key]:7A [Value]:60 54 00 80\\r\\n // {\\\"spo2Interval\\\":{\\\"interval\\\":21600,\\\"status\\\":1}}\\r\\n var SPOStatus = hex2bin(value.substring(6, 8));\\r\\n var enalbleDisable = '';\\r\\n if (SPOStatus.substring(0, 1) == '1') {\\r\\n var spo = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var spo = 'Disable, '\\r\\n };\\r\\n var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n spo += detectingInterval;\\r\\n AddValue(codeValues, \\\"SPO2\\\", spo);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadSPO2Settings.EnableDisableReadSPO2Settings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadSPO2Settings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadSPO2Settings.EnableDisableReadSPO2Settings);\\r\\n configsToAck.push(configIds.ReadSPO2Settings.ReportingFrequency);\\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 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 = (`Watch-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 = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch-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 if (typeof configIds !== 'undefined' && configIds && configIds.ConfigureDevice && configIds.ConfigureDevice.LastConfigured) { // when is defined\\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 }\\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(hex) { // Hex to Ascii \\r\\n if (hex.length % 2 !== 0) {\\r\\n throw new Error(\\\"Hex string length must be even\\\");\\r\\n }\\r\\n let ascii = '';\\r\\n for (let i = 0; i < hex.length; i += 2) {\\r\\n const byte = hex.substr(i, 2);\\r\\n const charCode = parseInt(byte, 16);\\r\\n if (charCode !== 0) { // remove null character (\\\\u0000)\\r\\n ascii += String.fromCharCode(charCode);\\r\\n }\\r\\n }\\r\\n return ascii;\\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":1765479872},{"Type":1,"NewValue":"{\"Id\":437,\"Name\":\"Access TEC Care Watch\",\"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 // Watch protocol - please see variables and typical values in order below\\r\\n // Watch-CYC;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;SIGNAL=<>;WM=<>;GENERAL=<>\\r\\n // Watch-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\r\\n //\\r\\n // Author: Juanmi Navarro\\r\\n // Created: 01/01/0000\\r\\n // Last modified: 18/09/2025\\r\\n //\\r\\n ///////////////////////////////////////////////////////////////////////////////\\r\\n if (typeof localTesting === \\\"undefined\\\") {\\r\\n let localTesting = false;\\r\\n }\\r\\n const crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,\\r\\n 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,\\r\\n 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,\\r\\n 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,\\r\\n 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,\\r\\n 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,\\r\\n 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,\\r\\n 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,\\r\\n 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,\\r\\n 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,\\r\\n 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,\\r\\n 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,\\r\\n 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,\\r\\n 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,\\r\\n 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,\\r\\n 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,\\r\\n 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,\\r\\n 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,\\r\\n 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,\\r\\n 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,\\r\\n 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,\\r\\n 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n ];\\r\\n var codeValues = [];\\r\\n AddValue(codeValues, 'protocol_template', 'Watch');\\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 = (`Watch-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 var allowedCID = ['3036', '06'];\\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 } 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 }\\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 //<>,<>,<> \\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];\\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 //<>,<>,<> \\r\\n if (mac2) {\\r\\n AddValue(codeValues, 'beacon_mac', mac2);\\r\\n var simpleQuery2 = [{\\r\\n 'code': 'Mac',\\r\\n 'value': mac2,\\r\\n }];\\r\\n var simpleQueryLabel2 = {\\r\\n 'table': 'beacons',\\r\\n 'select': 'Name',\\r\\n 'query': simpleQuery2\\r\\n };\\r\\n var labels2 = [];\\r\\n labels2.push(JSON.stringify(simpleQueryLabel2));\\r\\n AddValue(codeValues, 'oysta_labels', JSON.stringify(labels2));\\r\\n }\\r\\n if (params.beacon_major) {\\r\\n AddValue(codeValues, 'beacon_major', params.beacon_major);\\r\\n } else {\\r\\n AddValue(codeValues, 'beacon_major', 0);\\r\\n }\\r\\n if (params.beacon_minor) {\\r\\n AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\r\\n } else {\\r\\n AddValue(codeValues, 'beacon_minor', 0);\\r\\n }\\r\\n //AddValue(codeValues,'oysta_labels', label);\\r\\n //AddValue(codeValues,'oysta_value', mac);\\r\\n }\\r\\n /* meter mas tarde... \\r\\n if (params.smart_data !== 'undefined') {\\r\\n var gen_location = params.smart_data.split(',')\\r\\n var latitude = gen_location[0]\\r\\n var longitude = gen_location[1]\\r\\n var location_accuracy = gen_location[2]\\r\\n var altitude = gen_location[3]\\r\\n AddValue(codeValues,'latitude', latitude);\\r\\n AddValue(codeValues,'longitude', longitude);\\r\\n AddValue(codeValues,'altitude', altitude);\\r\\n AddValue(codeValues,'location_accuracy', location_accuracy);\\r\\n }\\r\\n */\\r\\n /*else if ((params.event_time) && (params.event_time == '')) {\\r\\n var event_time = moment.utc().unix();\\r\\n AddValue(codeValues,'event_time', event_time);\\r\\n } revisar mas adelante*/\\r\\n if (params.location_time) {\\r\\n AddValue(codeValues, 'location_time', params.location_time);\\r\\n }\\r\\n if (params.event_time) {\\r\\n AddValue(codeValues, 'event_time', params.event_time);\\r\\n }\\r\\n // to parse SMS info from the device\\r\\n switch (messageTypeLocalCode) {\\r\\n case 'COMM-SMS': // SMS message sent in\\r\\n if (params.data.startsWith('Device location request')) {\\r\\n configsToAck.push(configIds.Controls.RealTimeLocate);\\r\\n } else if (params.data.startsWith('Set IP ok')) {\\r\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n } else if (params.data.startsWith('IMEI:')) {\\r\\n configsToAck.push(configIds.Controls.GetFirmwareVersion);\\r\\n } else if (params.data.startsWith('Set IP ok')) {\\r\\n configsToAck.push(configIds.Controls.ClearBufferedMessages);\\r\\n } else if (params.data.startsWith('flush ok')) {\\r\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n } else if (params.data.startsWith('Set Watch-')) {\\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 = (`Watch-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 = (`Watch;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 = (`Watch;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 = (`Watch-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 // decode global msg\\r\\n function decoder(str) { // decode rawdata\\r\\n // CARE Decoder\\r\\n //AddValue(codeValues, 'Message : ', str);\\r\\n var message = str;\\r\\n var index = 18;\\r\\n //parse header & properties\\r\\n var properties = message.substring(2, 4);\\r\\n var lengthLittleEndian = message.substring(4, 8);\\r\\n var total_length = lengthLittleEndian.substring(2, 4) + lengthLittleEndian.substring(0, 2);\\r\\n total_length = 2 * hexToDecimal(total_length.substring(0, 4));\\r\\n var sequenceID = message.substring(12, 16);\\r\\n var command = message.substring(16, 18);\\r\\n //mask bitwise (properties should be '10')\\r\\n if ((parseInt(properties) & 8) == 8) {\\r\\n needsAck = true;\\r\\n } else needsAck = false;\\r\\n // need to check if checksum is correct for possible msg corruption 10/03/23\\r\\n var checksum = message.substring(8, 12);\\r\\n var messageBody = message.substring(16, message.length);\\r\\n debug('message =' + message);\\r\\n debug('checksum =' + checksum);\\r\\n debug('calculateCheckSum =' + calculateCheckSum(messageBody));\\r\\n if (calculateCheckSum(messageBody) == checksum) { // payload is valid\\r\\n debug(\\\"message has valid checksum\\\");\\r\\n var messageBody = command; // update value for the ACK\\r\\n debug('command =' + command);\\r\\n if (command == '01') {\\r\\n while (index < total_length + 16) {\\r\\n 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\\r\\n if ((alarmCodeExtInt & 1) == 1) {\\r\\n var alarm = 'ALF-C';\\r\\n }\\r\\n // Welfare Check-out\\r\\n else if ((alarmCodeExtInt & 2) == 2) {\\r\\n var alarm = 'ALA-C';\\r\\n }\\r\\n // Standard Alerts\\r\\n //Battery low\\r\\n else if ((alarmCodeInt & 1) == 1) {\\r\\n var alarm = 'BATL';\\r\\n }\\r\\n //Overspeed\\r\\n else if ((alarmCodeInt & 2) == 2) {\\r\\n var alarm = 'ALSP';\\r\\n }\\r\\n //Fall\\r\\n else if ((alarmCodeInt & 4) == 4) {\\r\\n var alarm = 'ALF';\\r\\n }\\r\\n //Tilt\\r\\n else if ((alarmCodeInt & 8) == 8) {\\r\\n var alarm = 'TLT';\\r\\n } else if ((alarmCodeInt & 16) == 16) {\\r\\n if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n var alarm = 'Geo1-IN';\\r\\n } else {\\r\\n var alarm = 'Geo1-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 32) == 32) {\\r\\n if ((alarmCodeInt & 33554432) == 33554432) {\\r\\n var alarm = 'Geo2-IN';\\r\\n } else {\\r\\n var alarm = 'Geo2-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 64) == 64) {\\r\\n if ((alarmCodeInt & 67108864) == 67108864) {\\r\\n var alarm = 'Geo3-IN';\\r\\n } else {\\r\\n var alarm = 'Geo3-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 128) == 128) {\\r\\n if ((alarmCodeInt & 134217728) == 134217728) {\\r\\n var alarm = 'Geo4-IN';\\r\\n } else {\\r\\n var alarm = 'Geo4-OUT';\\r\\n }\\r\\n }\\r\\n //Power Off\\r\\n else if ((alarmCodeInt & 256) == 256) {\\r\\n var alarm = 'PWRF';\\r\\n }\\r\\n //Power On\\r\\n else if ((alarmCodeInt & 512) == 512) {\\r\\n var alarm = 'PWRN';\\r\\n }\\r\\n //Motion\\r\\n else if ((alarmCodeInt & 1024) == 1024) {\\r\\n var alarm = 'ALMOV';\\r\\n }\\r\\n //No Motion\\r\\n else if ((alarmCodeInt & 2048) == 2048) {\\r\\n var alarm = 'ALNM';\\r\\n }\\r\\n //SOS\\r\\n else if ((alarmCodeInt & 4096) == 4096) {\\r\\n var alarm = 'ALSOS';\\r\\n } else if ((alarmCodeInt & 8192) == 8192) {\\r\\n var alarm = 'Side1';\\r\\n } else if ((alarmCodeInt & 16384) == 16384) {\\r\\n var alarm = 'Side2';\\r\\n }\\r\\n //Battery charging\\r\\n else if ((alarmCodeInt & 32768) == 32768) {\\r\\n var alarm = 'BATCN';\\r\\n }\\r\\n //Battery no charging\\r\\n else if ((alarmCodeInt & 65536) == 65536) {\\r\\n var alarm = 'BATCF';\\r\\n }\\r\\n //SOS Ending\\r\\n // Temporary Commented until we know exactly how it works. 22/09/2022\\r\\n else if ((alarmCodeInt & 131072) == 131072) {\\r\\n var alarm = 'ALA-F';\\r\\n info = 'Alarm Finished';\\r\\n }\\r\\n //Amber Alert EC03 only\\r\\n else if ((alarmCodeInt & 262144) == 262144) {\\r\\n var alarm = 'ALA';\\r\\n }\\r\\n // welfare Alert check-in ALA-O\\r\\n else if ((alarmCodeInt & 524288) == 524288) {\\r\\n var alarm = 'ALA-O';\\r\\n }\\r\\n // Amber alert Ending ALA-C\\r\\n else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n var alarm = 'ALA-C';\\r\\n }\\r\\n // Amber alert Ending ALA-C\\r\\n //else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n // var alarm = 'ALA-C';\\r\\n //}\\r\\n // Fall-Down Alert ending\\r\\n else if ((alarmCodeInt & 2097152) == 2097152) {\\r\\n var alarm = 'ALF-C';\\r\\n }\\r\\n // welfare Alert Ending ALA\\r\\n else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n var alarm = 'ALA';\\r\\n }\\r\\n // Beacon absent Alert 11/10/22. Need to be added in msg types\\r\\n //else if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n // var alarm = 'BEA';\\r\\n //}\\r\\n general += 'alarm:' + alarm + ',';\\r\\n break;\\r\\n //Custom ID\\r\\n case '03':\\r\\n customID = value;\\r\\n if (!allowedCID.includes(value)) {\\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 //<>,<>,<>,<>,<>\\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 if (!allowedCID.includes(customID)) {\\r\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n AddValue(codeValues, \\\"customID\\\", customID);\\r\\n return\\r\\n }\\r\\n if (statusDevice) {\\r\\n messageForReceiver = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n }\\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;\\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 }\\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 = 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 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 var rawlabel = ['steps'];\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=${rawlabel}`);\\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 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 var rawlabel = ['bpm'];\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=${rawlabel}`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n }\\r\\n break;\\r\\n // SPO2\\r\\n case '41':\\r\\n var numSPO = (keyLength - 2) / 12;\\r\\n for (let j = 0; j < numSPO; 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 SPOHex = value.substring(8, 10);\\r\\n var SPO = hexToDecimal(SPOHex);\\r\\n var trustLevelHex = value.substring(10, 12);\\r\\n var trustLevel = hexToDecimal(trustLevelHex);\\r\\n info = SPO;\\r\\n //var alarmCode = 'True';\\r\\n var alarm = 'SPO2';\\r\\n general += ' SPO2 rate' + j + ':' + SPO + ',';\\r\\n var rawlabel = ['%'];\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};SPO2=${info};TLEVEL=${trustLevel};LABEL=${rawlabel}`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n }\\r\\n break;\\r\\n //BLE Connected . For Flic button\\r\\n case '62':\\r\\n location_type = 'BLE';\\r\\n //var alarm = 'EBZI'; \\r\\n //var latitudeHex = '00';\\r\\n //var longitudeHex = '00';\\r\\n //var descr = 'empty';\\r\\n var flag = hexToDecimal(value.substring(0, 2)); // 0= Disconnected, 1= Connected\\r\\n var mac = value.substring(2, 14); // No hace falta darle la vuelta\\r\\n // add : format in MAC\\r\\n mac = mac.match(/.{1,2}/g).join(':');\\r\\n var batLevel = hexToDecimal(value.substring(14, 16)); // 0-100\\r\\n //location_time = timestamp;\\r\\n ble_data = `${flag},${batLevel},${mac}`;\\r\\n general += 'BLE location (State):' + flag + ', (bat):' + batLevel + ', (mac):' + mac + ',';\\r\\n break;\\r\\n }\\r\\n }\\r\\n if (alarmCode) {\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch;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 = (`Watch;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': // Ringer Volume\\r\\n var volume = hexToDecimal(value);\\r\\n imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;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 = (`Watch;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 '0F': // Enable control.... Used for STEP COUNTING SETTINGS\\r\\n // 'FF FF 21 80'\\r\\n var StepStatus = hex2bin(value.substring(4, 6));\\r\\n var enalbleDisable = '';\\r\\n if (StepStatus.substring(7, 8) == '1') {\\r\\n var step = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var step = 'Disable, '\\r\\n };\\r\\n //var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n //hrate += detectingInterval;\\r\\n AddValue(codeValues, \\\"step\\\", step);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadStepsSettings.EnableDisableReadStepsSettings, enalbleDisable);\\r\\n //AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadStepsSettings.EnableDisableReadStepsSettings);\\r\\n //configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\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 = (`Watch;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 '34': //ContactList with name\\r\\n var contactNumber = value.substring(1, 2);\\r\\n var telLength = hexToDecimal(value.substring(2, 4));\\r\\n var tel = '';\\r\\n switch (contactNumber) {\\r\\n // Emergency Number\\r\\n case '0':\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n break;\\r\\n // Speed Dial Number\\r\\n //case '1':\\r\\n // tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n // AddValue(codeValues, \\\"SpeedDialNumber\\\", tel);\\r\\n // AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.SpeedDialNumber, tel);\\r\\n // configsToAck.push(configIds.ReadSpeedDialSettings.SpeedDialNumber);\\r\\n // break;\\r\\n // Gateway Number\\r\\n case '9': //00447781482635,Esendex UK 0034627177148,Esendex Spain 00447507288240,Esendex UK Acceptance\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n if (tel.includes('447781482635') || tel.includes('00447781482635')) {\\r\\n tel = 'Esendex UK'\\r\\n } else if (tel.includes('34627177148') || tel.includes('0034627177148')) {\\r\\n tel = 'Esendex Spain'\\r\\n } else if (tel.includes('447507288240') || tel.includes('00447507288240')) {\\r\\n tel = 'Esendex UK Acceptance'\\r\\n } else {\\r\\n tel = 'Default'\\r\\n }\\r\\n AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n break;\\r\\n default:\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n if (tel.length < 6) {\\r\\n contacts += '';\\r\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n break;\\r\\n }\\r\\n //contacts += 'A' + (contactNumber - 1) + ': ' + tel + ', ';\\r\\n contacts += tel + ', ';\\r\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n break;\\r\\n }\\r\\n break;\\r\\n case '40': // APN\\r\\n //no ACK need\\r\\n AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'));\\r\\n configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\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 = (`Watch;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 = (`Watch;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 '46': //HeartRate\\r\\n // '10 0E 00 80'\\r\\n var HeartRateStatus = hex2bin(value.substring(6, 8));\\r\\n var enalbleDisable = '';\\r\\n if (HeartRateStatus.substring(0, 1) == '1') {\\r\\n var hrate = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var hrate = 'Disable, '\\r\\n };\\r\\n var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n hrate += detectingInterval;\\r\\n AddValue(codeValues, \\\"hrate\\\", hrate);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings);\\r\\n configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\r\\n break;\\r\\n case '47': // Custom Id\\r\\n imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;ACK-CUSTID;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"customeid\\\", value);\\r\\n AddValue(configsToUpdate, configIds.ReadState.CustomId, hex_to_ascii(value)); //now it comes \\\"3036\\\"\\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 // commented until Eview fixes this function\\r\\n /*\\r\\n messageForReceiver = (`Watch;ACK-NOMOTION;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"nomotion\\\", alertSetting);\\r\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings, enableDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n configsToAck.push(configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings);\\r\\n configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n */\\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 = (`Watch;ACK-FALLALERT;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n var sesibityOptionValue = hexToDecimal(value.substring(1, 2));\\r\\n sensibility += sesibityOptionValue;\\r\\n AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n //AddValue(configsToUpdate, configIds.ReadAlertSettings.FallSettings, sensibility);\\r\\n AddValue(configsToUpdate, configIds.ReadFallSettings.EnableDisableFallSettings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadFallSettings.Sensitivity, sesibityOptionValue);\\r\\n //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n configsToAck.push(configIds.ReadFallSettings.EnableDisableFallSettings);\\r\\n configsToAck.push(configIds.ReadFallSettings.Sensitivity);\\r\\n break;\\r\\n case '73': //BeaconList\\r\\n var beaconNumber = hexToDecimal(value.substring(1, 2));\\r\\n var beaconStatus = hex2bin(value.substring(0, 1));\\r\\n beaconStatus = hex_to_ascii(value.substring(30, value.length));\\r\\n //beaconStatus = changeEndianness(value.substring(30, value.length));\\r\\n //homeBeacon += 'B' + (beaconNumber + 1) + ': ' + beaconStatus + ', ';\\r\\n homeBeacon += beaconStatus + ', ';\\r\\n AddValue(codeValues, \\\"homeBeacon\\\", homeBeacon);\\r\\n messageForReceiver = (`Watch;ACK-GDATA;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n break;\\r\\n case '4A': //Wifi Network List\\r\\n var wifiSSIDLenght = hexToDecimal(value.substring(2, 4));\\r\\n var wifiPasswordLenght = hexToDecimal(value.substring(4, 6));\\r\\n var wifiIndex = hexToDecimal(value.substring(1, 2));\\r\\n //var wifiStatus = hexToDecimal(value.substring(0, 1));\\r\\n var wifiStatus = value.substring(0, 1);\\r\\n /*var enalbleDisable = wifiSSID = wifiPassword = homeWifi = '';\\r\\n /var homeWifi = '';\\r\\n if (wifiIndex == '0') { // Only first Wifi of the list\\r\\n if (wifiStatus == '8') {\\r\\n homeWifi += ' Enable, '\\r\\n enalbleDisable = '1';\\r\\n } else {\\r\\n homeWifi += ' Disable, '\\r\\n //enalbleDisable = '0';\\r\\n };*/\\r\\n if ((wifiStatus == '8') || (wifiStatus == 'C')) { // 8 == ON OR C== ON and Connected\\r\\n var wifiSSID = hex_to_ascii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\r\\n var wifiPassword = hex_to_ascii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\r\\n var imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;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 = (`Watch;ACK-SPEED;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"speed\\\", alertSetting);\\r\\n AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\r\\n configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n break;\\r\\n case '7A': //[Length]:05 [Key]:7A [Value]:60 54 00 80\\r\\n // {\\\"spo2Interval\\\":{\\\"interval\\\":21600,\\\"status\\\":1}}\\r\\n var SPOStatus = hex2bin(value.substring(6, 8));\\r\\n var enalbleDisable = '';\\r\\n if (SPOStatus.substring(0, 1) == '1') {\\r\\n var spo = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var spo = 'Disable, '\\r\\n };\\r\\n var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n spo += detectingInterval;\\r\\n AddValue(codeValues, \\\"SPO2\\\", spo);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadSPO2Settings.EnableDisableReadSPO2Settings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadSPO2Settings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadSPO2Settings.EnableDisableReadSPO2Settings);\\r\\n configsToAck.push(configIds.ReadSPO2Settings.ReportingFrequency);\\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 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 = (`Watch-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 = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch-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 if (typeof configIds !== 'undefined' && configIds && configIds.ConfigureDevice && configIds.ConfigureDevice.LastConfigured) { // when is defined\\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 }\\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(hex) { // Hex to Ascii \\r\\n if (hex.length % 2 !== 0) {\\r\\n throw new Error(\\\"Hex string length must be even\\\");\\r\\n }\\r\\n let ascii = '';\\r\\n for (let i = 0; i < hex.length; i += 2) {\\r\\n const byte = hex.substr(i, 2);\\r\\n const charCode = parseInt(byte, 16);\\r\\n if (charCode !== 0) { // remove null character (\\\\u0000)\\r\\n ascii += String.fromCharCode(charCode);\\r\\n }\\r\\n }\\r\\n return ascii;\\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":1765480260},{"Type":1,"NewValue":"{\"Id\":437,\"Name\":\"Access TEC Care Watch\",\"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 // Watch protocol - please see variables and typical values in order below\\r\\n // Watch-CYC;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;SIGNAL=<>;WM=<>;GENERAL=<>\\r\\n // Watch-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\r\\n //\\r\\n // Author: Juanmi Navarro\\r\\n // Created: 01/01/0000\\r\\n // Last modified: 18/09/2025\\r\\n //\\r\\n ///////////////////////////////////////////////////////////////////////////////\\r\\n if (typeof localTesting === \\\"undefined\\\") {\\r\\n let localTesting = false;\\r\\n }\\r\\n const crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,\\r\\n 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,\\r\\n 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,\\r\\n 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,\\r\\n 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,\\r\\n 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,\\r\\n 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,\\r\\n 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,\\r\\n 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,\\r\\n 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,\\r\\n 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,\\r\\n 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,\\r\\n 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,\\r\\n 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,\\r\\n 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,\\r\\n 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,\\r\\n 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,\\r\\n 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,\\r\\n 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,\\r\\n 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,\\r\\n 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,\\r\\n 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n ];\\r\\n var codeValues = [];\\r\\n AddValue(codeValues, 'protocol_template', 'Watch');\\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 = (`Watch-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 var allowedCID = ['3036', '06'];\\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 } else if (oystaTemplate == 'True') { // Oysta Template \\r\\n AddValue(codeValues, 'rawMsg', raw);\\r\\n if ((params.rawlabel) && (params.rawlabel !== '')) { // decode label if exists\\r\\n var labels = normalizeLabels(params.rawlabel); // \\\"steps\\\" -> [\\\"steps\\\"]\\r\\n AddValue(codeValues, 'oysta_labels', fix_state);\\r\\n }\\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 //<>,<>,<> \\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];\\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 //<>,<>,<> \\r\\n if (mac2) {\\r\\n AddValue(codeValues, 'beacon_mac', mac2);\\r\\n var simpleQuery2 = [{\\r\\n 'code': 'Mac',\\r\\n 'value': mac2,\\r\\n }];\\r\\n var simpleQueryLabel2 = {\\r\\n 'table': 'beacons',\\r\\n 'select': 'Name',\\r\\n 'query': simpleQuery2\\r\\n };\\r\\n var labels2 = [];\\r\\n labels2.push(JSON.stringify(simpleQueryLabel2));\\r\\n AddValue(codeValues, 'oysta_labels', JSON.stringify(labels2));\\r\\n }\\r\\n if (params.beacon_major) {\\r\\n AddValue(codeValues, 'beacon_major', params.beacon_major);\\r\\n } else {\\r\\n AddValue(codeValues, 'beacon_major', 0);\\r\\n }\\r\\n if (params.beacon_minor) {\\r\\n AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\r\\n } else {\\r\\n AddValue(codeValues, 'beacon_minor', 0);\\r\\n }\\r\\n //AddValue(codeValues,'oysta_labels', label);\\r\\n //AddValue(codeValues,'oysta_value', mac);\\r\\n }\\r\\n /* meter mas tarde... \\r\\n if (params.smart_data !== 'undefined') {\\r\\n var gen_location = params.smart_data.split(',')\\r\\n var latitude = gen_location[0]\\r\\n var longitude = gen_location[1]\\r\\n var location_accuracy = gen_location[2]\\r\\n var altitude = gen_location[3]\\r\\n AddValue(codeValues,'latitude', latitude);\\r\\n AddValue(codeValues,'longitude', longitude);\\r\\n AddValue(codeValues,'altitude', altitude);\\r\\n AddValue(codeValues,'location_accuracy', location_accuracy);\\r\\n }\\r\\n */\\r\\n /*else if ((params.event_time) && (params.event_time == '')) {\\r\\n var event_time = moment.utc().unix();\\r\\n AddValue(codeValues,'event_time', event_time);\\r\\n } revisar mas adelante*/\\r\\n if (params.location_time) {\\r\\n AddValue(codeValues, 'location_time', params.location_time);\\r\\n }\\r\\n if (params.event_time) {\\r\\n AddValue(codeValues, 'event_time', params.event_time);\\r\\n }\\r\\n // to parse SMS info from the device\\r\\n switch (messageTypeLocalCode) {\\r\\n case 'COMM-SMS': // SMS message sent in\\r\\n if (params.data.startsWith('Device location request')) {\\r\\n configsToAck.push(configIds.Controls.RealTimeLocate);\\r\\n } else if (params.data.startsWith('Set IP ok')) {\\r\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n } else if (params.data.startsWith('IMEI:')) {\\r\\n configsToAck.push(configIds.Controls.GetFirmwareVersion);\\r\\n } else if (params.data.startsWith('Set IP ok')) {\\r\\n configsToAck.push(configIds.Controls.ClearBufferedMessages);\\r\\n } else if (params.data.startsWith('flush ok')) {\\r\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n } else if (params.data.startsWith('Set Watch-')) {\\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 = (`Watch-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 = (`Watch;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 = (`Watch;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 = (`Watch-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 // decode global msg\\r\\n function decoder(str) { // decode rawdata\\r\\n // CARE Decoder\\r\\n //AddValue(codeValues, 'Message : ', str);\\r\\n var message = str;\\r\\n var index = 18;\\r\\n //parse header & properties\\r\\n var properties = message.substring(2, 4);\\r\\n var lengthLittleEndian = message.substring(4, 8);\\r\\n var total_length = lengthLittleEndian.substring(2, 4) + lengthLittleEndian.substring(0, 2);\\r\\n total_length = 2 * hexToDecimal(total_length.substring(0, 4));\\r\\n var sequenceID = message.substring(12, 16);\\r\\n var command = message.substring(16, 18);\\r\\n //mask bitwise (properties should be '10')\\r\\n if ((parseInt(properties) & 8) == 8) {\\r\\n needsAck = true;\\r\\n } else needsAck = false;\\r\\n // need to check if checksum is correct for possible msg corruption 10/03/23\\r\\n var checksum = message.substring(8, 12);\\r\\n var messageBody = message.substring(16, message.length);\\r\\n debug('message =' + message);\\r\\n debug('checksum =' + checksum);\\r\\n debug('calculateCheckSum =' + calculateCheckSum(messageBody));\\r\\n if (calculateCheckSum(messageBody) == checksum) { // payload is valid\\r\\n debug(\\\"message has valid checksum\\\");\\r\\n var messageBody = command; // update value for the ACK\\r\\n debug('command =' + command);\\r\\n if (command == '01') {\\r\\n while (index < total_length + 16) {\\r\\n 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\\r\\n if ((alarmCodeExtInt & 1) == 1) {\\r\\n var alarm = 'ALF-C';\\r\\n }\\r\\n // Welfare Check-out\\r\\n else if ((alarmCodeExtInt & 2) == 2) {\\r\\n var alarm = 'ALA-C';\\r\\n }\\r\\n // Standard Alerts\\r\\n //Battery low\\r\\n else if ((alarmCodeInt & 1) == 1) {\\r\\n var alarm = 'BATL';\\r\\n }\\r\\n //Overspeed\\r\\n else if ((alarmCodeInt & 2) == 2) {\\r\\n var alarm = 'ALSP';\\r\\n }\\r\\n //Fall\\r\\n else if ((alarmCodeInt & 4) == 4) {\\r\\n var alarm = 'ALF';\\r\\n }\\r\\n //Tilt\\r\\n else if ((alarmCodeInt & 8) == 8) {\\r\\n var alarm = 'TLT';\\r\\n } else if ((alarmCodeInt & 16) == 16) {\\r\\n if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n var alarm = 'Geo1-IN';\\r\\n } else {\\r\\n var alarm = 'Geo1-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 32) == 32) {\\r\\n if ((alarmCodeInt & 33554432) == 33554432) {\\r\\n var alarm = 'Geo2-IN';\\r\\n } else {\\r\\n var alarm = 'Geo2-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 64) == 64) {\\r\\n if ((alarmCodeInt & 67108864) == 67108864) {\\r\\n var alarm = 'Geo3-IN';\\r\\n } else {\\r\\n var alarm = 'Geo3-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 128) == 128) {\\r\\n if ((alarmCodeInt & 134217728) == 134217728) {\\r\\n var alarm = 'Geo4-IN';\\r\\n } else {\\r\\n var alarm = 'Geo4-OUT';\\r\\n }\\r\\n }\\r\\n //Power Off\\r\\n else if ((alarmCodeInt & 256) == 256) {\\r\\n var alarm = 'PWRF';\\r\\n }\\r\\n //Power On\\r\\n else if ((alarmCodeInt & 512) == 512) {\\r\\n var alarm = 'PWRN';\\r\\n }\\r\\n //Motion\\r\\n else if ((alarmCodeInt & 1024) == 1024) {\\r\\n var alarm = 'ALMOV';\\r\\n }\\r\\n //No Motion\\r\\n else if ((alarmCodeInt & 2048) == 2048) {\\r\\n var alarm = 'ALNM';\\r\\n }\\r\\n //SOS\\r\\n else if ((alarmCodeInt & 4096) == 4096) {\\r\\n var alarm = 'ALSOS';\\r\\n } else if ((alarmCodeInt & 8192) == 8192) {\\r\\n var alarm = 'Side1';\\r\\n } else if ((alarmCodeInt & 16384) == 16384) {\\r\\n var alarm = 'Side2';\\r\\n }\\r\\n //Battery charging\\r\\n else if ((alarmCodeInt & 32768) == 32768) {\\r\\n var alarm = 'BATCN';\\r\\n }\\r\\n //Battery no charging\\r\\n else if ((alarmCodeInt & 65536) == 65536) {\\r\\n var alarm = 'BATCF';\\r\\n }\\r\\n //SOS Ending\\r\\n // Temporary Commented until we know exactly how it works. 22/09/2022\\r\\n else if ((alarmCodeInt & 131072) == 131072) {\\r\\n var alarm = 'ALA-F';\\r\\n info = 'Alarm Finished';\\r\\n }\\r\\n //Amber Alert EC03 only\\r\\n else if ((alarmCodeInt & 262144) == 262144) {\\r\\n var alarm = 'ALA';\\r\\n }\\r\\n // welfare Alert check-in ALA-O\\r\\n else if ((alarmCodeInt & 524288) == 524288) {\\r\\n var alarm = 'ALA-O';\\r\\n }\\r\\n // Amber alert Ending ALA-C\\r\\n else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n var alarm = 'ALA-C';\\r\\n }\\r\\n // Amber alert Ending ALA-C\\r\\n //else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n // var alarm = 'ALA-C';\\r\\n //}\\r\\n // Fall-Down Alert ending\\r\\n else if ((alarmCodeInt & 2097152) == 2097152) {\\r\\n var alarm = 'ALF-C';\\r\\n }\\r\\n // welfare Alert Ending ALA\\r\\n else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n var alarm = 'ALA';\\r\\n }\\r\\n // Beacon absent Alert 11/10/22. Need to be added in msg types\\r\\n //else if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n // var alarm = 'BEA';\\r\\n //}\\r\\n general += 'alarm:' + alarm + ',';\\r\\n break;\\r\\n //Custom ID\\r\\n case '03':\\r\\n customID = value;\\r\\n if (!allowedCID.includes(value)) {\\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 //<>,<>,<>,<>,<>\\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 if (!allowedCID.includes(customID)) {\\r\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n AddValue(codeValues, \\\"customID\\\", customID);\\r\\n return\\r\\n }\\r\\n if (statusDevice) {\\r\\n messageForReceiver = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n }\\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;\\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 }\\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 = 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 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 var rawlabel = 'steps';\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=${rawlabel}`);\\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 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 var rawlabel = 'bpm';\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=${rawlabel}`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n }\\r\\n break;\\r\\n // SPO2\\r\\n case '41':\\r\\n var numSPO = (keyLength - 2) / 12;\\r\\n for (let j = 0; j < numSPO; 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 SPOHex = value.substring(8, 10);\\r\\n var SPO = hexToDecimal(SPOHex);\\r\\n var trustLevelHex = value.substring(10, 12);\\r\\n var trustLevel = hexToDecimal(trustLevelHex);\\r\\n info = SPO;\\r\\n //var alarmCode = 'True';\\r\\n var alarm = 'SPO2';\\r\\n general += ' SPO2 rate' + j + ':' + SPO + ',';\\r\\n var rawlabel = '%';\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};SPO2=${info};TLEVEL=${trustLevel};LABEL=${rawlabel}`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n }\\r\\n break;\\r\\n //BLE Connected . For Flic button\\r\\n case '62':\\r\\n location_type = 'BLE';\\r\\n //var alarm = 'EBZI'; \\r\\n //var latitudeHex = '00';\\r\\n //var longitudeHex = '00';\\r\\n //var descr = 'empty';\\r\\n var flag = hexToDecimal(value.substring(0, 2)); // 0= Disconnected, 1= Connected\\r\\n var mac = value.substring(2, 14); // No hace falta darle la vuelta\\r\\n // add : format in MAC\\r\\n mac = mac.match(/.{1,2}/g).join(':');\\r\\n var batLevel = hexToDecimal(value.substring(14, 16)); // 0-100\\r\\n //location_time = timestamp;\\r\\n ble_data = `${flag},${batLevel},${mac}`;\\r\\n general += 'BLE location (State):' + flag + ', (bat):' + batLevel + ', (mac):' + mac + ',';\\r\\n break;\\r\\n }\\r\\n }\\r\\n if (alarmCode) {\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch;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 = (`Watch;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': // Ringer Volume\\r\\n var volume = hexToDecimal(value);\\r\\n imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;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 = (`Watch;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 '0F': // Enable control.... Used for STEP COUNTING SETTINGS\\r\\n // 'FF FF 21 80'\\r\\n var StepStatus = hex2bin(value.substring(4, 6));\\r\\n var enalbleDisable = '';\\r\\n if (StepStatus.substring(7, 8) == '1') {\\r\\n var step = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var step = 'Disable, '\\r\\n };\\r\\n //var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n //hrate += detectingInterval;\\r\\n AddValue(codeValues, \\\"step\\\", step);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadStepsSettings.EnableDisableReadStepsSettings, enalbleDisable);\\r\\n //AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadStepsSettings.EnableDisableReadStepsSettings);\\r\\n //configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\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 = (`Watch;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 '34': //ContactList with name\\r\\n var contactNumber = value.substring(1, 2);\\r\\n var telLength = hexToDecimal(value.substring(2, 4));\\r\\n var tel = '';\\r\\n switch (contactNumber) {\\r\\n // Emergency Number\\r\\n case '0':\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n break;\\r\\n // Speed Dial Number\\r\\n //case '1':\\r\\n // tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n // AddValue(codeValues, \\\"SpeedDialNumber\\\", tel);\\r\\n // AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.SpeedDialNumber, tel);\\r\\n // configsToAck.push(configIds.ReadSpeedDialSettings.SpeedDialNumber);\\r\\n // break;\\r\\n // Gateway Number\\r\\n case '9': //00447781482635,Esendex UK 0034627177148,Esendex Spain 00447507288240,Esendex UK Acceptance\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n if (tel.includes('447781482635') || tel.includes('00447781482635')) {\\r\\n tel = 'Esendex UK'\\r\\n } else if (tel.includes('34627177148') || tel.includes('0034627177148')) {\\r\\n tel = 'Esendex Spain'\\r\\n } else if (tel.includes('447507288240') || tel.includes('00447507288240')) {\\r\\n tel = 'Esendex UK Acceptance'\\r\\n } else {\\r\\n tel = 'Default'\\r\\n }\\r\\n AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n break;\\r\\n default:\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n if (tel.length < 6) {\\r\\n contacts += '';\\r\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n break;\\r\\n }\\r\\n //contacts += 'A' + (contactNumber - 1) + ': ' + tel + ', ';\\r\\n contacts += tel + ', ';\\r\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n break;\\r\\n }\\r\\n break;\\r\\n case '40': // APN\\r\\n //no ACK need\\r\\n AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'));\\r\\n configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\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 = (`Watch;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 = (`Watch;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 '46': //HeartRate\\r\\n // '10 0E 00 80'\\r\\n var HeartRateStatus = hex2bin(value.substring(6, 8));\\r\\n var enalbleDisable = '';\\r\\n if (HeartRateStatus.substring(0, 1) == '1') {\\r\\n var hrate = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var hrate = 'Disable, '\\r\\n };\\r\\n var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n hrate += detectingInterval;\\r\\n AddValue(codeValues, \\\"hrate\\\", hrate);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings);\\r\\n configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\r\\n break;\\r\\n case '47': // Custom Id\\r\\n imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;ACK-CUSTID;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"customeid\\\", value);\\r\\n AddValue(configsToUpdate, configIds.ReadState.CustomId, hex_to_ascii(value)); //now it comes \\\"3036\\\"\\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 // commented until Eview fixes this function\\r\\n /*\\r\\n messageForReceiver = (`Watch;ACK-NOMOTION;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"nomotion\\\", alertSetting);\\r\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings, enableDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n configsToAck.push(configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings);\\r\\n configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n */\\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 = (`Watch;ACK-FALLALERT;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n var sesibityOptionValue = hexToDecimal(value.substring(1, 2));\\r\\n sensibility += sesibityOptionValue;\\r\\n AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n //AddValue(configsToUpdate, configIds.ReadAlertSettings.FallSettings, sensibility);\\r\\n AddValue(configsToUpdate, configIds.ReadFallSettings.EnableDisableFallSettings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadFallSettings.Sensitivity, sesibityOptionValue);\\r\\n //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n configsToAck.push(configIds.ReadFallSettings.EnableDisableFallSettings);\\r\\n configsToAck.push(configIds.ReadFallSettings.Sensitivity);\\r\\n break;\\r\\n case '73': //BeaconList\\r\\n var beaconNumber = hexToDecimal(value.substring(1, 2));\\r\\n var beaconStatus = hex2bin(value.substring(0, 1));\\r\\n beaconStatus = hex_to_ascii(value.substring(30, value.length));\\r\\n //beaconStatus = changeEndianness(value.substring(30, value.length));\\r\\n //homeBeacon += 'B' + (beaconNumber + 1) + ': ' + beaconStatus + ', ';\\r\\n homeBeacon += beaconStatus + ', ';\\r\\n AddValue(codeValues, \\\"homeBeacon\\\", homeBeacon);\\r\\n messageForReceiver = (`Watch;ACK-GDATA;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n break;\\r\\n case '4A': //Wifi Network List\\r\\n var wifiSSIDLenght = hexToDecimal(value.substring(2, 4));\\r\\n var wifiPasswordLenght = hexToDecimal(value.substring(4, 6));\\r\\n var wifiIndex = hexToDecimal(value.substring(1, 2));\\r\\n //var wifiStatus = hexToDecimal(value.substring(0, 1));\\r\\n var wifiStatus = value.substring(0, 1);\\r\\n /*var enalbleDisable = wifiSSID = wifiPassword = homeWifi = '';\\r\\n /var homeWifi = '';\\r\\n if (wifiIndex == '0') { // Only first Wifi of the list\\r\\n if (wifiStatus == '8') {\\r\\n homeWifi += ' Enable, '\\r\\n enalbleDisable = '1';\\r\\n } else {\\r\\n homeWifi += ' Disable, '\\r\\n //enalbleDisable = '0';\\r\\n };*/\\r\\n if ((wifiStatus == '8') || (wifiStatus == 'C')) { // 8 == ON OR C== ON and Connected\\r\\n var wifiSSID = hex_to_ascii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\r\\n var wifiPassword = hex_to_ascii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\r\\n var imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;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 = (`Watch;ACK-SPEED;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"speed\\\", alertSetting);\\r\\n AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\r\\n configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n break;\\r\\n case '7A': //[Length]:05 [Key]:7A [Value]:60 54 00 80\\r\\n // {\\\"spo2Interval\\\":{\\\"interval\\\":21600,\\\"status\\\":1}}\\r\\n var SPOStatus = hex2bin(value.substring(6, 8));\\r\\n var enalbleDisable = '';\\r\\n if (SPOStatus.substring(0, 1) == '1') {\\r\\n var spo = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var spo = 'Disable, '\\r\\n };\\r\\n var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n spo += detectingInterval;\\r\\n AddValue(codeValues, \\\"SPO2\\\", spo);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadSPO2Settings.EnableDisableReadSPO2Settings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadSPO2Settings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadSPO2Settings.EnableDisableReadSPO2Settings);\\r\\n configsToAck.push(configIds.ReadSPO2Settings.ReportingFrequency);\\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 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 = (`Watch-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 = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch-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 if (typeof configIds !== 'undefined' && configIds && configIds.ConfigureDevice && configIds.ConfigureDevice.LastConfigured) { // when is defined\\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 }\\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(hex) { // Hex to Ascii \\r\\n if (hex.length % 2 !== 0) {\\r\\n throw new Error(\\\"Hex string length must be even\\\");\\r\\n }\\r\\n let ascii = '';\\r\\n for (let i = 0; i < hex.length; i += 2) {\\r\\n const byte = hex.substr(i, 2);\\r\\n const charCode = parseInt(byte, 16);\\r\\n if (charCode !== 0) { // remove null character (\\\\u0000)\\r\\n ascii += String.fromCharCode(charCode);\\r\\n }\\r\\n }\\r\\n return ascii;\\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 normalizeLabels(raw) { // output labels as array\\r\\n if (raw == null) return [];\\r\\n if (Array.isArray(raw)) return raw;\\r\\n // Si en algún momento vinieran varias labels separadas por coma o ;\\r\\n return String(raw).split(/[;,]/).map(s => s.trim()).filter(Boolean);\\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":1765480978},{"Type":1,"NewValue":"{\"Id\":437,\"Name\":\"Access TEC Care Watch\",\"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 // Watch protocol - please see variables and typical values in order below\\r\\n // Watch-CYC;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;SIGNAL=<>;WM=<>;GENERAL=<>\\r\\n // Watch-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\r\\n //\\r\\n // Author: Juanmi Navarro\\r\\n // Created: 01/01/0000\\r\\n // Last modified: 18/09/2025\\r\\n //\\r\\n ///////////////////////////////////////////////////////////////////////////////\\r\\n if (typeof localTesting === \\\"undefined\\\") {\\r\\n let localTesting = false;\\r\\n }\\r\\n const crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,\\r\\n 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,\\r\\n 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,\\r\\n 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,\\r\\n 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,\\r\\n 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,\\r\\n 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,\\r\\n 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,\\r\\n 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,\\r\\n 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,\\r\\n 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,\\r\\n 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,\\r\\n 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,\\r\\n 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,\\r\\n 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,\\r\\n 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,\\r\\n 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,\\r\\n 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,\\r\\n 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,\\r\\n 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,\\r\\n 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,\\r\\n 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n ];\\r\\n var codeValues = [];\\r\\n AddValue(codeValues, 'protocol_template', 'Watch');\\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 = (`Watch-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 var allowedCID = ['3036', '06'];\\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 } else if (oystaTemplate == 'True') { // Oysta Template \\r\\n AddValue(codeValues, 'rawMsg', raw);\\r\\n if ((params.rawlabel) && (params.rawlabel !== '')) { // decode label if exists\\r\\n var labels = normalizeLabels(params.rawlabel); // \\\"steps\\\" -> [\\\"steps\\\"]\\r\\n AddValue(codeValues, 'oysta_labels', labels);\\r\\n }\\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 //<>,<>,<> \\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];\\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 //<>,<>,<> \\r\\n if (mac2) {\\r\\n AddValue(codeValues, 'beacon_mac', mac2);\\r\\n var simpleQuery2 = [{\\r\\n 'code': 'Mac',\\r\\n 'value': mac2,\\r\\n }];\\r\\n var simpleQueryLabel2 = {\\r\\n 'table': 'beacons',\\r\\n 'select': 'Name',\\r\\n 'query': simpleQuery2\\r\\n };\\r\\n var labels2 = [];\\r\\n labels2.push(JSON.stringify(simpleQueryLabel2));\\r\\n AddValue(codeValues, 'oysta_labels', JSON.stringify(labels2));\\r\\n }\\r\\n if (params.beacon_major) {\\r\\n AddValue(codeValues, 'beacon_major', params.beacon_major);\\r\\n } else {\\r\\n AddValue(codeValues, 'beacon_major', 0);\\r\\n }\\r\\n if (params.beacon_minor) {\\r\\n AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\r\\n } else {\\r\\n AddValue(codeValues, 'beacon_minor', 0);\\r\\n }\\r\\n //AddValue(codeValues,'oysta_labels', label);\\r\\n //AddValue(codeValues,'oysta_value', mac);\\r\\n }\\r\\n /* meter mas tarde... \\r\\n if (params.smart_data !== 'undefined') {\\r\\n var gen_location = params.smart_data.split(',')\\r\\n var latitude = gen_location[0]\\r\\n var longitude = gen_location[1]\\r\\n var location_accuracy = gen_location[2]\\r\\n var altitude = gen_location[3]\\r\\n AddValue(codeValues,'latitude', latitude);\\r\\n AddValue(codeValues,'longitude', longitude);\\r\\n AddValue(codeValues,'altitude', altitude);\\r\\n AddValue(codeValues,'location_accuracy', location_accuracy);\\r\\n }\\r\\n */\\r\\n /*else if ((params.event_time) && (params.event_time == '')) {\\r\\n var event_time = moment.utc().unix();\\r\\n AddValue(codeValues,'event_time', event_time);\\r\\n } revisar mas adelante*/\\r\\n if (params.location_time) {\\r\\n AddValue(codeValues, 'location_time', params.location_time);\\r\\n }\\r\\n if (params.event_time) {\\r\\n AddValue(codeValues, 'event_time', params.event_time);\\r\\n }\\r\\n // to parse SMS info from the device\\r\\n switch (messageTypeLocalCode) {\\r\\n case 'COMM-SMS': // SMS message sent in\\r\\n if (params.data.startsWith('Device location request')) {\\r\\n configsToAck.push(configIds.Controls.RealTimeLocate);\\r\\n } else if (params.data.startsWith('Set IP ok')) {\\r\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n } else if (params.data.startsWith('IMEI:')) {\\r\\n configsToAck.push(configIds.Controls.GetFirmwareVersion);\\r\\n } else if (params.data.startsWith('Set IP ok')) {\\r\\n configsToAck.push(configIds.Controls.ClearBufferedMessages);\\r\\n } else if (params.data.startsWith('flush ok')) {\\r\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n } else if (params.data.startsWith('Set Watch-')) {\\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 = (`Watch-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 = (`Watch;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 = (`Watch;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 = (`Watch-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 // decode global msg\\r\\n function decoder(str) { // decode rawdata\\r\\n // CARE Decoder\\r\\n //AddValue(codeValues, 'Message : ', str);\\r\\n var message = str;\\r\\n var index = 18;\\r\\n //parse header & properties\\r\\n var properties = message.substring(2, 4);\\r\\n var lengthLittleEndian = message.substring(4, 8);\\r\\n var total_length = lengthLittleEndian.substring(2, 4) + lengthLittleEndian.substring(0, 2);\\r\\n total_length = 2 * hexToDecimal(total_length.substring(0, 4));\\r\\n var sequenceID = message.substring(12, 16);\\r\\n var command = message.substring(16, 18);\\r\\n //mask bitwise (properties should be '10')\\r\\n if ((parseInt(properties) & 8) == 8) {\\r\\n needsAck = true;\\r\\n } else needsAck = false;\\r\\n // need to check if checksum is correct for possible msg corruption 10/03/23\\r\\n var checksum = message.substring(8, 12);\\r\\n var messageBody = message.substring(16, message.length);\\r\\n debug('message =' + message);\\r\\n debug('checksum =' + checksum);\\r\\n debug('calculateCheckSum =' + calculateCheckSum(messageBody));\\r\\n if (calculateCheckSum(messageBody) == checksum) { // payload is valid\\r\\n debug(\\\"message has valid checksum\\\");\\r\\n var messageBody = command; // update value for the ACK\\r\\n debug('command =' + command);\\r\\n if (command == '01') {\\r\\n while (index < total_length + 16) {\\r\\n 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\\r\\n if ((alarmCodeExtInt & 1) == 1) {\\r\\n var alarm = 'ALF-C';\\r\\n }\\r\\n // Welfare Check-out\\r\\n else if ((alarmCodeExtInt & 2) == 2) {\\r\\n var alarm = 'ALA-C';\\r\\n }\\r\\n // Standard Alerts\\r\\n //Battery low\\r\\n else if ((alarmCodeInt & 1) == 1) {\\r\\n var alarm = 'BATL';\\r\\n }\\r\\n //Overspeed\\r\\n else if ((alarmCodeInt & 2) == 2) {\\r\\n var alarm = 'ALSP';\\r\\n }\\r\\n //Fall\\r\\n else if ((alarmCodeInt & 4) == 4) {\\r\\n var alarm = 'ALF';\\r\\n }\\r\\n //Tilt\\r\\n else if ((alarmCodeInt & 8) == 8) {\\r\\n var alarm = 'TLT';\\r\\n } else if ((alarmCodeInt & 16) == 16) {\\r\\n if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n var alarm = 'Geo1-IN';\\r\\n } else {\\r\\n var alarm = 'Geo1-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 32) == 32) {\\r\\n if ((alarmCodeInt & 33554432) == 33554432) {\\r\\n var alarm = 'Geo2-IN';\\r\\n } else {\\r\\n var alarm = 'Geo2-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 64) == 64) {\\r\\n if ((alarmCodeInt & 67108864) == 67108864) {\\r\\n var alarm = 'Geo3-IN';\\r\\n } else {\\r\\n var alarm = 'Geo3-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 128) == 128) {\\r\\n if ((alarmCodeInt & 134217728) == 134217728) {\\r\\n var alarm = 'Geo4-IN';\\r\\n } else {\\r\\n var alarm = 'Geo4-OUT';\\r\\n }\\r\\n }\\r\\n //Power Off\\r\\n else if ((alarmCodeInt & 256) == 256) {\\r\\n var alarm = 'PWRF';\\r\\n }\\r\\n //Power On\\r\\n else if ((alarmCodeInt & 512) == 512) {\\r\\n var alarm = 'PWRN';\\r\\n }\\r\\n //Motion\\r\\n else if ((alarmCodeInt & 1024) == 1024) {\\r\\n var alarm = 'ALMOV';\\r\\n }\\r\\n //No Motion\\r\\n else if ((alarmCodeInt & 2048) == 2048) {\\r\\n var alarm = 'ALNM';\\r\\n }\\r\\n //SOS\\r\\n else if ((alarmCodeInt & 4096) == 4096) {\\r\\n var alarm = 'ALSOS';\\r\\n } else if ((alarmCodeInt & 8192) == 8192) {\\r\\n var alarm = 'Side1';\\r\\n } else if ((alarmCodeInt & 16384) == 16384) {\\r\\n var alarm = 'Side2';\\r\\n }\\r\\n //Battery charging\\r\\n else if ((alarmCodeInt & 32768) == 32768) {\\r\\n var alarm = 'BATCN';\\r\\n }\\r\\n //Battery no charging\\r\\n else if ((alarmCodeInt & 65536) == 65536) {\\r\\n var alarm = 'BATCF';\\r\\n }\\r\\n //SOS Ending\\r\\n // Temporary Commented until we know exactly how it works. 22/09/2022\\r\\n else if ((alarmCodeInt & 131072) == 131072) {\\r\\n var alarm = 'ALA-F';\\r\\n info = 'Alarm Finished';\\r\\n }\\r\\n //Amber Alert EC03 only\\r\\n else if ((alarmCodeInt & 262144) == 262144) {\\r\\n var alarm = 'ALA';\\r\\n }\\r\\n // welfare Alert check-in ALA-O\\r\\n else if ((alarmCodeInt & 524288) == 524288) {\\r\\n var alarm = 'ALA-O';\\r\\n }\\r\\n // Amber alert Ending ALA-C\\r\\n else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n var alarm = 'ALA-C';\\r\\n }\\r\\n // Amber alert Ending ALA-C\\r\\n //else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n // var alarm = 'ALA-C';\\r\\n //}\\r\\n // Fall-Down Alert ending\\r\\n else if ((alarmCodeInt & 2097152) == 2097152) {\\r\\n var alarm = 'ALF-C';\\r\\n }\\r\\n // welfare Alert Ending ALA\\r\\n else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n var alarm = 'ALA';\\r\\n }\\r\\n // Beacon absent Alert 11/10/22. Need to be added in msg types\\r\\n //else if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n // var alarm = 'BEA';\\r\\n //}\\r\\n general += 'alarm:' + alarm + ',';\\r\\n break;\\r\\n //Custom ID\\r\\n case '03':\\r\\n customID = value;\\r\\n if (!allowedCID.includes(value)) {\\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 //<>,<>,<>,<>,<>\\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 if (!allowedCID.includes(customID)) {\\r\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n AddValue(codeValues, \\\"customID\\\", customID);\\r\\n return\\r\\n }\\r\\n if (statusDevice) {\\r\\n messageForReceiver = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n }\\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;\\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 }\\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 = 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 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 var rawlabel = 'steps';\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=${rawlabel}`);\\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 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 var rawlabel = 'bpm';\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=${rawlabel}`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n }\\r\\n break;\\r\\n // SPO2\\r\\n case '41':\\r\\n var numSPO = (keyLength - 2) / 12;\\r\\n for (let j = 0; j < numSPO; 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 SPOHex = value.substring(8, 10);\\r\\n var SPO = hexToDecimal(SPOHex);\\r\\n var trustLevelHex = value.substring(10, 12);\\r\\n var trustLevel = hexToDecimal(trustLevelHex);\\r\\n info = SPO;\\r\\n //var alarmCode = 'True';\\r\\n var alarm = 'SPO2';\\r\\n general += ' SPO2 rate' + j + ':' + SPO + ',';\\r\\n var rawlabel = '%';\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};SPO2=${info};TLEVEL=${trustLevel};LABEL=${rawlabel}`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n }\\r\\n break;\\r\\n //BLE Connected . For Flic button\\r\\n case '62':\\r\\n location_type = 'BLE';\\r\\n //var alarm = 'EBZI'; \\r\\n //var latitudeHex = '00';\\r\\n //var longitudeHex = '00';\\r\\n //var descr = 'empty';\\r\\n var flag = hexToDecimal(value.substring(0, 2)); // 0= Disconnected, 1= Connected\\r\\n var mac = value.substring(2, 14); // No hace falta darle la vuelta\\r\\n // add : format in MAC\\r\\n mac = mac.match(/.{1,2}/g).join(':');\\r\\n var batLevel = hexToDecimal(value.substring(14, 16)); // 0-100\\r\\n //location_time = timestamp;\\r\\n ble_data = `${flag},${batLevel},${mac}`;\\r\\n general += 'BLE location (State):' + flag + ', (bat):' + batLevel + ', (mac):' + mac + ',';\\r\\n break;\\r\\n }\\r\\n }\\r\\n if (alarmCode) {\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch;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 = (`Watch;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': // Ringer Volume\\r\\n var volume = hexToDecimal(value);\\r\\n imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;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 = (`Watch;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 '0F': // Enable control.... Used for STEP COUNTING SETTINGS\\r\\n // 'FF FF 21 80'\\r\\n var StepStatus = hex2bin(value.substring(4, 6));\\r\\n var enalbleDisable = '';\\r\\n if (StepStatus.substring(7, 8) == '1') {\\r\\n var step = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var step = 'Disable, '\\r\\n };\\r\\n //var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n //hrate += detectingInterval;\\r\\n AddValue(codeValues, \\\"step\\\", step);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadStepsSettings.EnableDisableReadStepsSettings, enalbleDisable);\\r\\n //AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadStepsSettings.EnableDisableReadStepsSettings);\\r\\n //configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\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 = (`Watch;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 '34': //ContactList with name\\r\\n var contactNumber = value.substring(1, 2);\\r\\n var telLength = hexToDecimal(value.substring(2, 4));\\r\\n var tel = '';\\r\\n switch (contactNumber) {\\r\\n // Emergency Number\\r\\n case '0':\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n break;\\r\\n // Speed Dial Number\\r\\n //case '1':\\r\\n // tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n // AddValue(codeValues, \\\"SpeedDialNumber\\\", tel);\\r\\n // AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.SpeedDialNumber, tel);\\r\\n // configsToAck.push(configIds.ReadSpeedDialSettings.SpeedDialNumber);\\r\\n // break;\\r\\n // Gateway Number\\r\\n case '9': //00447781482635,Esendex UK 0034627177148,Esendex Spain 00447507288240,Esendex UK Acceptance\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n if (tel.includes('447781482635') || tel.includes('00447781482635')) {\\r\\n tel = 'Esendex UK'\\r\\n } else if (tel.includes('34627177148') || tel.includes('0034627177148')) {\\r\\n tel = 'Esendex Spain'\\r\\n } else if (tel.includes('447507288240') || tel.includes('00447507288240')) {\\r\\n tel = 'Esendex UK Acceptance'\\r\\n } else {\\r\\n tel = 'Default'\\r\\n }\\r\\n AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n break;\\r\\n default:\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n if (tel.length < 6) {\\r\\n contacts += '';\\r\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n break;\\r\\n }\\r\\n //contacts += 'A' + (contactNumber - 1) + ': ' + tel + ', ';\\r\\n contacts += tel + ', ';\\r\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n break;\\r\\n }\\r\\n break;\\r\\n case '40': // APN\\r\\n //no ACK need\\r\\n AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'));\\r\\n configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\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 = (`Watch;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 = (`Watch;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 '46': //HeartRate\\r\\n // '10 0E 00 80'\\r\\n var HeartRateStatus = hex2bin(value.substring(6, 8));\\r\\n var enalbleDisable = '';\\r\\n if (HeartRateStatus.substring(0, 1) == '1') {\\r\\n var hrate = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var hrate = 'Disable, '\\r\\n };\\r\\n var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n hrate += detectingInterval;\\r\\n AddValue(codeValues, \\\"hrate\\\", hrate);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings);\\r\\n configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\r\\n break;\\r\\n case '47': // Custom Id\\r\\n imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;ACK-CUSTID;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"customeid\\\", value);\\r\\n AddValue(configsToUpdate, configIds.ReadState.CustomId, hex_to_ascii(value)); //now it comes \\\"3036\\\"\\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 // commented until Eview fixes this function\\r\\n /*\\r\\n messageForReceiver = (`Watch;ACK-NOMOTION;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"nomotion\\\", alertSetting);\\r\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings, enableDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n configsToAck.push(configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings);\\r\\n configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n */\\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 = (`Watch;ACK-FALLALERT;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n var sesibityOptionValue = hexToDecimal(value.substring(1, 2));\\r\\n sensibility += sesibityOptionValue;\\r\\n AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n //AddValue(configsToUpdate, configIds.ReadAlertSettings.FallSettings, sensibility);\\r\\n AddValue(configsToUpdate, configIds.ReadFallSettings.EnableDisableFallSettings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadFallSettings.Sensitivity, sesibityOptionValue);\\r\\n //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n configsToAck.push(configIds.ReadFallSettings.EnableDisableFallSettings);\\r\\n configsToAck.push(configIds.ReadFallSettings.Sensitivity);\\r\\n break;\\r\\n case '73': //BeaconList\\r\\n var beaconNumber = hexToDecimal(value.substring(1, 2));\\r\\n var beaconStatus = hex2bin(value.substring(0, 1));\\r\\n beaconStatus = hex_to_ascii(value.substring(30, value.length));\\r\\n //beaconStatus = changeEndianness(value.substring(30, value.length));\\r\\n //homeBeacon += 'B' + (beaconNumber + 1) + ': ' + beaconStatus + ', ';\\r\\n homeBeacon += beaconStatus + ', ';\\r\\n AddValue(codeValues, \\\"homeBeacon\\\", homeBeacon);\\r\\n messageForReceiver = (`Watch;ACK-GDATA;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n break;\\r\\n case '4A': //Wifi Network List\\r\\n var wifiSSIDLenght = hexToDecimal(value.substring(2, 4));\\r\\n var wifiPasswordLenght = hexToDecimal(value.substring(4, 6));\\r\\n var wifiIndex = hexToDecimal(value.substring(1, 2));\\r\\n //var wifiStatus = hexToDecimal(value.substring(0, 1));\\r\\n var wifiStatus = value.substring(0, 1);\\r\\n /*var enalbleDisable = wifiSSID = wifiPassword = homeWifi = '';\\r\\n /var homeWifi = '';\\r\\n if (wifiIndex == '0') { // Only first Wifi of the list\\r\\n if (wifiStatus == '8') {\\r\\n homeWifi += ' Enable, '\\r\\n enalbleDisable = '1';\\r\\n } else {\\r\\n homeWifi += ' Disable, '\\r\\n //enalbleDisable = '0';\\r\\n };*/\\r\\n if ((wifiStatus == '8') || (wifiStatus == 'C')) { // 8 == ON OR C== ON and Connected\\r\\n var wifiSSID = hex_to_ascii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\r\\n var wifiPassword = hex_to_ascii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\r\\n var imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;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 = (`Watch;ACK-SPEED;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"speed\\\", alertSetting);\\r\\n AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\r\\n configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n break;\\r\\n case '7A': //[Length]:05 [Key]:7A [Value]:60 54 00 80\\r\\n // {\\\"spo2Interval\\\":{\\\"interval\\\":21600,\\\"status\\\":1}}\\r\\n var SPOStatus = hex2bin(value.substring(6, 8));\\r\\n var enalbleDisable = '';\\r\\n if (SPOStatus.substring(0, 1) == '1') {\\r\\n var spo = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var spo = 'Disable, '\\r\\n };\\r\\n var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n spo += detectingInterval;\\r\\n AddValue(codeValues, \\\"SPO2\\\", spo);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadSPO2Settings.EnableDisableReadSPO2Settings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadSPO2Settings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadSPO2Settings.EnableDisableReadSPO2Settings);\\r\\n configsToAck.push(configIds.ReadSPO2Settings.ReportingFrequency);\\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 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 = (`Watch-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 = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch-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 if (typeof configIds !== 'undefined' && configIds && configIds.ConfigureDevice && configIds.ConfigureDevice.LastConfigured) { // when is defined\\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 }\\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(hex) { // Hex to Ascii \\r\\n if (hex.length % 2 !== 0) {\\r\\n throw new Error(\\\"Hex string length must be even\\\");\\r\\n }\\r\\n let ascii = '';\\r\\n for (let i = 0; i < hex.length; i += 2) {\\r\\n const byte = hex.substr(i, 2);\\r\\n const charCode = parseInt(byte, 16);\\r\\n if (charCode !== 0) { // remove null character (\\\\u0000)\\r\\n ascii += String.fromCharCode(charCode);\\r\\n }\\r\\n }\\r\\n return ascii;\\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 normalizeLabels(raw) { // output labels as array\\r\\n if (raw == null) return [];\\r\\n if (Array.isArray(raw)) return raw;\\r\\n // Si en algún momento vinieran varias labels separadas por coma o ;\\r\\n return String(raw).split(/[;,]/).map(s => s.trim()).filter(Boolean);\\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":1765481426},{"Type":1,"NewValue":"{\"Id\":437,\"Name\":\"Access TEC Care Watch\",\"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 // Watch protocol - please see variables and typical values in order below\\r\\n // Watch-CYC;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;SIGNAL=<>;WM=<>;GENERAL=<>\\r\\n // Watch-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\r\\n //\\r\\n // Author: Juanmi Navarro\\r\\n // Created: 01/01/0000\\r\\n // Last modified: 18/09/2025\\r\\n //\\r\\n ///////////////////////////////////////////////////////////////////////////////\\r\\n if (typeof localTesting === \\\"undefined\\\") {\\r\\n let localTesting = false;\\r\\n }\\r\\n const crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,\\r\\n 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,\\r\\n 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,\\r\\n 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,\\r\\n 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,\\r\\n 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,\\r\\n 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,\\r\\n 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,\\r\\n 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,\\r\\n 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,\\r\\n 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,\\r\\n 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,\\r\\n 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,\\r\\n 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,\\r\\n 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,\\r\\n 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,\\r\\n 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,\\r\\n 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,\\r\\n 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,\\r\\n 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,\\r\\n 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,\\r\\n 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n ];\\r\\n var codeValues = [];\\r\\n AddValue(codeValues, 'protocol_template', 'Watch');\\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 = (`Watch-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 var allowedCID = ['3036', '06'];\\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 } else if (oystaTemplate == 'True') { // Oysta Template \\r\\n AddValue(codeValues, 'rawMsg', raw);\\r\\n if ((params.rawlabel) && (params.rawlabel !== '')) { // decode label if exists\\r\\n //var labels = normalizeLabels(params.rawlabel); // \\\"steps\\\" -> [\\\"steps\\\"]\\r\\n AddValue(codeValues, 'oysta_labels', params.rawlabel);\\r\\n }\\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 //<>,<>,<> \\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];\\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 //<>,<>,<> \\r\\n if (mac2) {\\r\\n AddValue(codeValues, 'beacon_mac', mac2);\\r\\n var simpleQuery2 = [{\\r\\n 'code': 'Mac',\\r\\n 'value': mac2,\\r\\n }];\\r\\n var simpleQueryLabel2 = {\\r\\n 'table': 'beacons',\\r\\n 'select': 'Name',\\r\\n 'query': simpleQuery2\\r\\n };\\r\\n var labels2 = [];\\r\\n labels2.push(JSON.stringify(simpleQueryLabel2));\\r\\n AddValue(codeValues, 'oysta_labels', JSON.stringify(labels2));\\r\\n }\\r\\n if (params.beacon_major) {\\r\\n AddValue(codeValues, 'beacon_major', params.beacon_major);\\r\\n } else {\\r\\n AddValue(codeValues, 'beacon_major', 0);\\r\\n }\\r\\n if (params.beacon_minor) {\\r\\n AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\r\\n } else {\\r\\n AddValue(codeValues, 'beacon_minor', 0);\\r\\n }\\r\\n //AddValue(codeValues,'oysta_labels', label);\\r\\n //AddValue(codeValues,'oysta_value', mac);\\r\\n }\\r\\n /* meter mas tarde... \\r\\n if (params.smart_data !== 'undefined') {\\r\\n var gen_location = params.smart_data.split(',')\\r\\n var latitude = gen_location[0]\\r\\n var longitude = gen_location[1]\\r\\n var location_accuracy = gen_location[2]\\r\\n var altitude = gen_location[3]\\r\\n AddValue(codeValues,'latitude', latitude);\\r\\n AddValue(codeValues,'longitude', longitude);\\r\\n AddValue(codeValues,'altitude', altitude);\\r\\n AddValue(codeValues,'location_accuracy', location_accuracy);\\r\\n }\\r\\n */\\r\\n /*else if ((params.event_time) && (params.event_time == '')) {\\r\\n var event_time = moment.utc().unix();\\r\\n AddValue(codeValues,'event_time', event_time);\\r\\n } revisar mas adelante*/\\r\\n if (params.location_time) {\\r\\n AddValue(codeValues, 'location_time', params.location_time);\\r\\n }\\r\\n if (params.event_time) {\\r\\n AddValue(codeValues, 'event_time', params.event_time);\\r\\n }\\r\\n // to parse SMS info from the device\\r\\n switch (messageTypeLocalCode) {\\r\\n case 'COMM-SMS': // SMS message sent in\\r\\n if (params.data.startsWith('Device location request')) {\\r\\n configsToAck.push(configIds.Controls.RealTimeLocate);\\r\\n } else if (params.data.startsWith('Set IP ok')) {\\r\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n } else if (params.data.startsWith('IMEI:')) {\\r\\n configsToAck.push(configIds.Controls.GetFirmwareVersion);\\r\\n } else if (params.data.startsWith('Set IP ok')) {\\r\\n configsToAck.push(configIds.Controls.ClearBufferedMessages);\\r\\n } else if (params.data.startsWith('flush ok')) {\\r\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n } else if (params.data.startsWith('Set Watch-')) {\\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 = (`Watch-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 = (`Watch;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 = (`Watch;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 = (`Watch-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 // decode global msg\\r\\n function decoder(str) { // decode rawdata\\r\\n // CARE Decoder\\r\\n //AddValue(codeValues, 'Message : ', str);\\r\\n var message = str;\\r\\n var index = 18;\\r\\n //parse header & properties\\r\\n var properties = message.substring(2, 4);\\r\\n var lengthLittleEndian = message.substring(4, 8);\\r\\n var total_length = lengthLittleEndian.substring(2, 4) + lengthLittleEndian.substring(0, 2);\\r\\n total_length = 2 * hexToDecimal(total_length.substring(0, 4));\\r\\n var sequenceID = message.substring(12, 16);\\r\\n var command = message.substring(16, 18);\\r\\n //mask bitwise (properties should be '10')\\r\\n if ((parseInt(properties) & 8) == 8) {\\r\\n needsAck = true;\\r\\n } else needsAck = false;\\r\\n // need to check if checksum is correct for possible msg corruption 10/03/23\\r\\n var checksum = message.substring(8, 12);\\r\\n var messageBody = message.substring(16, message.length);\\r\\n debug('message =' + message);\\r\\n debug('checksum =' + checksum);\\r\\n debug('calculateCheckSum =' + calculateCheckSum(messageBody));\\r\\n if (calculateCheckSum(messageBody) == checksum) { // payload is valid\\r\\n debug(\\\"message has valid checksum\\\");\\r\\n var messageBody = command; // update value for the ACK\\r\\n debug('command =' + command);\\r\\n if (command == '01') {\\r\\n while (index < total_length + 16) {\\r\\n 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\\r\\n if ((alarmCodeExtInt & 1) == 1) {\\r\\n var alarm = 'ALF-C';\\r\\n }\\r\\n // Welfare Check-out\\r\\n else if ((alarmCodeExtInt & 2) == 2) {\\r\\n var alarm = 'ALA-C';\\r\\n }\\r\\n // Standard Alerts\\r\\n //Battery low\\r\\n else if ((alarmCodeInt & 1) == 1) {\\r\\n var alarm = 'BATL';\\r\\n }\\r\\n //Overspeed\\r\\n else if ((alarmCodeInt & 2) == 2) {\\r\\n var alarm = 'ALSP';\\r\\n }\\r\\n //Fall\\r\\n else if ((alarmCodeInt & 4) == 4) {\\r\\n var alarm = 'ALF';\\r\\n }\\r\\n //Tilt\\r\\n else if ((alarmCodeInt & 8) == 8) {\\r\\n var alarm = 'TLT';\\r\\n } else if ((alarmCodeInt & 16) == 16) {\\r\\n if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n var alarm = 'Geo1-IN';\\r\\n } else {\\r\\n var alarm = 'Geo1-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 32) == 32) {\\r\\n if ((alarmCodeInt & 33554432) == 33554432) {\\r\\n var alarm = 'Geo2-IN';\\r\\n } else {\\r\\n var alarm = 'Geo2-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 64) == 64) {\\r\\n if ((alarmCodeInt & 67108864) == 67108864) {\\r\\n var alarm = 'Geo3-IN';\\r\\n } else {\\r\\n var alarm = 'Geo3-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 128) == 128) {\\r\\n if ((alarmCodeInt & 134217728) == 134217728) {\\r\\n var alarm = 'Geo4-IN';\\r\\n } else {\\r\\n var alarm = 'Geo4-OUT';\\r\\n }\\r\\n }\\r\\n //Power Off\\r\\n else if ((alarmCodeInt & 256) == 256) {\\r\\n var alarm = 'PWRF';\\r\\n }\\r\\n //Power On\\r\\n else if ((alarmCodeInt & 512) == 512) {\\r\\n var alarm = 'PWRN';\\r\\n }\\r\\n //Motion\\r\\n else if ((alarmCodeInt & 1024) == 1024) {\\r\\n var alarm = 'ALMOV';\\r\\n }\\r\\n //No Motion\\r\\n else if ((alarmCodeInt & 2048) == 2048) {\\r\\n var alarm = 'ALNM';\\r\\n }\\r\\n //SOS\\r\\n else if ((alarmCodeInt & 4096) == 4096) {\\r\\n var alarm = 'ALSOS';\\r\\n } else if ((alarmCodeInt & 8192) == 8192) {\\r\\n var alarm = 'Side1';\\r\\n } else if ((alarmCodeInt & 16384) == 16384) {\\r\\n var alarm = 'Side2';\\r\\n }\\r\\n //Battery charging\\r\\n else if ((alarmCodeInt & 32768) == 32768) {\\r\\n var alarm = 'BATCN';\\r\\n }\\r\\n //Battery no charging\\r\\n else if ((alarmCodeInt & 65536) == 65536) {\\r\\n var alarm = 'BATCF';\\r\\n }\\r\\n //SOS Ending\\r\\n // Temporary Commented until we know exactly how it works. 22/09/2022\\r\\n else if ((alarmCodeInt & 131072) == 131072) {\\r\\n var alarm = 'ALA-F';\\r\\n info = 'Alarm Finished';\\r\\n }\\r\\n //Amber Alert EC03 only\\r\\n else if ((alarmCodeInt & 262144) == 262144) {\\r\\n var alarm = 'ALA';\\r\\n }\\r\\n // welfare Alert check-in ALA-O\\r\\n else if ((alarmCodeInt & 524288) == 524288) {\\r\\n var alarm = 'ALA-O';\\r\\n }\\r\\n // Amber alert Ending ALA-C\\r\\n else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n var alarm = 'ALA-C';\\r\\n }\\r\\n // Amber alert Ending ALA-C\\r\\n //else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n // var alarm = 'ALA-C';\\r\\n //}\\r\\n // Fall-Down Alert ending\\r\\n else if ((alarmCodeInt & 2097152) == 2097152) {\\r\\n var alarm = 'ALF-C';\\r\\n }\\r\\n // welfare Alert Ending ALA\\r\\n else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n var alarm = 'ALA';\\r\\n }\\r\\n // Beacon absent Alert 11/10/22. Need to be added in msg types\\r\\n //else if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n // var alarm = 'BEA';\\r\\n //}\\r\\n general += 'alarm:' + alarm + ',';\\r\\n break;\\r\\n //Custom ID\\r\\n case '03':\\r\\n customID = value;\\r\\n if (!allowedCID.includes(value)) {\\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 //<>,<>,<>,<>,<>\\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 if (!allowedCID.includes(customID)) {\\r\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n AddValue(codeValues, \\\"customID\\\", customID);\\r\\n return\\r\\n }\\r\\n if (statusDevice) {\\r\\n messageForReceiver = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n }\\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;\\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 }\\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 = 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 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 var rawlabel = 'steps';\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=${rawlabel}`);\\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 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 var rawlabel = 'bpm';\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=${rawlabel}`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n }\\r\\n break;\\r\\n // SPO2\\r\\n case '41':\\r\\n var numSPO = (keyLength - 2) / 12;\\r\\n for (let j = 0; j < numSPO; 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 SPOHex = value.substring(8, 10);\\r\\n var SPO = hexToDecimal(SPOHex);\\r\\n var trustLevelHex = value.substring(10, 12);\\r\\n var trustLevel = hexToDecimal(trustLevelHex);\\r\\n info = SPO;\\r\\n //var alarmCode = 'True';\\r\\n var alarm = 'SPO2';\\r\\n general += ' SPO2 rate' + j + ':' + SPO + ',';\\r\\n var rawlabel = '%';\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};SPO2=${info};TLEVEL=${trustLevel};LABEL=${rawlabel}`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n }\\r\\n break;\\r\\n //BLE Connected . For Flic button\\r\\n case '62':\\r\\n location_type = 'BLE';\\r\\n //var alarm = 'EBZI'; \\r\\n //var latitudeHex = '00';\\r\\n //var longitudeHex = '00';\\r\\n //var descr = 'empty';\\r\\n var flag = hexToDecimal(value.substring(0, 2)); // 0= Disconnected, 1= Connected\\r\\n var mac = value.substring(2, 14); // No hace falta darle la vuelta\\r\\n // add : format in MAC\\r\\n mac = mac.match(/.{1,2}/g).join(':');\\r\\n var batLevel = hexToDecimal(value.substring(14, 16)); // 0-100\\r\\n //location_time = timestamp;\\r\\n ble_data = `${flag},${batLevel},${mac}`;\\r\\n general += 'BLE location (State):' + flag + ', (bat):' + batLevel + ', (mac):' + mac + ',';\\r\\n break;\\r\\n }\\r\\n }\\r\\n if (alarmCode) {\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch;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 = (`Watch;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': // Ringer Volume\\r\\n var volume = hexToDecimal(value);\\r\\n imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;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 = (`Watch;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 '0F': // Enable control.... Used for STEP COUNTING SETTINGS\\r\\n // 'FF FF 21 80'\\r\\n var StepStatus = hex2bin(value.substring(4, 6));\\r\\n var enalbleDisable = '';\\r\\n if (StepStatus.substring(7, 8) == '1') {\\r\\n var step = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var step = 'Disable, '\\r\\n };\\r\\n //var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n //hrate += detectingInterval;\\r\\n AddValue(codeValues, \\\"step\\\", step);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadStepsSettings.EnableDisableReadStepsSettings, enalbleDisable);\\r\\n //AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadStepsSettings.EnableDisableReadStepsSettings);\\r\\n //configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\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 = (`Watch;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 '34': //ContactList with name\\r\\n var contactNumber = value.substring(1, 2);\\r\\n var telLength = hexToDecimal(value.substring(2, 4));\\r\\n var tel = '';\\r\\n switch (contactNumber) {\\r\\n // Emergency Number\\r\\n case '0':\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n break;\\r\\n // Speed Dial Number\\r\\n //case '1':\\r\\n // tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n // AddValue(codeValues, \\\"SpeedDialNumber\\\", tel);\\r\\n // AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.SpeedDialNumber, tel);\\r\\n // configsToAck.push(configIds.ReadSpeedDialSettings.SpeedDialNumber);\\r\\n // break;\\r\\n // Gateway Number\\r\\n case '9': //00447781482635,Esendex UK 0034627177148,Esendex Spain 00447507288240,Esendex UK Acceptance\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n if (tel.includes('447781482635') || tel.includes('00447781482635')) {\\r\\n tel = 'Esendex UK'\\r\\n } else if (tel.includes('34627177148') || tel.includes('0034627177148')) {\\r\\n tel = 'Esendex Spain'\\r\\n } else if (tel.includes('447507288240') || tel.includes('00447507288240')) {\\r\\n tel = 'Esendex UK Acceptance'\\r\\n } else {\\r\\n tel = 'Default'\\r\\n }\\r\\n AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n break;\\r\\n default:\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n if (tel.length < 6) {\\r\\n contacts += '';\\r\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n break;\\r\\n }\\r\\n //contacts += 'A' + (contactNumber - 1) + ': ' + tel + ', ';\\r\\n contacts += tel + ', ';\\r\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n break;\\r\\n }\\r\\n break;\\r\\n case '40': // APN\\r\\n //no ACK need\\r\\n AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'));\\r\\n configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\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 = (`Watch;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 = (`Watch;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 '46': //HeartRate\\r\\n // '10 0E 00 80'\\r\\n var HeartRateStatus = hex2bin(value.substring(6, 8));\\r\\n var enalbleDisable = '';\\r\\n if (HeartRateStatus.substring(0, 1) == '1') {\\r\\n var hrate = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var hrate = 'Disable, '\\r\\n };\\r\\n var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n hrate += detectingInterval;\\r\\n AddValue(codeValues, \\\"hrate\\\", hrate);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings);\\r\\n configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\r\\n break;\\r\\n case '47': // Custom Id\\r\\n imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;ACK-CUSTID;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"customeid\\\", value);\\r\\n AddValue(configsToUpdate, configIds.ReadState.CustomId, hex_to_ascii(value)); //now it comes \\\"3036\\\"\\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 // commented until Eview fixes this function\\r\\n /*\\r\\n messageForReceiver = (`Watch;ACK-NOMOTION;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"nomotion\\\", alertSetting);\\r\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings, enableDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n configsToAck.push(configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings);\\r\\n configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n */\\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 = (`Watch;ACK-FALLALERT;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n var sesibityOptionValue = hexToDecimal(value.substring(1, 2));\\r\\n sensibility += sesibityOptionValue;\\r\\n AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n //AddValue(configsToUpdate, configIds.ReadAlertSettings.FallSettings, sensibility);\\r\\n AddValue(configsToUpdate, configIds.ReadFallSettings.EnableDisableFallSettings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadFallSettings.Sensitivity, sesibityOptionValue);\\r\\n //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n configsToAck.push(configIds.ReadFallSettings.EnableDisableFallSettings);\\r\\n configsToAck.push(configIds.ReadFallSettings.Sensitivity);\\r\\n break;\\r\\n case '73': //BeaconList\\r\\n var beaconNumber = hexToDecimal(value.substring(1, 2));\\r\\n var beaconStatus = hex2bin(value.substring(0, 1));\\r\\n beaconStatus = hex_to_ascii(value.substring(30, value.length));\\r\\n //beaconStatus = changeEndianness(value.substring(30, value.length));\\r\\n //homeBeacon += 'B' + (beaconNumber + 1) + ': ' + beaconStatus + ', ';\\r\\n homeBeacon += beaconStatus + ', ';\\r\\n AddValue(codeValues, \\\"homeBeacon\\\", homeBeacon);\\r\\n messageForReceiver = (`Watch;ACK-GDATA;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n break;\\r\\n case '4A': //Wifi Network List\\r\\n var wifiSSIDLenght = hexToDecimal(value.substring(2, 4));\\r\\n var wifiPasswordLenght = hexToDecimal(value.substring(4, 6));\\r\\n var wifiIndex = hexToDecimal(value.substring(1, 2));\\r\\n //var wifiStatus = hexToDecimal(value.substring(0, 1));\\r\\n var wifiStatus = value.substring(0, 1);\\r\\n /*var enalbleDisable = wifiSSID = wifiPassword = homeWifi = '';\\r\\n /var homeWifi = '';\\r\\n if (wifiIndex == '0') { // Only first Wifi of the list\\r\\n if (wifiStatus == '8') {\\r\\n homeWifi += ' Enable, '\\r\\n enalbleDisable = '1';\\r\\n } else {\\r\\n homeWifi += ' Disable, '\\r\\n //enalbleDisable = '0';\\r\\n };*/\\r\\n if ((wifiStatus == '8') || (wifiStatus == 'C')) { // 8 == ON OR C== ON and Connected\\r\\n var wifiSSID = hex_to_ascii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\r\\n var wifiPassword = hex_to_ascii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\r\\n var imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;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 = (`Watch;ACK-SPEED;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"speed\\\", alertSetting);\\r\\n AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\r\\n configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n break;\\r\\n case '7A': //[Length]:05 [Key]:7A [Value]:60 54 00 80\\r\\n // {\\\"spo2Interval\\\":{\\\"interval\\\":21600,\\\"status\\\":1}}\\r\\n var SPOStatus = hex2bin(value.substring(6, 8));\\r\\n var enalbleDisable = '';\\r\\n if (SPOStatus.substring(0, 1) == '1') {\\r\\n var spo = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var spo = 'Disable, '\\r\\n };\\r\\n var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n spo += detectingInterval;\\r\\n AddValue(codeValues, \\\"SPO2\\\", spo);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadSPO2Settings.EnableDisableReadSPO2Settings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadSPO2Settings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadSPO2Settings.EnableDisableReadSPO2Settings);\\r\\n configsToAck.push(configIds.ReadSPO2Settings.ReportingFrequency);\\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 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 = (`Watch-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 = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch-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 if (typeof configIds !== 'undefined' && configIds && configIds.ConfigureDevice && configIds.ConfigureDevice.LastConfigured) { // when is defined\\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 }\\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(hex) { // Hex to Ascii \\r\\n if (hex.length % 2 !== 0) {\\r\\n throw new Error(\\\"Hex string length must be even\\\");\\r\\n }\\r\\n let ascii = '';\\r\\n for (let i = 0; i < hex.length; i += 2) {\\r\\n const byte = hex.substr(i, 2);\\r\\n const charCode = parseInt(byte, 16);\\r\\n if (charCode !== 0) { // remove null character (\\\\u0000)\\r\\n ascii += String.fromCharCode(charCode);\\r\\n }\\r\\n }\\r\\n return ascii;\\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 normalizeLabels(raw) { // output labels as array\\r\\n if (raw == null) return [];\\r\\n if (Array.isArray(raw)) return raw;\\r\\n // Si en algún momento vinieran varias labels separadas por coma o ;\\r\\n return String(raw).split(/[;,]/).map(s => s.trim()).filter(Boolean);\\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":1765482205},{"Type":1,"NewValue":"{\"Id\":437,\"Name\":\"Access TEC Care Watch\",\"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 // Watch protocol - please see variables and typical values in order below\\r\\n // Watch-CYC;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;SIGNAL=<>;WM=<>;GENERAL=<>\\r\\n // Watch-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\r\\n //\\r\\n // Author: Juanmi Navarro\\r\\n // Created: 01/01/0000\\r\\n // Last modified: 18/09/2025\\r\\n //\\r\\n ///////////////////////////////////////////////////////////////////////////////\\r\\n if (typeof localTesting === \\\"undefined\\\") {\\r\\n let localTesting = false;\\r\\n }\\r\\n const crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,\\r\\n 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,\\r\\n 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,\\r\\n 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,\\r\\n 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,\\r\\n 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,\\r\\n 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,\\r\\n 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,\\r\\n 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,\\r\\n 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,\\r\\n 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,\\r\\n 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,\\r\\n 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,\\r\\n 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,\\r\\n 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,\\r\\n 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,\\r\\n 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,\\r\\n 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,\\r\\n 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,\\r\\n 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,\\r\\n 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,\\r\\n 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n ];\\r\\n var codeValues = [];\\r\\n AddValue(codeValues, 'protocol_template', 'Watch');\\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 = (`Watch-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 var allowedCID = ['3036', '06'];\\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 } else if (oystaTemplate == 'True') { // Oysta Template \\r\\n AddValue(codeValues, 'rawMsg', raw);\\r\\n if ((params.rawlabel) && (params.rawlabel !== '')) { // decode label if exists\\r\\n //var labels = normalizeLabels(params.rawlabel); // \\\"steps\\\" -> [\\\"steps\\\"]\\r\\n //AddValue(codeValues, 'oysta_labels', params.rawlabel);\\r\\n AddValue(codeValues, 'oysta_labels', `['${params.rawlabel}]'`);\\r\\n }\\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 //<>,<>,<> \\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];\\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 //<>,<>,<> \\r\\n if (mac2) {\\r\\n AddValue(codeValues, 'beacon_mac', mac2);\\r\\n var simpleQuery2 = [{\\r\\n 'code': 'Mac',\\r\\n 'value': mac2,\\r\\n }];\\r\\n var simpleQueryLabel2 = {\\r\\n 'table': 'beacons',\\r\\n 'select': 'Name',\\r\\n 'query': simpleQuery2\\r\\n };\\r\\n var labels2 = [];\\r\\n labels2.push(JSON.stringify(simpleQueryLabel2));\\r\\n AddValue(codeValues, 'oysta_labels', JSON.stringify(labels2));\\r\\n }\\r\\n if (params.beacon_major) {\\r\\n AddValue(codeValues, 'beacon_major', params.beacon_major);\\r\\n } else {\\r\\n AddValue(codeValues, 'beacon_major', 0);\\r\\n }\\r\\n if (params.beacon_minor) {\\r\\n AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\r\\n } else {\\r\\n AddValue(codeValues, 'beacon_minor', 0);\\r\\n }\\r\\n //AddValue(codeValues,'oysta_labels', label);\\r\\n //AddValue(codeValues,'oysta_value', mac);\\r\\n }\\r\\n /* meter mas tarde... \\r\\n if (params.smart_data !== 'undefined') {\\r\\n var gen_location = params.smart_data.split(',')\\r\\n var latitude = gen_location[0]\\r\\n var longitude = gen_location[1]\\r\\n var location_accuracy = gen_location[2]\\r\\n var altitude = gen_location[3]\\r\\n AddValue(codeValues,'latitude', latitude);\\r\\n AddValue(codeValues,'longitude', longitude);\\r\\n AddValue(codeValues,'altitude', altitude);\\r\\n AddValue(codeValues,'location_accuracy', location_accuracy);\\r\\n }\\r\\n */\\r\\n /*else if ((params.event_time) && (params.event_time == '')) {\\r\\n var event_time = moment.utc().unix();\\r\\n AddValue(codeValues,'event_time', event_time);\\r\\n } revisar mas adelante*/\\r\\n if (params.location_time) {\\r\\n AddValue(codeValues, 'location_time', params.location_time);\\r\\n }\\r\\n if (params.event_time) {\\r\\n AddValue(codeValues, 'event_time', params.event_time);\\r\\n }\\r\\n // to parse SMS info from the device\\r\\n switch (messageTypeLocalCode) {\\r\\n case 'COMM-SMS': // SMS message sent in\\r\\n if (params.data.startsWith('Device location request')) {\\r\\n configsToAck.push(configIds.Controls.RealTimeLocate);\\r\\n } else if (params.data.startsWith('Set IP ok')) {\\r\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n } else if (params.data.startsWith('IMEI:')) {\\r\\n configsToAck.push(configIds.Controls.GetFirmwareVersion);\\r\\n } else if (params.data.startsWith('Set IP ok')) {\\r\\n configsToAck.push(configIds.Controls.ClearBufferedMessages);\\r\\n } else if (params.data.startsWith('flush ok')) {\\r\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n } else if (params.data.startsWith('Set Watch-')) {\\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 = (`Watch-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 = (`Watch;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 = (`Watch;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 = (`Watch-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 // decode global msg\\r\\n function decoder(str) { // decode rawdata\\r\\n // CARE Decoder\\r\\n //AddValue(codeValues, 'Message : ', str);\\r\\n var message = str;\\r\\n var index = 18;\\r\\n //parse header & properties\\r\\n var properties = message.substring(2, 4);\\r\\n var lengthLittleEndian = message.substring(4, 8);\\r\\n var total_length = lengthLittleEndian.substring(2, 4) + lengthLittleEndian.substring(0, 2);\\r\\n total_length = 2 * hexToDecimal(total_length.substring(0, 4));\\r\\n var sequenceID = message.substring(12, 16);\\r\\n var command = message.substring(16, 18);\\r\\n //mask bitwise (properties should be '10')\\r\\n if ((parseInt(properties) & 8) == 8) {\\r\\n needsAck = true;\\r\\n } else needsAck = false;\\r\\n // need to check if checksum is correct for possible msg corruption 10/03/23\\r\\n var checksum = message.substring(8, 12);\\r\\n var messageBody = message.substring(16, message.length);\\r\\n debug('message =' + message);\\r\\n debug('checksum =' + checksum);\\r\\n debug('calculateCheckSum =' + calculateCheckSum(messageBody));\\r\\n if (calculateCheckSum(messageBody) == checksum) { // payload is valid\\r\\n debug(\\\"message has valid checksum\\\");\\r\\n var messageBody = command; // update value for the ACK\\r\\n debug('command =' + command);\\r\\n if (command == '01') {\\r\\n while (index < total_length + 16) {\\r\\n 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\\r\\n if ((alarmCodeExtInt & 1) == 1) {\\r\\n var alarm = 'ALF-C';\\r\\n }\\r\\n // Welfare Check-out\\r\\n else if ((alarmCodeExtInt & 2) == 2) {\\r\\n var alarm = 'ALA-C';\\r\\n }\\r\\n // Standard Alerts\\r\\n //Battery low\\r\\n else if ((alarmCodeInt & 1) == 1) {\\r\\n var alarm = 'BATL';\\r\\n }\\r\\n //Overspeed\\r\\n else if ((alarmCodeInt & 2) == 2) {\\r\\n var alarm = 'ALSP';\\r\\n }\\r\\n //Fall\\r\\n else if ((alarmCodeInt & 4) == 4) {\\r\\n var alarm = 'ALF';\\r\\n }\\r\\n //Tilt\\r\\n else if ((alarmCodeInt & 8) == 8) {\\r\\n var alarm = 'TLT';\\r\\n } else if ((alarmCodeInt & 16) == 16) {\\r\\n if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n var alarm = 'Geo1-IN';\\r\\n } else {\\r\\n var alarm = 'Geo1-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 32) == 32) {\\r\\n if ((alarmCodeInt & 33554432) == 33554432) {\\r\\n var alarm = 'Geo2-IN';\\r\\n } else {\\r\\n var alarm = 'Geo2-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 64) == 64) {\\r\\n if ((alarmCodeInt & 67108864) == 67108864) {\\r\\n var alarm = 'Geo3-IN';\\r\\n } else {\\r\\n var alarm = 'Geo3-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 128) == 128) {\\r\\n if ((alarmCodeInt & 134217728) == 134217728) {\\r\\n var alarm = 'Geo4-IN';\\r\\n } else {\\r\\n var alarm = 'Geo4-OUT';\\r\\n }\\r\\n }\\r\\n //Power Off\\r\\n else if ((alarmCodeInt & 256) == 256) {\\r\\n var alarm = 'PWRF';\\r\\n }\\r\\n //Power On\\r\\n else if ((alarmCodeInt & 512) == 512) {\\r\\n var alarm = 'PWRN';\\r\\n }\\r\\n //Motion\\r\\n else if ((alarmCodeInt & 1024) == 1024) {\\r\\n var alarm = 'ALMOV';\\r\\n }\\r\\n //No Motion\\r\\n else if ((alarmCodeInt & 2048) == 2048) {\\r\\n var alarm = 'ALNM';\\r\\n }\\r\\n //SOS\\r\\n else if ((alarmCodeInt & 4096) == 4096) {\\r\\n var alarm = 'ALSOS';\\r\\n } else if ((alarmCodeInt & 8192) == 8192) {\\r\\n var alarm = 'Side1';\\r\\n } else if ((alarmCodeInt & 16384) == 16384) {\\r\\n var alarm = 'Side2';\\r\\n }\\r\\n //Battery charging\\r\\n else if ((alarmCodeInt & 32768) == 32768) {\\r\\n var alarm = 'BATCN';\\r\\n }\\r\\n //Battery no charging\\r\\n else if ((alarmCodeInt & 65536) == 65536) {\\r\\n var alarm = 'BATCF';\\r\\n }\\r\\n //SOS Ending\\r\\n // Temporary Commented until we know exactly how it works. 22/09/2022\\r\\n else if ((alarmCodeInt & 131072) == 131072) {\\r\\n var alarm = 'ALA-F';\\r\\n info = 'Alarm Finished';\\r\\n }\\r\\n //Amber Alert EC03 only\\r\\n else if ((alarmCodeInt & 262144) == 262144) {\\r\\n var alarm = 'ALA';\\r\\n }\\r\\n // welfare Alert check-in ALA-O\\r\\n else if ((alarmCodeInt & 524288) == 524288) {\\r\\n var alarm = 'ALA-O';\\r\\n }\\r\\n // Amber alert Ending ALA-C\\r\\n else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n var alarm = 'ALA-C';\\r\\n }\\r\\n // Amber alert Ending ALA-C\\r\\n //else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n // var alarm = 'ALA-C';\\r\\n //}\\r\\n // Fall-Down Alert ending\\r\\n else if ((alarmCodeInt & 2097152) == 2097152) {\\r\\n var alarm = 'ALF-C';\\r\\n }\\r\\n // welfare Alert Ending ALA\\r\\n else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n var alarm = 'ALA';\\r\\n }\\r\\n // Beacon absent Alert 11/10/22. Need to be added in msg types\\r\\n //else if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n // var alarm = 'BEA';\\r\\n //}\\r\\n general += 'alarm:' + alarm + ',';\\r\\n break;\\r\\n //Custom ID\\r\\n case '03':\\r\\n customID = value;\\r\\n if (!allowedCID.includes(value)) {\\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 //<>,<>,<>,<>,<>\\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 if (!allowedCID.includes(customID)) {\\r\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n AddValue(codeValues, \\\"customID\\\", customID);\\r\\n return\\r\\n }\\r\\n if (statusDevice) {\\r\\n messageForReceiver = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n }\\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;\\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 }\\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 = 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 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 var rawlabel = 'steps';\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=${rawlabel}`);\\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 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 var rawlabel = 'bpm';\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=${rawlabel}`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n }\\r\\n break;\\r\\n // SPO2\\r\\n case '41':\\r\\n var numSPO = (keyLength - 2) / 12;\\r\\n for (let j = 0; j < numSPO; 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 SPOHex = value.substring(8, 10);\\r\\n var SPO = hexToDecimal(SPOHex);\\r\\n var trustLevelHex = value.substring(10, 12);\\r\\n var trustLevel = hexToDecimal(trustLevelHex);\\r\\n info = SPO;\\r\\n //var alarmCode = 'True';\\r\\n var alarm = 'SPO2';\\r\\n general += ' SPO2 rate' + j + ':' + SPO + ',';\\r\\n var rawlabel = '%';\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};SPO2=${info};TLEVEL=${trustLevel};LABEL=${rawlabel}`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n }\\r\\n break;\\r\\n //BLE Connected . For Flic button\\r\\n case '62':\\r\\n location_type = 'BLE';\\r\\n //var alarm = 'EBZI'; \\r\\n //var latitudeHex = '00';\\r\\n //var longitudeHex = '00';\\r\\n //var descr = 'empty';\\r\\n var flag = hexToDecimal(value.substring(0, 2)); // 0= Disconnected, 1= Connected\\r\\n var mac = value.substring(2, 14); // No hace falta darle la vuelta\\r\\n // add : format in MAC\\r\\n mac = mac.match(/.{1,2}/g).join(':');\\r\\n var batLevel = hexToDecimal(value.substring(14, 16)); // 0-100\\r\\n //location_time = timestamp;\\r\\n ble_data = `${flag},${batLevel},${mac}`;\\r\\n general += 'BLE location (State):' + flag + ', (bat):' + batLevel + ', (mac):' + mac + ',';\\r\\n break;\\r\\n }\\r\\n }\\r\\n if (alarmCode) {\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch;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 = (`Watch;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': // Ringer Volume\\r\\n var volume = hexToDecimal(value);\\r\\n imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;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 = (`Watch;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 '0F': // Enable control.... Used for STEP COUNTING SETTINGS\\r\\n // 'FF FF 21 80'\\r\\n var StepStatus = hex2bin(value.substring(4, 6));\\r\\n var enalbleDisable = '';\\r\\n if (StepStatus.substring(7, 8) == '1') {\\r\\n var step = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var step = 'Disable, '\\r\\n };\\r\\n //var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n //hrate += detectingInterval;\\r\\n AddValue(codeValues, \\\"step\\\", step);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadStepsSettings.EnableDisableReadStepsSettings, enalbleDisable);\\r\\n //AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadStepsSettings.EnableDisableReadStepsSettings);\\r\\n //configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\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 = (`Watch;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 '34': //ContactList with name\\r\\n var contactNumber = value.substring(1, 2);\\r\\n var telLength = hexToDecimal(value.substring(2, 4));\\r\\n var tel = '';\\r\\n switch (contactNumber) {\\r\\n // Emergency Number\\r\\n case '0':\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n break;\\r\\n // Speed Dial Number\\r\\n //case '1':\\r\\n // tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n // AddValue(codeValues, \\\"SpeedDialNumber\\\", tel);\\r\\n // AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.SpeedDialNumber, tel);\\r\\n // configsToAck.push(configIds.ReadSpeedDialSettings.SpeedDialNumber);\\r\\n // break;\\r\\n // Gateway Number\\r\\n case '9': //00447781482635,Esendex UK 0034627177148,Esendex Spain 00447507288240,Esendex UK Acceptance\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n if (tel.includes('447781482635') || tel.includes('00447781482635')) {\\r\\n tel = 'Esendex UK'\\r\\n } else if (tel.includes('34627177148') || tel.includes('0034627177148')) {\\r\\n tel = 'Esendex Spain'\\r\\n } else if (tel.includes('447507288240') || tel.includes('00447507288240')) {\\r\\n tel = 'Esendex UK Acceptance'\\r\\n } else {\\r\\n tel = 'Default'\\r\\n }\\r\\n AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n break;\\r\\n default:\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n if (tel.length < 6) {\\r\\n contacts += '';\\r\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n break;\\r\\n }\\r\\n //contacts += 'A' + (contactNumber - 1) + ': ' + tel + ', ';\\r\\n contacts += tel + ', ';\\r\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n break;\\r\\n }\\r\\n break;\\r\\n case '40': // APN\\r\\n //no ACK need\\r\\n AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'));\\r\\n configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\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 = (`Watch;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 = (`Watch;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 '46': //HeartRate\\r\\n // '10 0E 00 80'\\r\\n var HeartRateStatus = hex2bin(value.substring(6, 8));\\r\\n var enalbleDisable = '';\\r\\n if (HeartRateStatus.substring(0, 1) == '1') {\\r\\n var hrate = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var hrate = 'Disable, '\\r\\n };\\r\\n var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n hrate += detectingInterval;\\r\\n AddValue(codeValues, \\\"hrate\\\", hrate);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings);\\r\\n configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\r\\n break;\\r\\n case '47': // Custom Id\\r\\n imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;ACK-CUSTID;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"customeid\\\", value);\\r\\n AddValue(configsToUpdate, configIds.ReadState.CustomId, hex_to_ascii(value)); //now it comes \\\"3036\\\"\\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 // commented until Eview fixes this function\\r\\n /*\\r\\n messageForReceiver = (`Watch;ACK-NOMOTION;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"nomotion\\\", alertSetting);\\r\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings, enableDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n configsToAck.push(configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings);\\r\\n configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n */\\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 = (`Watch;ACK-FALLALERT;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n var sesibityOptionValue = hexToDecimal(value.substring(1, 2));\\r\\n sensibility += sesibityOptionValue;\\r\\n AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n //AddValue(configsToUpdate, configIds.ReadAlertSettings.FallSettings, sensibility);\\r\\n AddValue(configsToUpdate, configIds.ReadFallSettings.EnableDisableFallSettings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadFallSettings.Sensitivity, sesibityOptionValue);\\r\\n //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n configsToAck.push(configIds.ReadFallSettings.EnableDisableFallSettings);\\r\\n configsToAck.push(configIds.ReadFallSettings.Sensitivity);\\r\\n break;\\r\\n case '73': //BeaconList\\r\\n var beaconNumber = hexToDecimal(value.substring(1, 2));\\r\\n var beaconStatus = hex2bin(value.substring(0, 1));\\r\\n beaconStatus = hex_to_ascii(value.substring(30, value.length));\\r\\n //beaconStatus = changeEndianness(value.substring(30, value.length));\\r\\n //homeBeacon += 'B' + (beaconNumber + 1) + ': ' + beaconStatus + ', ';\\r\\n homeBeacon += beaconStatus + ', ';\\r\\n AddValue(codeValues, \\\"homeBeacon\\\", homeBeacon);\\r\\n messageForReceiver = (`Watch;ACK-GDATA;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n break;\\r\\n case '4A': //Wifi Network List\\r\\n var wifiSSIDLenght = hexToDecimal(value.substring(2, 4));\\r\\n var wifiPasswordLenght = hexToDecimal(value.substring(4, 6));\\r\\n var wifiIndex = hexToDecimal(value.substring(1, 2));\\r\\n //var wifiStatus = hexToDecimal(value.substring(0, 1));\\r\\n var wifiStatus = value.substring(0, 1);\\r\\n /*var enalbleDisable = wifiSSID = wifiPassword = homeWifi = '';\\r\\n /var homeWifi = '';\\r\\n if (wifiIndex == '0') { // Only first Wifi of the list\\r\\n if (wifiStatus == '8') {\\r\\n homeWifi += ' Enable, '\\r\\n enalbleDisable = '1';\\r\\n } else {\\r\\n homeWifi += ' Disable, '\\r\\n //enalbleDisable = '0';\\r\\n };*/\\r\\n if ((wifiStatus == '8') || (wifiStatus == 'C')) { // 8 == ON OR C== ON and Connected\\r\\n var wifiSSID = hex_to_ascii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\r\\n var wifiPassword = hex_to_ascii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\r\\n var imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;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 = (`Watch;ACK-SPEED;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"speed\\\", alertSetting);\\r\\n AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\r\\n configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n break;\\r\\n case '7A': //[Length]:05 [Key]:7A [Value]:60 54 00 80\\r\\n // {\\\"spo2Interval\\\":{\\\"interval\\\":21600,\\\"status\\\":1}}\\r\\n var SPOStatus = hex2bin(value.substring(6, 8));\\r\\n var enalbleDisable = '';\\r\\n if (SPOStatus.substring(0, 1) == '1') {\\r\\n var spo = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var spo = 'Disable, '\\r\\n };\\r\\n var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n spo += detectingInterval;\\r\\n AddValue(codeValues, \\\"SPO2\\\", spo);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadSPO2Settings.EnableDisableReadSPO2Settings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadSPO2Settings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadSPO2Settings.EnableDisableReadSPO2Settings);\\r\\n configsToAck.push(configIds.ReadSPO2Settings.ReportingFrequency);\\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 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 = (`Watch-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 = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch-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 if (typeof configIds !== 'undefined' && configIds && configIds.ConfigureDevice && configIds.ConfigureDevice.LastConfigured) { // when is defined\\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 }\\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(hex) { // Hex to Ascii \\r\\n if (hex.length % 2 !== 0) {\\r\\n throw new Error(\\\"Hex string length must be even\\\");\\r\\n }\\r\\n let ascii = '';\\r\\n for (let i = 0; i < hex.length; i += 2) {\\r\\n const byte = hex.substr(i, 2);\\r\\n const charCode = parseInt(byte, 16);\\r\\n if (charCode !== 0) { // remove null character (\\\\u0000)\\r\\n ascii += String.fromCharCode(charCode);\\r\\n }\\r\\n }\\r\\n return ascii;\\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 normalizeLabels(raw) { // output labels as array\\r\\n if (raw == null) return [];\\r\\n if (Array.isArray(raw)) return raw;\\r\\n // Si en algún momento vinieran varias labels separadas por coma o ;\\r\\n return String(raw).split(/[;,]/).map(s => s.trim()).filter(Boolean);\\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":1765483605},{"Type":1,"NewValue":"{\"Id\":437,\"Name\":\"Access TEC Care Watch\",\"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 // Watch protocol - please see variables and typical values in order below\\r\\n // Watch-CYC;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;SIGNAL=<>;WM=<>;GENERAL=<>\\r\\n // Watch-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\r\\n //\\r\\n // Author: Juanmi Navarro\\r\\n // Created: 01/01/0000\\r\\n // Last modified: 18/09/2025\\r\\n //\\r\\n ///////////////////////////////////////////////////////////////////////////////\\r\\n if (typeof localTesting === \\\"undefined\\\") {\\r\\n let localTesting = false;\\r\\n }\\r\\n const crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,\\r\\n 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,\\r\\n 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,\\r\\n 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,\\r\\n 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,\\r\\n 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,\\r\\n 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,\\r\\n 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,\\r\\n 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,\\r\\n 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,\\r\\n 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,\\r\\n 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,\\r\\n 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,\\r\\n 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,\\r\\n 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,\\r\\n 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,\\r\\n 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,\\r\\n 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,\\r\\n 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,\\r\\n 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,\\r\\n 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,\\r\\n 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n ];\\r\\n var codeValues = [];\\r\\n AddValue(codeValues, 'protocol_template', 'Watch');\\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 = (`Watch-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 var allowedCID = ['3036', '06'];\\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 } else if (oystaTemplate == 'True') { // Oysta Template \\r\\n AddValue(codeValues, 'rawMsg', raw);\\r\\n if ((params.rawlabel) && (params.rawlabel !== '')) { // decode label if exists\\r\\n //var labels = normalizeLabels(params.rawlabel); // \\\"steps\\\" -> [\\\"steps\\\"]\\r\\n //AddValue(codeValues, 'oysta_labels', params.rawlabel);\\r\\n AddValue(codeValues, 'oysta_labels', `[${params.rawlabel}]`);\\r\\n }\\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 //<>,<>,<> \\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];\\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 //<>,<>,<> \\r\\n if (mac2) {\\r\\n AddValue(codeValues, 'beacon_mac', mac2);\\r\\n var simpleQuery2 = [{\\r\\n 'code': 'Mac',\\r\\n 'value': mac2,\\r\\n }];\\r\\n var simpleQueryLabel2 = {\\r\\n 'table': 'beacons',\\r\\n 'select': 'Name',\\r\\n 'query': simpleQuery2\\r\\n };\\r\\n var labels2 = [];\\r\\n labels2.push(JSON.stringify(simpleQueryLabel2));\\r\\n AddValue(codeValues, 'oysta_labels', JSON.stringify(labels2));\\r\\n }\\r\\n if (params.beacon_major) {\\r\\n AddValue(codeValues, 'beacon_major', params.beacon_major);\\r\\n } else {\\r\\n AddValue(codeValues, 'beacon_major', 0);\\r\\n }\\r\\n if (params.beacon_minor) {\\r\\n AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\r\\n } else {\\r\\n AddValue(codeValues, 'beacon_minor', 0);\\r\\n }\\r\\n //AddValue(codeValues,'oysta_labels', label);\\r\\n //AddValue(codeValues,'oysta_value', mac);\\r\\n }\\r\\n /* meter mas tarde... \\r\\n if (params.smart_data !== 'undefined') {\\r\\n var gen_location = params.smart_data.split(',')\\r\\n var latitude = gen_location[0]\\r\\n var longitude = gen_location[1]\\r\\n var location_accuracy = gen_location[2]\\r\\n var altitude = gen_location[3]\\r\\n AddValue(codeValues,'latitude', latitude);\\r\\n AddValue(codeValues,'longitude', longitude);\\r\\n AddValue(codeValues,'altitude', altitude);\\r\\n AddValue(codeValues,'location_accuracy', location_accuracy);\\r\\n }\\r\\n */\\r\\n /*else if ((params.event_time) && (params.event_time == '')) {\\r\\n var event_time = moment.utc().unix();\\r\\n AddValue(codeValues,'event_time', event_time);\\r\\n } revisar mas adelante*/\\r\\n if (params.location_time) {\\r\\n AddValue(codeValues, 'location_time', params.location_time);\\r\\n }\\r\\n if (params.event_time) {\\r\\n AddValue(codeValues, 'event_time', params.event_time);\\r\\n }\\r\\n // to parse SMS info from the device\\r\\n switch (messageTypeLocalCode) {\\r\\n case 'COMM-SMS': // SMS message sent in\\r\\n if (params.data.startsWith('Device location request')) {\\r\\n configsToAck.push(configIds.Controls.RealTimeLocate);\\r\\n } else if (params.data.startsWith('Set IP ok')) {\\r\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n } else if (params.data.startsWith('IMEI:')) {\\r\\n configsToAck.push(configIds.Controls.GetFirmwareVersion);\\r\\n } else if (params.data.startsWith('Set IP ok')) {\\r\\n configsToAck.push(configIds.Controls.ClearBufferedMessages);\\r\\n } else if (params.data.startsWith('flush ok')) {\\r\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n } else if (params.data.startsWith('Set Watch-')) {\\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 = (`Watch-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 = (`Watch;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 = (`Watch;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 = (`Watch-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 // decode global msg\\r\\n function decoder(str) { // decode rawdata\\r\\n // CARE Decoder\\r\\n //AddValue(codeValues, 'Message : ', str);\\r\\n var message = str;\\r\\n var index = 18;\\r\\n //parse header & properties\\r\\n var properties = message.substring(2, 4);\\r\\n var lengthLittleEndian = message.substring(4, 8);\\r\\n var total_length = lengthLittleEndian.substring(2, 4) + lengthLittleEndian.substring(0, 2);\\r\\n total_length = 2 * hexToDecimal(total_length.substring(0, 4));\\r\\n var sequenceID = message.substring(12, 16);\\r\\n var command = message.substring(16, 18);\\r\\n //mask bitwise (properties should be '10')\\r\\n if ((parseInt(properties) & 8) == 8) {\\r\\n needsAck = true;\\r\\n } else needsAck = false;\\r\\n // need to check if checksum is correct for possible msg corruption 10/03/23\\r\\n var checksum = message.substring(8, 12);\\r\\n var messageBody = message.substring(16, message.length);\\r\\n debug('message =' + message);\\r\\n debug('checksum =' + checksum);\\r\\n debug('calculateCheckSum =' + calculateCheckSum(messageBody));\\r\\n if (calculateCheckSum(messageBody) == checksum) { // payload is valid\\r\\n debug(\\\"message has valid checksum\\\");\\r\\n var messageBody = command; // update value for the ACK\\r\\n debug('command =' + command);\\r\\n if (command == '01') {\\r\\n while (index < total_length + 16) {\\r\\n 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\\r\\n if ((alarmCodeExtInt & 1) == 1) {\\r\\n var alarm = 'ALF-C';\\r\\n }\\r\\n // Welfare Check-out\\r\\n else if ((alarmCodeExtInt & 2) == 2) {\\r\\n var alarm = 'ALA-C';\\r\\n }\\r\\n // Standard Alerts\\r\\n //Battery low\\r\\n else if ((alarmCodeInt & 1) == 1) {\\r\\n var alarm = 'BATL';\\r\\n }\\r\\n //Overspeed\\r\\n else if ((alarmCodeInt & 2) == 2) {\\r\\n var alarm = 'ALSP';\\r\\n }\\r\\n //Fall\\r\\n else if ((alarmCodeInt & 4) == 4) {\\r\\n var alarm = 'ALF';\\r\\n }\\r\\n //Tilt\\r\\n else if ((alarmCodeInt & 8) == 8) {\\r\\n var alarm = 'TLT';\\r\\n } else if ((alarmCodeInt & 16) == 16) {\\r\\n if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n var alarm = 'Geo1-IN';\\r\\n } else {\\r\\n var alarm = 'Geo1-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 32) == 32) {\\r\\n if ((alarmCodeInt & 33554432) == 33554432) {\\r\\n var alarm = 'Geo2-IN';\\r\\n } else {\\r\\n var alarm = 'Geo2-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 64) == 64) {\\r\\n if ((alarmCodeInt & 67108864) == 67108864) {\\r\\n var alarm = 'Geo3-IN';\\r\\n } else {\\r\\n var alarm = 'Geo3-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 128) == 128) {\\r\\n if ((alarmCodeInt & 134217728) == 134217728) {\\r\\n var alarm = 'Geo4-IN';\\r\\n } else {\\r\\n var alarm = 'Geo4-OUT';\\r\\n }\\r\\n }\\r\\n //Power Off\\r\\n else if ((alarmCodeInt & 256) == 256) {\\r\\n var alarm = 'PWRF';\\r\\n }\\r\\n //Power On\\r\\n else if ((alarmCodeInt & 512) == 512) {\\r\\n var alarm = 'PWRN';\\r\\n }\\r\\n //Motion\\r\\n else if ((alarmCodeInt & 1024) == 1024) {\\r\\n var alarm = 'ALMOV';\\r\\n }\\r\\n //No Motion\\r\\n else if ((alarmCodeInt & 2048) == 2048) {\\r\\n var alarm = 'ALNM';\\r\\n }\\r\\n //SOS\\r\\n else if ((alarmCodeInt & 4096) == 4096) {\\r\\n var alarm = 'ALSOS';\\r\\n } else if ((alarmCodeInt & 8192) == 8192) {\\r\\n var alarm = 'Side1';\\r\\n } else if ((alarmCodeInt & 16384) == 16384) {\\r\\n var alarm = 'Side2';\\r\\n }\\r\\n //Battery charging\\r\\n else if ((alarmCodeInt & 32768) == 32768) {\\r\\n var alarm = 'BATCN';\\r\\n }\\r\\n //Battery no charging\\r\\n else if ((alarmCodeInt & 65536) == 65536) {\\r\\n var alarm = 'BATCF';\\r\\n }\\r\\n //SOS Ending\\r\\n // Temporary Commented until we know exactly how it works. 22/09/2022\\r\\n else if ((alarmCodeInt & 131072) == 131072) {\\r\\n var alarm = 'ALA-F';\\r\\n info = 'Alarm Finished';\\r\\n }\\r\\n //Amber Alert EC03 only\\r\\n else if ((alarmCodeInt & 262144) == 262144) {\\r\\n var alarm = 'ALA';\\r\\n }\\r\\n // welfare Alert check-in ALA-O\\r\\n else if ((alarmCodeInt & 524288) == 524288) {\\r\\n var alarm = 'ALA-O';\\r\\n }\\r\\n // Amber alert Ending ALA-C\\r\\n else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n var alarm = 'ALA-C';\\r\\n }\\r\\n // Amber alert Ending ALA-C\\r\\n //else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n // var alarm = 'ALA-C';\\r\\n //}\\r\\n // Fall-Down Alert ending\\r\\n else if ((alarmCodeInt & 2097152) == 2097152) {\\r\\n var alarm = 'ALF-C';\\r\\n }\\r\\n // welfare Alert Ending ALA\\r\\n else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n var alarm = 'ALA';\\r\\n }\\r\\n // Beacon absent Alert 11/10/22. Need to be added in msg types\\r\\n //else if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n // var alarm = 'BEA';\\r\\n //}\\r\\n general += 'alarm:' + alarm + ',';\\r\\n break;\\r\\n //Custom ID\\r\\n case '03':\\r\\n customID = value;\\r\\n if (!allowedCID.includes(value)) {\\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 //<>,<>,<>,<>,<>\\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 if (!allowedCID.includes(customID)) {\\r\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n AddValue(codeValues, \\\"customID\\\", customID);\\r\\n return\\r\\n }\\r\\n if (statusDevice) {\\r\\n messageForReceiver = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n }\\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;\\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 }\\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 = 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 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 var rawlabel = 'steps';\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=${rawlabel}`);\\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 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 var rawlabel = 'bpm';\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=${rawlabel}`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n }\\r\\n break;\\r\\n // SPO2\\r\\n case '41':\\r\\n var numSPO = (keyLength - 2) / 12;\\r\\n for (let j = 0; j < numSPO; 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 SPOHex = value.substring(8, 10);\\r\\n var SPO = hexToDecimal(SPOHex);\\r\\n var trustLevelHex = value.substring(10, 12);\\r\\n var trustLevel = hexToDecimal(trustLevelHex);\\r\\n info = SPO;\\r\\n //var alarmCode = 'True';\\r\\n var alarm = 'SPO2';\\r\\n general += ' SPO2 rate' + j + ':' + SPO + ',';\\r\\n var rawlabel = '%';\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};SPO2=${info};TLEVEL=${trustLevel};LABEL=${rawlabel}`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n }\\r\\n break;\\r\\n //BLE Connected . For Flic button\\r\\n case '62':\\r\\n location_type = 'BLE';\\r\\n //var alarm = 'EBZI'; \\r\\n //var latitudeHex = '00';\\r\\n //var longitudeHex = '00';\\r\\n //var descr = 'empty';\\r\\n var flag = hexToDecimal(value.substring(0, 2)); // 0= Disconnected, 1= Connected\\r\\n var mac = value.substring(2, 14); // No hace falta darle la vuelta\\r\\n // add : format in MAC\\r\\n mac = mac.match(/.{1,2}/g).join(':');\\r\\n var batLevel = hexToDecimal(value.substring(14, 16)); // 0-100\\r\\n //location_time = timestamp;\\r\\n ble_data = `${flag},${batLevel},${mac}`;\\r\\n general += 'BLE location (State):' + flag + ', (bat):' + batLevel + ', (mac):' + mac + ',';\\r\\n break;\\r\\n }\\r\\n }\\r\\n if (alarmCode) {\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch;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 = (`Watch;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': // Ringer Volume\\r\\n var volume = hexToDecimal(value);\\r\\n imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;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 = (`Watch;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 '0F': // Enable control.... Used for STEP COUNTING SETTINGS\\r\\n // 'FF FF 21 80'\\r\\n var StepStatus = hex2bin(value.substring(4, 6));\\r\\n var enalbleDisable = '';\\r\\n if (StepStatus.substring(7, 8) == '1') {\\r\\n var step = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var step = 'Disable, '\\r\\n };\\r\\n //var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n //hrate += detectingInterval;\\r\\n AddValue(codeValues, \\\"step\\\", step);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadStepsSettings.EnableDisableReadStepsSettings, enalbleDisable);\\r\\n //AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadStepsSettings.EnableDisableReadStepsSettings);\\r\\n //configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\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 = (`Watch;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 '34': //ContactList with name\\r\\n var contactNumber = value.substring(1, 2);\\r\\n var telLength = hexToDecimal(value.substring(2, 4));\\r\\n var tel = '';\\r\\n switch (contactNumber) {\\r\\n // Emergency Number\\r\\n case '0':\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n break;\\r\\n // Speed Dial Number\\r\\n //case '1':\\r\\n // tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n // AddValue(codeValues, \\\"SpeedDialNumber\\\", tel);\\r\\n // AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.SpeedDialNumber, tel);\\r\\n // configsToAck.push(configIds.ReadSpeedDialSettings.SpeedDialNumber);\\r\\n // break;\\r\\n // Gateway Number\\r\\n case '9': //00447781482635,Esendex UK 0034627177148,Esendex Spain 00447507288240,Esendex UK Acceptance\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n if (tel.includes('447781482635') || tel.includes('00447781482635')) {\\r\\n tel = 'Esendex UK'\\r\\n } else if (tel.includes('34627177148') || tel.includes('0034627177148')) {\\r\\n tel = 'Esendex Spain'\\r\\n } else if (tel.includes('447507288240') || tel.includes('00447507288240')) {\\r\\n tel = 'Esendex UK Acceptance'\\r\\n } else {\\r\\n tel = 'Default'\\r\\n }\\r\\n AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n break;\\r\\n default:\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n if (tel.length < 6) {\\r\\n contacts += '';\\r\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n break;\\r\\n }\\r\\n //contacts += 'A' + (contactNumber - 1) + ': ' + tel + ', ';\\r\\n contacts += tel + ', ';\\r\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n break;\\r\\n }\\r\\n break;\\r\\n case '40': // APN\\r\\n //no ACK need\\r\\n AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'));\\r\\n configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\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 = (`Watch;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 = (`Watch;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 '46': //HeartRate\\r\\n // '10 0E 00 80'\\r\\n var HeartRateStatus = hex2bin(value.substring(6, 8));\\r\\n var enalbleDisable = '';\\r\\n if (HeartRateStatus.substring(0, 1) == '1') {\\r\\n var hrate = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var hrate = 'Disable, '\\r\\n };\\r\\n var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n hrate += detectingInterval;\\r\\n AddValue(codeValues, \\\"hrate\\\", hrate);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings);\\r\\n configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\r\\n break;\\r\\n case '47': // Custom Id\\r\\n imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;ACK-CUSTID;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"customeid\\\", value);\\r\\n AddValue(configsToUpdate, configIds.ReadState.CustomId, hex_to_ascii(value)); //now it comes \\\"3036\\\"\\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 // commented until Eview fixes this function\\r\\n /*\\r\\n messageForReceiver = (`Watch;ACK-NOMOTION;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"nomotion\\\", alertSetting);\\r\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings, enableDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n configsToAck.push(configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings);\\r\\n configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n */\\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 = (`Watch;ACK-FALLALERT;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n var sesibityOptionValue = hexToDecimal(value.substring(1, 2));\\r\\n sensibility += sesibityOptionValue;\\r\\n AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n //AddValue(configsToUpdate, configIds.ReadAlertSettings.FallSettings, sensibility);\\r\\n AddValue(configsToUpdate, configIds.ReadFallSettings.EnableDisableFallSettings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadFallSettings.Sensitivity, sesibityOptionValue);\\r\\n //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n configsToAck.push(configIds.ReadFallSettings.EnableDisableFallSettings);\\r\\n configsToAck.push(configIds.ReadFallSettings.Sensitivity);\\r\\n break;\\r\\n case '73': //BeaconList\\r\\n var beaconNumber = hexToDecimal(value.substring(1, 2));\\r\\n var beaconStatus = hex2bin(value.substring(0, 1));\\r\\n beaconStatus = hex_to_ascii(value.substring(30, value.length));\\r\\n //beaconStatus = changeEndianness(value.substring(30, value.length));\\r\\n //homeBeacon += 'B' + (beaconNumber + 1) + ': ' + beaconStatus + ', ';\\r\\n homeBeacon += beaconStatus + ', ';\\r\\n AddValue(codeValues, \\\"homeBeacon\\\", homeBeacon);\\r\\n messageForReceiver = (`Watch;ACK-GDATA;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n break;\\r\\n case '4A': //Wifi Network List\\r\\n var wifiSSIDLenght = hexToDecimal(value.substring(2, 4));\\r\\n var wifiPasswordLenght = hexToDecimal(value.substring(4, 6));\\r\\n var wifiIndex = hexToDecimal(value.substring(1, 2));\\r\\n //var wifiStatus = hexToDecimal(value.substring(0, 1));\\r\\n var wifiStatus = value.substring(0, 1);\\r\\n /*var enalbleDisable = wifiSSID = wifiPassword = homeWifi = '';\\r\\n /var homeWifi = '';\\r\\n if (wifiIndex == '0') { // Only first Wifi of the list\\r\\n if (wifiStatus == '8') {\\r\\n homeWifi += ' Enable, '\\r\\n enalbleDisable = '1';\\r\\n } else {\\r\\n homeWifi += ' Disable, '\\r\\n //enalbleDisable = '0';\\r\\n };*/\\r\\n if ((wifiStatus == '8') || (wifiStatus == 'C')) { // 8 == ON OR C== ON and Connected\\r\\n var wifiSSID = hex_to_ascii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\r\\n var wifiPassword = hex_to_ascii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\r\\n var imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;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 = (`Watch;ACK-SPEED;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"speed\\\", alertSetting);\\r\\n AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\r\\n configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n break;\\r\\n case '7A': //[Length]:05 [Key]:7A [Value]:60 54 00 80\\r\\n // {\\\"spo2Interval\\\":{\\\"interval\\\":21600,\\\"status\\\":1}}\\r\\n var SPOStatus = hex2bin(value.substring(6, 8));\\r\\n var enalbleDisable = '';\\r\\n if (SPOStatus.substring(0, 1) == '1') {\\r\\n var spo = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var spo = 'Disable, '\\r\\n };\\r\\n var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n spo += detectingInterval;\\r\\n AddValue(codeValues, \\\"SPO2\\\", spo);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadSPO2Settings.EnableDisableReadSPO2Settings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadSPO2Settings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadSPO2Settings.EnableDisableReadSPO2Settings);\\r\\n configsToAck.push(configIds.ReadSPO2Settings.ReportingFrequency);\\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 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 = (`Watch-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 = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch-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 if (typeof configIds !== 'undefined' && configIds && configIds.ConfigureDevice && configIds.ConfigureDevice.LastConfigured) { // when is defined\\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 }\\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(hex) { // Hex to Ascii \\r\\n if (hex.length % 2 !== 0) {\\r\\n throw new Error(\\\"Hex string length must be even\\\");\\r\\n }\\r\\n let ascii = '';\\r\\n for (let i = 0; i < hex.length; i += 2) {\\r\\n const byte = hex.substr(i, 2);\\r\\n const charCode = parseInt(byte, 16);\\r\\n if (charCode !== 0) { // remove null character (\\\\u0000)\\r\\n ascii += String.fromCharCode(charCode);\\r\\n }\\r\\n }\\r\\n return ascii;\\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 normalizeLabels(raw) { // output labels as array\\r\\n if (raw == null) return [];\\r\\n if (Array.isArray(raw)) return raw;\\r\\n // Si en algún momento vinieran varias labels separadas por coma o ;\\r\\n return String(raw).split(/[;,]/).map(s => s.trim()).filter(Boolean);\\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":1765483826},{"Type":1,"NewValue":"{\"Id\":437,\"Name\":\"Access TEC Care Watch\",\"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 // Watch protocol - please see variables and typical values in order below\\r\\n // Watch-CYC;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;SIGNAL=<>;WM=<>;GENERAL=<>\\r\\n // Watch-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\r\\n //\\r\\n // Author: Juanmi Navarro\\r\\n // Created: 01/01/0000\\r\\n // Last modified: 18/09/2025\\r\\n //\\r\\n ///////////////////////////////////////////////////////////////////////////////\\r\\n if (typeof localTesting === \\\"undefined\\\") {\\r\\n let localTesting = false;\\r\\n }\\r\\n const crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,\\r\\n 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,\\r\\n 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,\\r\\n 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,\\r\\n 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,\\r\\n 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,\\r\\n 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,\\r\\n 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,\\r\\n 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,\\r\\n 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,\\r\\n 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,\\r\\n 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,\\r\\n 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,\\r\\n 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,\\r\\n 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,\\r\\n 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,\\r\\n 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,\\r\\n 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,\\r\\n 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,\\r\\n 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,\\r\\n 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,\\r\\n 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n ];\\r\\n var codeValues = [];\\r\\n AddValue(codeValues, 'protocol_template', 'Watch');\\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 = (`Watch-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 var allowedCID = ['3036', '06'];\\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 } else if (oystaTemplate == 'True') { // Oysta Template \\r\\n AddValue(codeValues, 'rawMsg', raw);\\r\\n if ((params.rawlabel) && (params.rawlabel !== '')) { // decode label if exists\\r\\n var labels = normalizeLabels(params.rawlabel); // \\\"steps\\\" -> [\\\"steps\\\"]\\r\\n AddValue(codeValues, 'oysta_labels', labels);\\r\\n //AddValue(codeValues, 'oysta_labels', `[${params.rawlabel}]`);\\r\\n }\\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 //<>,<>,<> \\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];\\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 //<>,<>,<> \\r\\n if (mac2) {\\r\\n AddValue(codeValues, 'beacon_mac', mac2);\\r\\n var simpleQuery2 = [{\\r\\n 'code': 'Mac',\\r\\n 'value': mac2,\\r\\n }];\\r\\n var simpleQueryLabel2 = {\\r\\n 'table': 'beacons',\\r\\n 'select': 'Name',\\r\\n 'query': simpleQuery2\\r\\n };\\r\\n var labels2 = [];\\r\\n labels2.push(JSON.stringify(simpleQueryLabel2));\\r\\n AddValue(codeValues, 'oysta_labels', JSON.stringify(labels2));\\r\\n }\\r\\n if (params.beacon_major) {\\r\\n AddValue(codeValues, 'beacon_major', params.beacon_major);\\r\\n } else {\\r\\n AddValue(codeValues, 'beacon_major', 0);\\r\\n }\\r\\n if (params.beacon_minor) {\\r\\n AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\r\\n } else {\\r\\n AddValue(codeValues, 'beacon_minor', 0);\\r\\n }\\r\\n //AddValue(codeValues,'oysta_labels', label);\\r\\n //AddValue(codeValues,'oysta_value', mac);\\r\\n }\\r\\n /* meter mas tarde... \\r\\n if (params.smart_data !== 'undefined') {\\r\\n var gen_location = params.smart_data.split(',')\\r\\n var latitude = gen_location[0]\\r\\n var longitude = gen_location[1]\\r\\n var location_accuracy = gen_location[2]\\r\\n var altitude = gen_location[3]\\r\\n AddValue(codeValues,'latitude', latitude);\\r\\n AddValue(codeValues,'longitude', longitude);\\r\\n AddValue(codeValues,'altitude', altitude);\\r\\n AddValue(codeValues,'location_accuracy', location_accuracy);\\r\\n }\\r\\n */\\r\\n /*else if ((params.event_time) && (params.event_time == '')) {\\r\\n var event_time = moment.utc().unix();\\r\\n AddValue(codeValues,'event_time', event_time);\\r\\n } revisar mas adelante*/\\r\\n if (params.location_time) {\\r\\n AddValue(codeValues, 'location_time', params.location_time);\\r\\n }\\r\\n if (params.event_time) {\\r\\n AddValue(codeValues, 'event_time', params.event_time);\\r\\n }\\r\\n // to parse SMS info from the device\\r\\n switch (messageTypeLocalCode) {\\r\\n case 'COMM-SMS': // SMS message sent in\\r\\n if (params.data.startsWith('Device location request')) {\\r\\n configsToAck.push(configIds.Controls.RealTimeLocate);\\r\\n } else if (params.data.startsWith('Set IP ok')) {\\r\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n } else if (params.data.startsWith('IMEI:')) {\\r\\n configsToAck.push(configIds.Controls.GetFirmwareVersion);\\r\\n } else if (params.data.startsWith('Set IP ok')) {\\r\\n configsToAck.push(configIds.Controls.ClearBufferedMessages);\\r\\n } else if (params.data.startsWith('flush ok')) {\\r\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n } else if (params.data.startsWith('Set Watch-')) {\\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 = (`Watch-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 = (`Watch;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 = (`Watch;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 = (`Watch-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 // return the object that contains your data\\r\\n return dataToReceiver;\\r\\n // end of main operation\\r\\n // define functions used in operation\\r\\n // decode global msg\\r\\n function decoder(str) { // decode rawdata\\r\\n // CARE Decoder\\r\\n //AddValue(codeValues, 'Message : ', str);\\r\\n var message = str;\\r\\n var index = 18;\\r\\n //parse header & properties\\r\\n var properties = message.substring(2, 4);\\r\\n var lengthLittleEndian = message.substring(4, 8);\\r\\n var total_length = lengthLittleEndian.substring(2, 4) + lengthLittleEndian.substring(0, 2);\\r\\n total_length = 2 * hexToDecimal(total_length.substring(0, 4));\\r\\n var sequenceID = message.substring(12, 16);\\r\\n var command = message.substring(16, 18);\\r\\n //mask bitwise (properties should be '10')\\r\\n if ((parseInt(properties) & 8) == 8) {\\r\\n needsAck = true;\\r\\n } else needsAck = false;\\r\\n // need to check if checksum is correct for possible msg corruption 10/03/23\\r\\n var checksum = message.substring(8, 12);\\r\\n var messageBody = message.substring(16, message.length);\\r\\n debug('message =' + message);\\r\\n debug('checksum =' + checksum);\\r\\n debug('calculateCheckSum =' + calculateCheckSum(messageBody));\\r\\n if (calculateCheckSum(messageBody) == checksum) { // payload is valid\\r\\n debug(\\\"message has valid checksum\\\");\\r\\n var messageBody = command; // update value for the ACK\\r\\n debug('command =' + command);\\r\\n if (command == '01') {\\r\\n while (index < total_length + 16) {\\r\\n 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\\r\\n if ((alarmCodeExtInt & 1) == 1) {\\r\\n var alarm = 'ALF-C';\\r\\n }\\r\\n // Welfare Check-out\\r\\n else if ((alarmCodeExtInt & 2) == 2) {\\r\\n var alarm = 'ALA-C';\\r\\n }\\r\\n // Standard Alerts\\r\\n //Battery low\\r\\n else if ((alarmCodeInt & 1) == 1) {\\r\\n var alarm = 'BATL';\\r\\n }\\r\\n //Overspeed\\r\\n else if ((alarmCodeInt & 2) == 2) {\\r\\n var alarm = 'ALSP';\\r\\n }\\r\\n //Fall\\r\\n else if ((alarmCodeInt & 4) == 4) {\\r\\n var alarm = 'ALF';\\r\\n }\\r\\n //Tilt\\r\\n else if ((alarmCodeInt & 8) == 8) {\\r\\n var alarm = 'TLT';\\r\\n } else if ((alarmCodeInt & 16) == 16) {\\r\\n if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n var alarm = 'Geo1-IN';\\r\\n } else {\\r\\n var alarm = 'Geo1-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 32) == 32) {\\r\\n if ((alarmCodeInt & 33554432) == 33554432) {\\r\\n var alarm = 'Geo2-IN';\\r\\n } else {\\r\\n var alarm = 'Geo2-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 64) == 64) {\\r\\n if ((alarmCodeInt & 67108864) == 67108864) {\\r\\n var alarm = 'Geo3-IN';\\r\\n } else {\\r\\n var alarm = 'Geo3-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 128) == 128) {\\r\\n if ((alarmCodeInt & 134217728) == 134217728) {\\r\\n var alarm = 'Geo4-IN';\\r\\n } else {\\r\\n var alarm = 'Geo4-OUT';\\r\\n }\\r\\n }\\r\\n //Power Off\\r\\n else if ((alarmCodeInt & 256) == 256) {\\r\\n var alarm = 'PWRF';\\r\\n }\\r\\n //Power On\\r\\n else if ((alarmCodeInt & 512) == 512) {\\r\\n var alarm = 'PWRN';\\r\\n }\\r\\n //Motion\\r\\n else if ((alarmCodeInt & 1024) == 1024) {\\r\\n var alarm = 'ALMOV';\\r\\n }\\r\\n //No Motion\\r\\n else if ((alarmCodeInt & 2048) == 2048) {\\r\\n var alarm = 'ALNM';\\r\\n }\\r\\n //SOS\\r\\n else if ((alarmCodeInt & 4096) == 4096) {\\r\\n var alarm = 'ALSOS';\\r\\n } else if ((alarmCodeInt & 8192) == 8192) {\\r\\n var alarm = 'Side1';\\r\\n } else if ((alarmCodeInt & 16384) == 16384) {\\r\\n var alarm = 'Side2';\\r\\n }\\r\\n //Battery charging\\r\\n else if ((alarmCodeInt & 32768) == 32768) {\\r\\n var alarm = 'BATCN';\\r\\n }\\r\\n //Battery no charging\\r\\n else if ((alarmCodeInt & 65536) == 65536) {\\r\\n var alarm = 'BATCF';\\r\\n }\\r\\n //SOS Ending\\r\\n // Temporary Commented until we know exactly how it works. 22/09/2022\\r\\n else if ((alarmCodeInt & 131072) == 131072) {\\r\\n var alarm = 'ALA-F';\\r\\n info = 'Alarm Finished';\\r\\n }\\r\\n //Amber Alert EC03 only\\r\\n else if ((alarmCodeInt & 262144) == 262144) {\\r\\n var alarm = 'ALA';\\r\\n }\\r\\n // welfare Alert check-in ALA-O\\r\\n else if ((alarmCodeInt & 524288) == 524288) {\\r\\n var alarm = 'ALA-O';\\r\\n }\\r\\n // Amber alert Ending ALA-C\\r\\n else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n var alarm = 'ALA-C';\\r\\n }\\r\\n // Amber alert Ending ALA-C\\r\\n //else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n // var alarm = 'ALA-C';\\r\\n //}\\r\\n // Fall-Down Alert ending\\r\\n else if ((alarmCodeInt & 2097152) == 2097152) {\\r\\n var alarm = 'ALF-C';\\r\\n }\\r\\n // welfare Alert Ending ALA\\r\\n else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n var alarm = 'ALA';\\r\\n }\\r\\n // Beacon absent Alert 11/10/22. Need to be added in msg types\\r\\n //else if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n // var alarm = 'BEA';\\r\\n //}\\r\\n general += 'alarm:' + alarm + ',';\\r\\n break;\\r\\n //Custom ID\\r\\n case '03':\\r\\n customID = value;\\r\\n if (!allowedCID.includes(value)) {\\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 //<>,<>,<>,<>,<>\\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 if (!allowedCID.includes(customID)) {\\r\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n AddValue(codeValues, \\\"customID\\\", customID);\\r\\n return\\r\\n }\\r\\n if (statusDevice) {\\r\\n messageForReceiver = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n }\\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;\\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 }\\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 = 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 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 var rawlabel = 'steps';\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=${rawlabel}`);\\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 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 var rawlabel = 'bpm';\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=${rawlabel}`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n }\\r\\n break;\\r\\n // SPO2\\r\\n case '41':\\r\\n var numSPO = (keyLength - 2) / 12;\\r\\n for (let j = 0; j < numSPO; 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 SPOHex = value.substring(8, 10);\\r\\n var SPO = hexToDecimal(SPOHex);\\r\\n var trustLevelHex = value.substring(10, 12);\\r\\n var trustLevel = hexToDecimal(trustLevelHex);\\r\\n info = SPO;\\r\\n //var alarmCode = 'True';\\r\\n var alarm = 'SPO2';\\r\\n general += ' SPO2 rate' + j + ':' + SPO + ',';\\r\\n var rawlabel = '%';\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};SPO2=${info};TLEVEL=${trustLevel};LABEL=${rawlabel}`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n }\\r\\n break;\\r\\n //BLE Connected . For Flic button\\r\\n case '62':\\r\\n location_type = 'BLE';\\r\\n //var alarm = 'EBZI'; \\r\\n //var latitudeHex = '00';\\r\\n //var longitudeHex = '00';\\r\\n //var descr = 'empty';\\r\\n var flag = hexToDecimal(value.substring(0, 2)); // 0= Disconnected, 1= Connected\\r\\n var mac = value.substring(2, 14); // No hace falta darle la vuelta\\r\\n // add : format in MAC\\r\\n mac = mac.match(/.{1,2}/g).join(':');\\r\\n var batLevel = hexToDecimal(value.substring(14, 16)); // 0-100\\r\\n //location_time = timestamp;\\r\\n ble_data = `${flag},${batLevel},${mac}`;\\r\\n general += 'BLE location (State):' + flag + ', (bat):' + batLevel + ', (mac):' + mac + ',';\\r\\n break;\\r\\n }\\r\\n }\\r\\n if (alarmCode) {\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch;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 = (`Watch;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': // Ringer Volume\\r\\n var volume = hexToDecimal(value);\\r\\n imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;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 = (`Watch;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 '0F': // Enable control.... Used for STEP COUNTING SETTINGS\\r\\n // 'FF FF 21 80'\\r\\n var StepStatus = hex2bin(value.substring(4, 6));\\r\\n var enalbleDisable = '';\\r\\n if (StepStatus.substring(7, 8) == '1') {\\r\\n var step = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var step = 'Disable, '\\r\\n };\\r\\n //var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n //hrate += detectingInterval;\\r\\n AddValue(codeValues, \\\"step\\\", step);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadStepsSettings.EnableDisableReadStepsSettings, enalbleDisable);\\r\\n //AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadStepsSettings.EnableDisableReadStepsSettings);\\r\\n //configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\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 = (`Watch;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 '34': //ContactList with name\\r\\n var contactNumber = value.substring(1, 2);\\r\\n var telLength = hexToDecimal(value.substring(2, 4));\\r\\n var tel = '';\\r\\n switch (contactNumber) {\\r\\n // Emergency Number\\r\\n case '0':\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n break;\\r\\n // Speed Dial Number\\r\\n //case '1':\\r\\n // tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n // AddValue(codeValues, \\\"SpeedDialNumber\\\", tel);\\r\\n // AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.SpeedDialNumber, tel);\\r\\n // configsToAck.push(configIds.ReadSpeedDialSettings.SpeedDialNumber);\\r\\n // break;\\r\\n // Gateway Number\\r\\n case '9': //00447781482635,Esendex UK 0034627177148,Esendex Spain 00447507288240,Esendex UK Acceptance\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n if (tel.includes('447781482635') || tel.includes('00447781482635')) {\\r\\n tel = 'Esendex UK'\\r\\n } else if (tel.includes('34627177148') || tel.includes('0034627177148')) {\\r\\n tel = 'Esendex Spain'\\r\\n } else if (tel.includes('447507288240') || tel.includes('00447507288240')) {\\r\\n tel = 'Esendex UK Acceptance'\\r\\n } else {\\r\\n tel = 'Default'\\r\\n }\\r\\n AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n break;\\r\\n default:\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n if (tel.length < 6) {\\r\\n contacts += '';\\r\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n break;\\r\\n }\\r\\n //contacts += 'A' + (contactNumber - 1) + ': ' + tel + ', ';\\r\\n contacts += tel + ', ';\\r\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n break;\\r\\n }\\r\\n break;\\r\\n case '40': // APN\\r\\n //no ACK need\\r\\n AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'));\\r\\n configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\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 = (`Watch;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 = (`Watch;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 '46': //HeartRate\\r\\n // '10 0E 00 80'\\r\\n var HeartRateStatus = hex2bin(value.substring(6, 8));\\r\\n var enalbleDisable = '';\\r\\n if (HeartRateStatus.substring(0, 1) == '1') {\\r\\n var hrate = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var hrate = 'Disable, '\\r\\n };\\r\\n var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n hrate += detectingInterval;\\r\\n AddValue(codeValues, \\\"hrate\\\", hrate);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings);\\r\\n configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\r\\n break;\\r\\n case '47': // Custom Id\\r\\n imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;ACK-CUSTID;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"customeid\\\", value);\\r\\n AddValue(configsToUpdate, configIds.ReadState.CustomId, hex_to_ascii(value)); //now it comes \\\"3036\\\"\\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 // commented until Eview fixes this function\\r\\n /*\\r\\n messageForReceiver = (`Watch;ACK-NOMOTION;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"nomotion\\\", alertSetting);\\r\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings, enableDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n configsToAck.push(configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings);\\r\\n configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n */\\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 = (`Watch;ACK-FALLALERT;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n var sesibityOptionValue = hexToDecimal(value.substring(1, 2));\\r\\n sensibility += sesibityOptionValue;\\r\\n AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n //AddValue(configsToUpdate, configIds.ReadAlertSettings.FallSettings, sensibility);\\r\\n AddValue(configsToUpdate, configIds.ReadFallSettings.EnableDisableFallSettings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadFallSettings.Sensitivity, sesibityOptionValue);\\r\\n //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n configsToAck.push(configIds.ReadFallSettings.EnableDisableFallSettings);\\r\\n configsToAck.push(configIds.ReadFallSettings.Sensitivity);\\r\\n break;\\r\\n case '73': //BeaconList\\r\\n var beaconNumber = hexToDecimal(value.substring(1, 2));\\r\\n var beaconStatus = hex2bin(value.substring(0, 1));\\r\\n beaconStatus = hex_to_ascii(value.substring(30, value.length));\\r\\n //beaconStatus = changeEndianness(value.substring(30, value.length));\\r\\n //homeBeacon += 'B' + (beaconNumber + 1) + ': ' + beaconStatus + ', ';\\r\\n homeBeacon += beaconStatus + ', ';\\r\\n AddValue(codeValues, \\\"homeBeacon\\\", homeBeacon);\\r\\n messageForReceiver = (`Watch;ACK-GDATA;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n break;\\r\\n case '4A': //Wifi Network List\\r\\n var wifiSSIDLenght = hexToDecimal(value.substring(2, 4));\\r\\n var wifiPasswordLenght = hexToDecimal(value.substring(4, 6));\\r\\n var wifiIndex = hexToDecimal(value.substring(1, 2));\\r\\n //var wifiStatus = hexToDecimal(value.substring(0, 1));\\r\\n var wifiStatus = value.substring(0, 1);\\r\\n /*var enalbleDisable = wifiSSID = wifiPassword = homeWifi = '';\\r\\n /var homeWifi = '';\\r\\n if (wifiIndex == '0') { // Only first Wifi of the list\\r\\n if (wifiStatus == '8') {\\r\\n homeWifi += ' Enable, '\\r\\n enalbleDisable = '1';\\r\\n } else {\\r\\n homeWifi += ' Disable, '\\r\\n //enalbleDisable = '0';\\r\\n };*/\\r\\n if ((wifiStatus == '8') || (wifiStatus == 'C')) { // 8 == ON OR C== ON and Connected\\r\\n var wifiSSID = hex_to_ascii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\r\\n var wifiPassword = hex_to_ascii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\r\\n var imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;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 = (`Watch;ACK-SPEED;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"speed\\\", alertSetting);\\r\\n AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\r\\n configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n break;\\r\\n case '7A': //[Length]:05 [Key]:7A [Value]:60 54 00 80\\r\\n // {\\\"spo2Interval\\\":{\\\"interval\\\":21600,\\\"status\\\":1}}\\r\\n var SPOStatus = hex2bin(value.substring(6, 8));\\r\\n var enalbleDisable = '';\\r\\n if (SPOStatus.substring(0, 1) == '1') {\\r\\n var spo = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var spo = 'Disable, '\\r\\n };\\r\\n var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n spo += detectingInterval;\\r\\n AddValue(codeValues, \\\"SPO2\\\", spo);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadSPO2Settings.EnableDisableReadSPO2Settings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadSPO2Settings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadSPO2Settings.EnableDisableReadSPO2Settings);\\r\\n configsToAck.push(configIds.ReadSPO2Settings.ReportingFrequency);\\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 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 = (`Watch-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 = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch-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 if (typeof configIds !== 'undefined' && configIds && configIds.ConfigureDevice && configIds.ConfigureDevice.LastConfigured) { // when is defined\\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 }\\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(hex) { // Hex to Ascii \\r\\n if (hex.length % 2 !== 0) {\\r\\n throw new Error(\\\"Hex string length must be even\\\");\\r\\n }\\r\\n let ascii = '';\\r\\n for (let i = 0; i < hex.length; i += 2) {\\r\\n const byte = hex.substr(i, 2);\\r\\n const charCode = parseInt(byte, 16);\\r\\n if (charCode !== 0) { // remove null character (\\\\u0000)\\r\\n ascii += String.fromCharCode(charCode);\\r\\n }\\r\\n }\\r\\n return ascii;\\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 normalizeLabels(raw) { // output labels as array\\r\\n if (!raw) return [];\\r\\n return [String(raw)];\\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":1765485094},{"Type":1,"NewValue":"{\"Id\":437,\"Name\":\"Access TEC Care Watch\",\"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 // Watch protocol - please see variables and typical values in order below\\r\\n // Watch-CYC;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;SIGNAL=<>;WM=<>;GENERAL=<>\\r\\n // Watch-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\r\\n //\\r\\n // Author: Juanmi Navarro\\r\\n // Created: 01/01/0000\\r\\n // Last modified: 18/09/2025\\r\\n //\\r\\n ///////////////////////////////////////////////////////////////////////////////\\r\\n if (typeof localTesting === \\\"undefined\\\") {\\r\\n let localTesting = false;\\r\\n }\\r\\n const crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,\\r\\n 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,\\r\\n 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,\\r\\n 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,\\r\\n 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,\\r\\n 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,\\r\\n 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,\\r\\n 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,\\r\\n 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,\\r\\n 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,\\r\\n 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,\\r\\n 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,\\r\\n 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,\\r\\n 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,\\r\\n 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,\\r\\n 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,\\r\\n 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,\\r\\n 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,\\r\\n 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,\\r\\n 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,\\r\\n 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,\\r\\n 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n ];\\r\\n var codeValues = [];\\r\\n AddValue(codeValues, 'protocol_template', 'Watch');\\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 = (`Watch-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 var allowedCID = ['3036', '06'];\\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 } else if (oystaTemplate == 'True') { // Oysta Template \\r\\n AddValue(codeValues, 'rawMsg', raw);\\r\\n if ((params.rawlabel) && (params.rawlabel !== '')) { // decode label if exists\\r\\n var labels = normalizeLabels(params.rawlabel); // \\\"steps\\\" -> [\\\"steps\\\"]\\r\\n AddValue(codeValues, 'oysta_labels', labels);\\r\\n //AddValue(codeValues, 'oysta_labels', `[${params.rawlabel}]`);\\r\\n }\\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 //<>,<>,<> \\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];\\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 //<>,<>,<> \\r\\n if (mac2) {\\r\\n AddValue(codeValues, 'beacon_mac', mac2);\\r\\n var simpleQuery2 = [{\\r\\n 'code': 'Mac',\\r\\n 'value': mac2,\\r\\n }];\\r\\n var simpleQueryLabel2 = {\\r\\n 'table': 'beacons',\\r\\n 'select': 'Name',\\r\\n 'query': simpleQuery2\\r\\n };\\r\\n var labels2 = [];\\r\\n labels2.push(JSON.stringify(simpleQueryLabel2));\\r\\n AddValue(codeValues, 'oysta_labels', JSON.stringify(labels2));\\r\\n }\\r\\n if (params.beacon_major) {\\r\\n AddValue(codeValues, 'beacon_major', params.beacon_major);\\r\\n } else {\\r\\n AddValue(codeValues, 'beacon_major', 0);\\r\\n }\\r\\n if (params.beacon_minor) {\\r\\n AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\r\\n } else {\\r\\n AddValue(codeValues, 'beacon_minor', 0);\\r\\n }\\r\\n //AddValue(codeValues,'oysta_labels', label);\\r\\n //AddValue(codeValues,'oysta_value', mac);\\r\\n }\\r\\n /* meter mas tarde... \\r\\n if (params.smart_data !== 'undefined') {\\r\\n var gen_location = params.smart_data.split(',')\\r\\n var latitude = gen_location[0]\\r\\n var longitude = gen_location[1]\\r\\n var location_accuracy = gen_location[2]\\r\\n var altitude = gen_location[3]\\r\\n AddValue(codeValues,'latitude', latitude);\\r\\n AddValue(codeValues,'longitude', longitude);\\r\\n AddValue(codeValues,'altitude', altitude);\\r\\n AddValue(codeValues,'location_accuracy', location_accuracy);\\r\\n }\\r\\n */\\r\\n /*else if ((params.event_time) && (params.event_time == '')) {\\r\\n var event_time = moment.utc().unix();\\r\\n AddValue(codeValues,'event_time', event_time);\\r\\n } revisar mas adelante*/\\r\\n if (params.location_time) {\\r\\n AddValue(codeValues, 'location_time', params.location_time);\\r\\n }\\r\\n if (params.event_time) {\\r\\n AddValue(codeValues, 'event_time', params.event_time);\\r\\n }\\r\\n // to parse SMS info from the device\\r\\n switch (messageTypeLocalCode) {\\r\\n case 'COMM-SMS': // SMS message sent in\\r\\n if (params.data.startsWith('Device location request')) {\\r\\n configsToAck.push(configIds.Controls.RealTimeLocate);\\r\\n } else if (params.data.startsWith('Set IP ok')) {\\r\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n } else if (params.data.startsWith('IMEI:')) {\\r\\n configsToAck.push(configIds.Controls.GetFirmwareVersion);\\r\\n } else if (params.data.startsWith('Set IP ok')) {\\r\\n configsToAck.push(configIds.Controls.ClearBufferedMessages);\\r\\n } else if (params.data.startsWith('flush ok')) {\\r\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n } else if (params.data.startsWith('Set Watch-')) {\\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 = (`Watch-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 = (`Watch;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 = (`Watch;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 = (`Watch-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 // return the object that contains your data\\r\\n return dataToReceiver;\\r\\n // end of main operation\\r\\n // define functions used in operation\\r\\n // decode global msg\\r\\n function decoder(str) { // decode rawdata\\r\\n // CARE Decoder\\r\\n //AddValue(codeValues, 'Message : ', str);\\r\\n var message = str;\\r\\n var index = 18;\\r\\n //parse header & properties\\r\\n var properties = message.substring(2, 4);\\r\\n var lengthLittleEndian = message.substring(4, 8);\\r\\n var total_length = lengthLittleEndian.substring(2, 4) + lengthLittleEndian.substring(0, 2);\\r\\n total_length = 2 * hexToDecimal(total_length.substring(0, 4));\\r\\n var sequenceID = message.substring(12, 16);\\r\\n var command = message.substring(16, 18);\\r\\n //mask bitwise (properties should be '10')\\r\\n if ((parseInt(properties) & 8) == 8) {\\r\\n needsAck = true;\\r\\n } else needsAck = false;\\r\\n // need to check if checksum is correct for possible msg corruption 10/03/23\\r\\n var checksum = message.substring(8, 12);\\r\\n var messageBody = message.substring(16, message.length);\\r\\n debug('message =' + message);\\r\\n debug('checksum =' + checksum);\\r\\n debug('calculateCheckSum =' + calculateCheckSum(messageBody));\\r\\n if (calculateCheckSum(messageBody) == checksum) { // payload is valid\\r\\n debug(\\\"message has valid checksum\\\");\\r\\n var messageBody = command; // update value for the ACK\\r\\n debug('command =' + command);\\r\\n if (command == '01') {\\r\\n while (index < total_length + 16) {\\r\\n 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\\r\\n if ((alarmCodeExtInt & 1) == 1) {\\r\\n var alarm = 'ALF-C';\\r\\n }\\r\\n // Welfare Check-out\\r\\n else if ((alarmCodeExtInt & 2) == 2) {\\r\\n var alarm = 'ALA-C';\\r\\n }\\r\\n // Standard Alerts\\r\\n //Battery low\\r\\n else if ((alarmCodeInt & 1) == 1) {\\r\\n var alarm = 'BATL';\\r\\n }\\r\\n //Overspeed\\r\\n else if ((alarmCodeInt & 2) == 2) {\\r\\n var alarm = 'ALSP';\\r\\n }\\r\\n //Fall\\r\\n else if ((alarmCodeInt & 4) == 4) {\\r\\n var alarm = 'ALF';\\r\\n }\\r\\n //Tilt\\r\\n else if ((alarmCodeInt & 8) == 8) {\\r\\n var alarm = 'TLT';\\r\\n } else if ((alarmCodeInt & 16) == 16) {\\r\\n if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n var alarm = 'Geo1-IN';\\r\\n } else {\\r\\n var alarm = 'Geo1-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 32) == 32) {\\r\\n if ((alarmCodeInt & 33554432) == 33554432) {\\r\\n var alarm = 'Geo2-IN';\\r\\n } else {\\r\\n var alarm = 'Geo2-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 64) == 64) {\\r\\n if ((alarmCodeInt & 67108864) == 67108864) {\\r\\n var alarm = 'Geo3-IN';\\r\\n } else {\\r\\n var alarm = 'Geo3-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 128) == 128) {\\r\\n if ((alarmCodeInt & 134217728) == 134217728) {\\r\\n var alarm = 'Geo4-IN';\\r\\n } else {\\r\\n var alarm = 'Geo4-OUT';\\r\\n }\\r\\n }\\r\\n //Power Off\\r\\n else if ((alarmCodeInt & 256) == 256) {\\r\\n var alarm = 'PWRF';\\r\\n }\\r\\n //Power On\\r\\n else if ((alarmCodeInt & 512) == 512) {\\r\\n var alarm = 'PWRN';\\r\\n }\\r\\n //Motion\\r\\n else if ((alarmCodeInt & 1024) == 1024) {\\r\\n var alarm = 'ALMOV';\\r\\n }\\r\\n //No Motion\\r\\n else if ((alarmCodeInt & 2048) == 2048) {\\r\\n var alarm = 'ALNM';\\r\\n }\\r\\n //SOS\\r\\n else if ((alarmCodeInt & 4096) == 4096) {\\r\\n var alarm = 'ALSOS';\\r\\n } else if ((alarmCodeInt & 8192) == 8192) {\\r\\n var alarm = 'Side1';\\r\\n } else if ((alarmCodeInt & 16384) == 16384) {\\r\\n var alarm = 'Side2';\\r\\n }\\r\\n //Battery charging\\r\\n else if ((alarmCodeInt & 32768) == 32768) {\\r\\n var alarm = 'BATCN';\\r\\n }\\r\\n //Battery no charging\\r\\n else if ((alarmCodeInt & 65536) == 65536) {\\r\\n var alarm = 'BATCF';\\r\\n }\\r\\n //SOS Ending\\r\\n // Temporary Commented until we know exactly how it works. 22/09/2022\\r\\n else if ((alarmCodeInt & 131072) == 131072) {\\r\\n var alarm = 'ALA-F';\\r\\n info = 'Alarm Finished';\\r\\n }\\r\\n //Amber Alert EC03 only\\r\\n else if ((alarmCodeInt & 262144) == 262144) {\\r\\n var alarm = 'ALA';\\r\\n }\\r\\n // welfare Alert check-in ALA-O\\r\\n else if ((alarmCodeInt & 524288) == 524288) {\\r\\n var alarm = 'ALA-O';\\r\\n }\\r\\n // Amber alert Ending ALA-C\\r\\n else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n var alarm = 'ALA-C';\\r\\n }\\r\\n // Amber alert Ending ALA-C\\r\\n //else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n // var alarm = 'ALA-C';\\r\\n //}\\r\\n // Fall-Down Alert ending\\r\\n else if ((alarmCodeInt & 2097152) == 2097152) {\\r\\n var alarm = 'ALF-C';\\r\\n }\\r\\n // welfare Alert Ending ALA\\r\\n else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n var alarm = 'ALA';\\r\\n }\\r\\n // Beacon absent Alert 11/10/22. Need to be added in msg types\\r\\n //else if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n // var alarm = 'BEA';\\r\\n //}\\r\\n general += 'alarm:' + alarm + ',';\\r\\n break;\\r\\n //Custom ID\\r\\n case '03':\\r\\n customID = value;\\r\\n if (!allowedCID.includes(value)) {\\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 //<>,<>,<>,<>,<>\\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 if (!allowedCID.includes(customID)) {\\r\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n AddValue(codeValues, \\\"customID\\\", customID);\\r\\n return\\r\\n }\\r\\n if (statusDevice) {\\r\\n messageForReceiver = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n }\\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;\\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 }\\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 = 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 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 var rawlabel = 'steps';\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=${rawlabel}`);\\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 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 var rawlabel = 'bpm';\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=${rawlabel}`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n }\\r\\n break;\\r\\n // SPO2\\r\\n case '41':\\r\\n var numSPO = (keyLength - 2) / 12;\\r\\n for (let j = 0; j < numSPO; 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 SPOHex = value.substring(8, 10);\\r\\n var SPO = hexToDecimal(SPOHex);\\r\\n var trustLevelHex = value.substring(10, 12);\\r\\n var trustLevel = hexToDecimal(trustLevelHex);\\r\\n info = SPO;\\r\\n //var alarmCode = 'True';\\r\\n var alarm = 'SPO2';\\r\\n general += ' SPO2 rate' + j + ':' + SPO + ',';\\r\\n var rawlabel = '%';\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};SPO2=${info};TLEVEL=${trustLevel};LABEL=${rawlabel}`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n }\\r\\n break;\\r\\n //BLE Connected . For Flic button\\r\\n case '62':\\r\\n location_type = 'BLE';\\r\\n //var alarm = 'EBZI'; \\r\\n //var latitudeHex = '00';\\r\\n //var longitudeHex = '00';\\r\\n //var descr = 'empty';\\r\\n var flag = hexToDecimal(value.substring(0, 2)); // 0= Disconnected, 1= Connected\\r\\n var mac = value.substring(2, 14); // No hace falta darle la vuelta\\r\\n // add : format in MAC\\r\\n mac = mac.match(/.{1,2}/g).join(':');\\r\\n var batLevel = hexToDecimal(value.substring(14, 16)); // 0-100\\r\\n //location_time = timestamp;\\r\\n ble_data = `${flag},${batLevel},${mac}`;\\r\\n general += 'BLE location (State):' + flag + ', (bat):' + batLevel + ', (mac):' + mac + ',';\\r\\n break;\\r\\n }\\r\\n }\\r\\n if (alarmCode) {\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch;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 = (`Watch;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': // Ringer Volume\\r\\n var volume = hexToDecimal(value);\\r\\n imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;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 = (`Watch;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 '0F': // Enable control.... Used for STEP COUNTING SETTINGS\\r\\n // 'FF FF 21 80'\\r\\n var StepStatus = hex2bin(value.substring(4, 6));\\r\\n var enalbleDisable = '';\\r\\n if (StepStatus.substring(7, 8) == '1') {\\r\\n var step = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var step = 'Disable, '\\r\\n };\\r\\n //var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n //hrate += detectingInterval;\\r\\n AddValue(codeValues, \\\"step\\\", step);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadStepsSettings.EnableDisableReadStepsSettings, enalbleDisable);\\r\\n //AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadStepsSettings.EnableDisableReadStepsSettings);\\r\\n //configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\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 = (`Watch;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 '34': //ContactList with name\\r\\n var contactNumber = value.substring(1, 2);\\r\\n var telLength = hexToDecimal(value.substring(2, 4));\\r\\n var tel = '';\\r\\n switch (contactNumber) {\\r\\n // Emergency Number\\r\\n case '0':\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n break;\\r\\n // Speed Dial Number\\r\\n //case '1':\\r\\n // tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n // AddValue(codeValues, \\\"SpeedDialNumber\\\", tel);\\r\\n // AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.SpeedDialNumber, tel);\\r\\n // configsToAck.push(configIds.ReadSpeedDialSettings.SpeedDialNumber);\\r\\n // break;\\r\\n // Gateway Number\\r\\n case '9': //00447781482635,Esendex UK 0034627177148,Esendex Spain 00447507288240,Esendex UK Acceptance\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n if (tel.includes('447781482635') || tel.includes('00447781482635')) {\\r\\n tel = 'Esendex UK'\\r\\n } else if (tel.includes('34627177148') || tel.includes('0034627177148')) {\\r\\n tel = 'Esendex Spain'\\r\\n } else if (tel.includes('447507288240') || tel.includes('00447507288240')) {\\r\\n tel = 'Esendex UK Acceptance'\\r\\n } else {\\r\\n tel = 'Default'\\r\\n }\\r\\n AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n break;\\r\\n default:\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n if (tel.length < 6) {\\r\\n contacts += '';\\r\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n break;\\r\\n }\\r\\n //contacts += 'A' + (contactNumber - 1) + ': ' + tel + ', ';\\r\\n contacts += tel + ', ';\\r\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n break;\\r\\n }\\r\\n break;\\r\\n case '40': // APN\\r\\n //no ACK need\\r\\n AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'));\\r\\n configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\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 = (`Watch;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 = (`Watch;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 '46': //HeartRate\\r\\n // '10 0E 00 80'\\r\\n var HeartRateStatus = hex2bin(value.substring(6, 8));\\r\\n var enalbleDisable = '';\\r\\n if (HeartRateStatus.substring(0, 1) == '1') {\\r\\n var hrate = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var hrate = 'Disable, '\\r\\n };\\r\\n var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n hrate += detectingInterval;\\r\\n AddValue(codeValues, \\\"hrate\\\", hrate);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings);\\r\\n configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\r\\n break;\\r\\n case '47': // Custom Id\\r\\n imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;ACK-CUSTID;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"customeid\\\", value);\\r\\n AddValue(configsToUpdate, configIds.ReadState.CustomId, hex_to_ascii(value)); //now it comes \\\"3036\\\"\\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 // commented until Eview fixes this function\\r\\n /*\\r\\n messageForReceiver = (`Watch;ACK-NOMOTION;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"nomotion\\\", alertSetting);\\r\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings, enableDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n configsToAck.push(configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings);\\r\\n configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n */\\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 = (`Watch;ACK-FALLALERT;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n var sesibityOptionValue = hexToDecimal(value.substring(1, 2));\\r\\n sensibility += sesibityOptionValue;\\r\\n AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n //AddValue(configsToUpdate, configIds.ReadAlertSettings.FallSettings, sensibility);\\r\\n AddValue(configsToUpdate, configIds.ReadFallSettings.EnableDisableFallSettings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadFallSettings.Sensitivity, sesibityOptionValue);\\r\\n //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n configsToAck.push(configIds.ReadFallSettings.EnableDisableFallSettings);\\r\\n configsToAck.push(configIds.ReadFallSettings.Sensitivity);\\r\\n break;\\r\\n case '73': //BeaconList\\r\\n var beaconNumber = hexToDecimal(value.substring(1, 2));\\r\\n var beaconStatus = hex2bin(value.substring(0, 1));\\r\\n beaconStatus = hex_to_ascii(value.substring(30, value.length));\\r\\n //beaconStatus = changeEndianness(value.substring(30, value.length));\\r\\n //homeBeacon += 'B' + (beaconNumber + 1) + ': ' + beaconStatus + ', ';\\r\\n homeBeacon += beaconStatus + ', ';\\r\\n AddValue(codeValues, \\\"homeBeacon\\\", homeBeacon);\\r\\n messageForReceiver = (`Watch;ACK-GDATA;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n break;\\r\\n case '4A': //Wifi Network List\\r\\n var wifiSSIDLenght = hexToDecimal(value.substring(2, 4));\\r\\n var wifiPasswordLenght = hexToDecimal(value.substring(4, 6));\\r\\n var wifiIndex = hexToDecimal(value.substring(1, 2));\\r\\n //var wifiStatus = hexToDecimal(value.substring(0, 1));\\r\\n var wifiStatus = value.substring(0, 1);\\r\\n /*var enalbleDisable = wifiSSID = wifiPassword = homeWifi = '';\\r\\n /var homeWifi = '';\\r\\n if (wifiIndex == '0') { // Only first Wifi of the list\\r\\n if (wifiStatus == '8') {\\r\\n homeWifi += ' Enable, '\\r\\n enalbleDisable = '1';\\r\\n } else {\\r\\n homeWifi += ' Disable, '\\r\\n //enalbleDisable = '0';\\r\\n };*/\\r\\n if ((wifiStatus == '8') || (wifiStatus == 'C')) { // 8 == ON OR C== ON and Connected\\r\\n var wifiSSID = hex_to_ascii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\r\\n var wifiPassword = hex_to_ascii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\r\\n var imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;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 = (`Watch;ACK-SPEED;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"speed\\\", alertSetting);\\r\\n AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\r\\n configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n break;\\r\\n case '7A': //[Length]:05 [Key]:7A [Value]:60 54 00 80\\r\\n // {\\\"spo2Interval\\\":{\\\"interval\\\":21600,\\\"status\\\":1}}\\r\\n var SPOStatus = hex2bin(value.substring(6, 8));\\r\\n var enalbleDisable = '';\\r\\n if (SPOStatus.substring(0, 1) == '1') {\\r\\n var spo = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var spo = 'Disable, '\\r\\n };\\r\\n var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n spo += detectingInterval;\\r\\n AddValue(codeValues, \\\"SPO2\\\", spo);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadSPO2Settings.EnableDisableReadSPO2Settings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadSPO2Settings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadSPO2Settings.EnableDisableReadSPO2Settings);\\r\\n configsToAck.push(configIds.ReadSPO2Settings.ReportingFrequency);\\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 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 = (`Watch-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 = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch-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 if (typeof configIds !== 'undefined' && configIds && configIds.ConfigureDevice && configIds.ConfigureDevice.LastConfigured) { // when is defined\\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 }\\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(hex) { // Hex to Ascii \\r\\n if (hex.length % 2 !== 0) {\\r\\n throw new Error(\\\"Hex string length must be even\\\");\\r\\n }\\r\\n let ascii = '';\\r\\n for (let i = 0; i < hex.length; i += 2) {\\r\\n const byte = hex.substr(i, 2);\\r\\n const charCode = parseInt(byte, 16);\\r\\n if (charCode !== 0) { // remove null character (\\\\u0000)\\r\\n ascii += String.fromCharCode(charCode);\\r\\n }\\r\\n }\\r\\n return ascii;\\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 normalizeLabels(raw) { // output labels as array\\r\\n if (!raw) return [];\\r\\n return [String(raw)];\\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}\\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":1765485476},{"Type":1,"NewValue":"{\"Id\":437,\"Name\":\"Access TEC Care Watch\",\"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 // Watch protocol - please see variables and typical values in order below\\r\\n // Watch-CYC;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;SIGNAL=<>;WM=<>;GENERAL=<>\\r\\n // Watch-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\r\\n //\\r\\n // Author: Juanmi Navarro\\r\\n // Created: 01/01/0000\\r\\n // Last modified: 18/09/2025\\r\\n //\\r\\n ///////////////////////////////////////////////////////////////////////////////\\r\\n if (typeof localTesting === \\\"undefined\\\") {\\r\\n let localTesting = false;\\r\\n }\\r\\n const crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,\\r\\n 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,\\r\\n 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,\\r\\n 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,\\r\\n 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,\\r\\n 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,\\r\\n 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,\\r\\n 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,\\r\\n 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,\\r\\n 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,\\r\\n 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,\\r\\n 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,\\r\\n 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,\\r\\n 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,\\r\\n 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,\\r\\n 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,\\r\\n 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,\\r\\n 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,\\r\\n 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,\\r\\n 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,\\r\\n 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,\\r\\n 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n ];\\r\\n var codeValues = [];\\r\\n AddValue(codeValues, 'protocol_template', 'Watch');\\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 = (`Watch-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 var allowedCID = ['3036', '06'];\\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 } else if (oystaTemplate == 'True') { // Oysta Template \\r\\n AddValue(codeValues, \\\"rawMsg\\\", raw);\\r\\n if ((params.rawlabel) && (params.rawlabel !== '')) { // decode label if exists\\r\\n //var labels = normalizeLabels(params.rawlabel); // \\\"steps\\\" -> [\\\"steps\\\"]\\r\\n //AddValue(codeValues, 'oysta_labels', labels);\\r\\n AddValue(codeValues, \\\"oysta_labels\\\", params.rawlabel);\\r\\n }\\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 //<>,<>,<> \\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];\\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 //<>,<>,<> \\r\\n if (mac2) {\\r\\n AddValue(codeValues, 'beacon_mac', mac2);\\r\\n var simpleQuery2 = [{\\r\\n 'code': 'Mac',\\r\\n 'value': mac2,\\r\\n }];\\r\\n var simpleQueryLabel2 = {\\r\\n 'table': 'beacons',\\r\\n 'select': 'Name',\\r\\n 'query': simpleQuery2\\r\\n };\\r\\n var labels2 = [];\\r\\n labels2.push(JSON.stringify(simpleQueryLabel2));\\r\\n AddValue(codeValues, 'oysta_labels', JSON.stringify(labels2));\\r\\n }\\r\\n if (params.beacon_major) {\\r\\n AddValue(codeValues, 'beacon_major', params.beacon_major);\\r\\n } else {\\r\\n AddValue(codeValues, 'beacon_major', 0);\\r\\n }\\r\\n if (params.beacon_minor) {\\r\\n AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\r\\n } else {\\r\\n AddValue(codeValues, 'beacon_minor', 0);\\r\\n }\\r\\n //AddValue(codeValues,'oysta_labels', label);\\r\\n //AddValue(codeValues,'oysta_value', mac);\\r\\n }\\r\\n /* meter mas tarde... \\r\\n if (params.smart_data !== 'undefined') {\\r\\n var gen_location = params.smart_data.split(',')\\r\\n var latitude = gen_location[0]\\r\\n var longitude = gen_location[1]\\r\\n var location_accuracy = gen_location[2]\\r\\n var altitude = gen_location[3]\\r\\n AddValue(codeValues,'latitude', latitude);\\r\\n AddValue(codeValues,'longitude', longitude);\\r\\n AddValue(codeValues,'altitude', altitude);\\r\\n AddValue(codeValues,'location_accuracy', location_accuracy);\\r\\n }\\r\\n */\\r\\n /*else if ((params.event_time) && (params.event_time == '')) {\\r\\n var event_time = moment.utc().unix();\\r\\n AddValue(codeValues,'event_time', event_time);\\r\\n } revisar mas adelante*/\\r\\n if (params.location_time) {\\r\\n AddValue(codeValues, 'location_time', params.location_time);\\r\\n }\\r\\n if (params.event_time) {\\r\\n AddValue(codeValues, 'event_time', params.event_time);\\r\\n }\\r\\n // to parse SMS info from the device\\r\\n switch (messageTypeLocalCode) {\\r\\n case 'COMM-SMS': // SMS message sent in\\r\\n if (params.data.startsWith('Device location request')) {\\r\\n configsToAck.push(configIds.Controls.RealTimeLocate);\\r\\n } else if (params.data.startsWith('Set IP ok')) {\\r\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n } else if (params.data.startsWith('IMEI:')) {\\r\\n configsToAck.push(configIds.Controls.GetFirmwareVersion);\\r\\n } else if (params.data.startsWith('Set IP ok')) {\\r\\n configsToAck.push(configIds.Controls.ClearBufferedMessages);\\r\\n } else if (params.data.startsWith('flush ok')) {\\r\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n } else if (params.data.startsWith('Set Watch-')) {\\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 = (`Watch-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 = (`Watch;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 = (`Watch;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 = (`Watch-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 // return the object that contains your data\\r\\n return dataToReceiver;\\r\\n // end of main operation\\r\\n // define functions used in operation\\r\\n // decode global msg\\r\\n function decoder(str) { // decode rawdata\\r\\n // CARE Decoder\\r\\n //AddValue(codeValues, 'Message : ', str);\\r\\n var message = str;\\r\\n var index = 18;\\r\\n //parse header & properties\\r\\n var properties = message.substring(2, 4);\\r\\n var lengthLittleEndian = message.substring(4, 8);\\r\\n var total_length = lengthLittleEndian.substring(2, 4) + lengthLittleEndian.substring(0, 2);\\r\\n total_length = 2 * hexToDecimal(total_length.substring(0, 4));\\r\\n var sequenceID = message.substring(12, 16);\\r\\n var command = message.substring(16, 18);\\r\\n //mask bitwise (properties should be '10')\\r\\n if ((parseInt(properties) & 8) == 8) {\\r\\n needsAck = true;\\r\\n } else needsAck = false;\\r\\n // need to check if checksum is correct for possible msg corruption 10/03/23\\r\\n var checksum = message.substring(8, 12);\\r\\n var messageBody = message.substring(16, message.length);\\r\\n debug('message =' + message);\\r\\n debug('checksum =' + checksum);\\r\\n debug('calculateCheckSum =' + calculateCheckSum(messageBody));\\r\\n if (calculateCheckSum(messageBody) == checksum) { // payload is valid\\r\\n debug(\\\"message has valid checksum\\\");\\r\\n var messageBody = command; // update value for the ACK\\r\\n debug('command =' + command);\\r\\n if (command == '01') {\\r\\n while (index < total_length + 16) {\\r\\n 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\\r\\n if ((alarmCodeExtInt & 1) == 1) {\\r\\n var alarm = 'ALF-C';\\r\\n }\\r\\n // Welfare Check-out\\r\\n else if ((alarmCodeExtInt & 2) == 2) {\\r\\n var alarm = 'ALA-C';\\r\\n }\\r\\n // Standard Alerts\\r\\n //Battery low\\r\\n else if ((alarmCodeInt & 1) == 1) {\\r\\n var alarm = 'BATL';\\r\\n }\\r\\n //Overspeed\\r\\n else if ((alarmCodeInt & 2) == 2) {\\r\\n var alarm = 'ALSP';\\r\\n }\\r\\n //Fall\\r\\n else if ((alarmCodeInt & 4) == 4) {\\r\\n var alarm = 'ALF';\\r\\n }\\r\\n //Tilt\\r\\n else if ((alarmCodeInt & 8) == 8) {\\r\\n var alarm = 'TLT';\\r\\n } else if ((alarmCodeInt & 16) == 16) {\\r\\n if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n var alarm = 'Geo1-IN';\\r\\n } else {\\r\\n var alarm = 'Geo1-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 32) == 32) {\\r\\n if ((alarmCodeInt & 33554432) == 33554432) {\\r\\n var alarm = 'Geo2-IN';\\r\\n } else {\\r\\n var alarm = 'Geo2-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 64) == 64) {\\r\\n if ((alarmCodeInt & 67108864) == 67108864) {\\r\\n var alarm = 'Geo3-IN';\\r\\n } else {\\r\\n var alarm = 'Geo3-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 128) == 128) {\\r\\n if ((alarmCodeInt & 134217728) == 134217728) {\\r\\n var alarm = 'Geo4-IN';\\r\\n } else {\\r\\n var alarm = 'Geo4-OUT';\\r\\n }\\r\\n }\\r\\n //Power Off\\r\\n else if ((alarmCodeInt & 256) == 256) {\\r\\n var alarm = 'PWRF';\\r\\n }\\r\\n //Power On\\r\\n else if ((alarmCodeInt & 512) == 512) {\\r\\n var alarm = 'PWRN';\\r\\n }\\r\\n //Motion\\r\\n else if ((alarmCodeInt & 1024) == 1024) {\\r\\n var alarm = 'ALMOV';\\r\\n }\\r\\n //No Motion\\r\\n else if ((alarmCodeInt & 2048) == 2048) {\\r\\n var alarm = 'ALNM';\\r\\n }\\r\\n //SOS\\r\\n else if ((alarmCodeInt & 4096) == 4096) {\\r\\n var alarm = 'ALSOS';\\r\\n } else if ((alarmCodeInt & 8192) == 8192) {\\r\\n var alarm = 'Side1';\\r\\n } else if ((alarmCodeInt & 16384) == 16384) {\\r\\n var alarm = 'Side2';\\r\\n }\\r\\n //Battery charging\\r\\n else if ((alarmCodeInt & 32768) == 32768) {\\r\\n var alarm = 'BATCN';\\r\\n }\\r\\n //Battery no charging\\r\\n else if ((alarmCodeInt & 65536) == 65536) {\\r\\n var alarm = 'BATCF';\\r\\n }\\r\\n //SOS Ending\\r\\n // Temporary Commented until we know exactly how it works. 22/09/2022\\r\\n else if ((alarmCodeInt & 131072) == 131072) {\\r\\n var alarm = 'ALA-F';\\r\\n info = 'Alarm Finished';\\r\\n }\\r\\n //Amber Alert EC03 only\\r\\n else if ((alarmCodeInt & 262144) == 262144) {\\r\\n var alarm = 'ALA';\\r\\n }\\r\\n // welfare Alert check-in ALA-O\\r\\n else if ((alarmCodeInt & 524288) == 524288) {\\r\\n var alarm = 'ALA-O';\\r\\n }\\r\\n // Amber alert Ending ALA-C\\r\\n else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n var alarm = 'ALA-C';\\r\\n }\\r\\n // Amber alert Ending ALA-C\\r\\n //else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n // var alarm = 'ALA-C';\\r\\n //}\\r\\n // Fall-Down Alert ending\\r\\n else if ((alarmCodeInt & 2097152) == 2097152) {\\r\\n var alarm = 'ALF-C';\\r\\n }\\r\\n // welfare Alert Ending ALA\\r\\n else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n var alarm = 'ALA';\\r\\n }\\r\\n // Beacon absent Alert 11/10/22. Need to be added in msg types\\r\\n //else if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n // var alarm = 'BEA';\\r\\n //}\\r\\n general += 'alarm:' + alarm + ',';\\r\\n break;\\r\\n //Custom ID\\r\\n case '03':\\r\\n customID = value;\\r\\n if (!allowedCID.includes(value)) {\\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 //<>,<>,<>,<>,<>\\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 if (!allowedCID.includes(customID)) {\\r\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n AddValue(codeValues, \\\"customID\\\", customID);\\r\\n return\\r\\n }\\r\\n if (statusDevice) {\\r\\n messageForReceiver = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n }\\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;\\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 }\\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 = 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 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 var rawlabel = 'steps';\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=${rawlabel}`);\\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 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 var rawlabel = 'bpm';\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=${rawlabel}`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n }\\r\\n break;\\r\\n // SPO2\\r\\n case '41':\\r\\n var numSPO = (keyLength - 2) / 12;\\r\\n for (let j = 0; j < numSPO; 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 SPOHex = value.substring(8, 10);\\r\\n var SPO = hexToDecimal(SPOHex);\\r\\n var trustLevelHex = value.substring(10, 12);\\r\\n var trustLevel = hexToDecimal(trustLevelHex);\\r\\n info = SPO;\\r\\n //var alarmCode = 'True';\\r\\n var alarm = 'SPO2';\\r\\n general += ' SPO2 rate' + j + ':' + SPO + ',';\\r\\n var rawlabel = '%';\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};SPO2=${info};TLEVEL=${trustLevel};LABEL=${rawlabel}`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n }\\r\\n break;\\r\\n //BLE Connected . For Flic button\\r\\n case '62':\\r\\n location_type = 'BLE';\\r\\n //var alarm = 'EBZI'; \\r\\n //var latitudeHex = '00';\\r\\n //var longitudeHex = '00';\\r\\n //var descr = 'empty';\\r\\n var flag = hexToDecimal(value.substring(0, 2)); // 0= Disconnected, 1= Connected\\r\\n var mac = value.substring(2, 14); // No hace falta darle la vuelta\\r\\n // add : format in MAC\\r\\n mac = mac.match(/.{1,2}/g).join(':');\\r\\n var batLevel = hexToDecimal(value.substring(14, 16)); // 0-100\\r\\n //location_time = timestamp;\\r\\n ble_data = `${flag},${batLevel},${mac}`;\\r\\n general += 'BLE location (State):' + flag + ', (bat):' + batLevel + ', (mac):' + mac + ',';\\r\\n break;\\r\\n }\\r\\n }\\r\\n if (alarmCode) {\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch;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 = (`Watch;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': // Ringer Volume\\r\\n var volume = hexToDecimal(value);\\r\\n imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;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 = (`Watch;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 '0F': // Enable control.... Used for STEP COUNTING SETTINGS\\r\\n // 'FF FF 21 80'\\r\\n var StepStatus = hex2bin(value.substring(4, 6));\\r\\n var enalbleDisable = '';\\r\\n if (StepStatus.substring(7, 8) == '1') {\\r\\n var step = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var step = 'Disable, '\\r\\n };\\r\\n //var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n //hrate += detectingInterval;\\r\\n AddValue(codeValues, \\\"step\\\", step);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadStepsSettings.EnableDisableReadStepsSettings, enalbleDisable);\\r\\n //AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadStepsSettings.EnableDisableReadStepsSettings);\\r\\n //configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\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 = (`Watch;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 '34': //ContactList with name\\r\\n var contactNumber = value.substring(1, 2);\\r\\n var telLength = hexToDecimal(value.substring(2, 4));\\r\\n var tel = '';\\r\\n switch (contactNumber) {\\r\\n // Emergency Number\\r\\n case '0':\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n break;\\r\\n // Speed Dial Number\\r\\n //case '1':\\r\\n // tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n // AddValue(codeValues, \\\"SpeedDialNumber\\\", tel);\\r\\n // AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.SpeedDialNumber, tel);\\r\\n // configsToAck.push(configIds.ReadSpeedDialSettings.SpeedDialNumber);\\r\\n // break;\\r\\n // Gateway Number\\r\\n case '9': //00447781482635,Esendex UK 0034627177148,Esendex Spain 00447507288240,Esendex UK Acceptance\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n if (tel.includes('447781482635') || tel.includes('00447781482635')) {\\r\\n tel = 'Esendex UK'\\r\\n } else if (tel.includes('34627177148') || tel.includes('0034627177148')) {\\r\\n tel = 'Esendex Spain'\\r\\n } else if (tel.includes('447507288240') || tel.includes('00447507288240')) {\\r\\n tel = 'Esendex UK Acceptance'\\r\\n } else {\\r\\n tel = 'Default'\\r\\n }\\r\\n AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n break;\\r\\n default:\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n if (tel.length < 6) {\\r\\n contacts += '';\\r\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n break;\\r\\n }\\r\\n //contacts += 'A' + (contactNumber - 1) + ': ' + tel + ', ';\\r\\n contacts += tel + ', ';\\r\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n break;\\r\\n }\\r\\n break;\\r\\n case '40': // APN\\r\\n //no ACK need\\r\\n AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'));\\r\\n configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\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 = (`Watch;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 = (`Watch;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 '46': //HeartRate\\r\\n // '10 0E 00 80'\\r\\n var HeartRateStatus = hex2bin(value.substring(6, 8));\\r\\n var enalbleDisable = '';\\r\\n if (HeartRateStatus.substring(0, 1) == '1') {\\r\\n var hrate = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var hrate = 'Disable, '\\r\\n };\\r\\n var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n hrate += detectingInterval;\\r\\n AddValue(codeValues, \\\"hrate\\\", hrate);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings);\\r\\n configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\r\\n break;\\r\\n case '47': // Custom Id\\r\\n imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;ACK-CUSTID;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"customeid\\\", value);\\r\\n AddValue(configsToUpdate, configIds.ReadState.CustomId, hex_to_ascii(value)); //now it comes \\\"3036\\\"\\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 // commented until Eview fixes this function\\r\\n /*\\r\\n messageForReceiver = (`Watch;ACK-NOMOTION;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"nomotion\\\", alertSetting);\\r\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings, enableDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n configsToAck.push(configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings);\\r\\n configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n */\\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 = (`Watch;ACK-FALLALERT;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n var sesibityOptionValue = hexToDecimal(value.substring(1, 2));\\r\\n sensibility += sesibityOptionValue;\\r\\n AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n //AddValue(configsToUpdate, configIds.ReadAlertSettings.FallSettings, sensibility);\\r\\n AddValue(configsToUpdate, configIds.ReadFallSettings.EnableDisableFallSettings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadFallSettings.Sensitivity, sesibityOptionValue);\\r\\n //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n configsToAck.push(configIds.ReadFallSettings.EnableDisableFallSettings);\\r\\n configsToAck.push(configIds.ReadFallSettings.Sensitivity);\\r\\n break;\\r\\n case '73': //BeaconList\\r\\n var beaconNumber = hexToDecimal(value.substring(1, 2));\\r\\n var beaconStatus = hex2bin(value.substring(0, 1));\\r\\n beaconStatus = hex_to_ascii(value.substring(30, value.length));\\r\\n //beaconStatus = changeEndianness(value.substring(30, value.length));\\r\\n //homeBeacon += 'B' + (beaconNumber + 1) + ': ' + beaconStatus + ', ';\\r\\n homeBeacon += beaconStatus + ', ';\\r\\n AddValue(codeValues, \\\"homeBeacon\\\", homeBeacon);\\r\\n messageForReceiver = (`Watch;ACK-GDATA;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n break;\\r\\n case '4A': //Wifi Network List\\r\\n var wifiSSIDLenght = hexToDecimal(value.substring(2, 4));\\r\\n var wifiPasswordLenght = hexToDecimal(value.substring(4, 6));\\r\\n var wifiIndex = hexToDecimal(value.substring(1, 2));\\r\\n //var wifiStatus = hexToDecimal(value.substring(0, 1));\\r\\n var wifiStatus = value.substring(0, 1);\\r\\n /*var enalbleDisable = wifiSSID = wifiPassword = homeWifi = '';\\r\\n /var homeWifi = '';\\r\\n if (wifiIndex == '0') { // Only first Wifi of the list\\r\\n if (wifiStatus == '8') {\\r\\n homeWifi += ' Enable, '\\r\\n enalbleDisable = '1';\\r\\n } else {\\r\\n homeWifi += ' Disable, '\\r\\n //enalbleDisable = '0';\\r\\n };*/\\r\\n if ((wifiStatus == '8') || (wifiStatus == 'C')) { // 8 == ON OR C== ON and Connected\\r\\n var wifiSSID = hex_to_ascii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\r\\n var wifiPassword = hex_to_ascii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\r\\n var imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;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 = (`Watch;ACK-SPEED;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"speed\\\", alertSetting);\\r\\n AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\r\\n configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n break;\\r\\n case '7A': //[Length]:05 [Key]:7A [Value]:60 54 00 80\\r\\n // {\\\"spo2Interval\\\":{\\\"interval\\\":21600,\\\"status\\\":1}}\\r\\n var SPOStatus = hex2bin(value.substring(6, 8));\\r\\n var enalbleDisable = '';\\r\\n if (SPOStatus.substring(0, 1) == '1') {\\r\\n var spo = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var spo = 'Disable, '\\r\\n };\\r\\n var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n spo += detectingInterval;\\r\\n AddValue(codeValues, \\\"SPO2\\\", spo);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadSPO2Settings.EnableDisableReadSPO2Settings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadSPO2Settings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadSPO2Settings.EnableDisableReadSPO2Settings);\\r\\n configsToAck.push(configIds.ReadSPO2Settings.ReportingFrequency);\\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 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 = (`Watch-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 = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch-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 if (typeof configIds !== 'undefined' && configIds && configIds.ConfigureDevice && configIds.ConfigureDevice.LastConfigured) { // when is defined\\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 }\\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(hex) { // Hex to Ascii \\r\\n if (hex.length % 2 !== 0) {\\r\\n throw new Error(\\\"Hex string length must be even\\\");\\r\\n }\\r\\n let ascii = '';\\r\\n for (let i = 0; i < hex.length; i += 2) {\\r\\n const byte = hex.substr(i, 2);\\r\\n const charCode = parseInt(byte, 16);\\r\\n if (charCode !== 0) { // remove null character (\\\\u0000)\\r\\n ascii += String.fromCharCode(charCode);\\r\\n }\\r\\n }\\r\\n return ascii;\\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 normalizeLabels(raw) { // output labels as array\\r\\n if (!raw) return [];\\r\\n return [String(raw)];\\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}\\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":1765486097},{"Type":1,"NewValue":"{\"Id\":437,\"Name\":\"Access TEC Care Watch\",\"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 // Watch protocol - please see variables and typical values in order below\\r\\n // Watch-CYC;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;SIGNAL=<>;WM=<>;GENERAL=<>\\r\\n // Watch-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\r\\n //\\r\\n // Author: Juanmi Navarro\\r\\n // Created: 01/01/0000\\r\\n // Last modified: 18/09/2025\\r\\n //\\r\\n ///////////////////////////////////////////////////////////////////////////////\\r\\n if (typeof localTesting === \\\"undefined\\\") {\\r\\n let localTesting = false;\\r\\n }\\r\\n const crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,\\r\\n 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,\\r\\n 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,\\r\\n 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,\\r\\n 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,\\r\\n 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,\\r\\n 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,\\r\\n 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,\\r\\n 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,\\r\\n 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,\\r\\n 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,\\r\\n 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,\\r\\n 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,\\r\\n 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,\\r\\n 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,\\r\\n 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,\\r\\n 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,\\r\\n 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,\\r\\n 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,\\r\\n 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,\\r\\n 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,\\r\\n 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n ];\\r\\n var codeValues = [];\\r\\n AddValue(codeValues, 'protocol_template', 'Watch');\\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 = (`Watch-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 var allowedCID = ['3036', '06'];\\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 } else if (oystaTemplate == 'True') { // Oysta Template \\r\\n AddValue(codeValues, \\\"rawMsg\\\", raw);\\r\\n if ((params.rawlabel) && (params.rawlabel !== '')) { // decode label if exists\\r\\n //var labels = normalizeLabels(params.rawlabel); // \\\"steps\\\" -> [\\\"steps\\\"]\\r\\n //AddValue(codeValues, 'oysta_labels', labels);\\r\\n AddValue(codeValues, \\\"oysta_labels\\\", params.rawlabel);\\r\\n }\\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 //<>,<>,<> \\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];\\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 //<>,<>,<> \\r\\n if (mac2) {\\r\\n AddValue(codeValues, 'beacon_mac', mac2);\\r\\n var simpleQuery2 = [{\\r\\n 'code': 'Mac',\\r\\n 'value': mac2,\\r\\n }];\\r\\n var simpleQueryLabel2 = {\\r\\n 'table': 'beacons',\\r\\n 'select': 'Name',\\r\\n 'query': simpleQuery2\\r\\n };\\r\\n var labels2 = [];\\r\\n labels2.push(JSON.stringify(simpleQueryLabel2));\\r\\n AddValue(codeValues, 'oysta_labels', JSON.stringify(labels2));\\r\\n }\\r\\n if (params.beacon_major) {\\r\\n AddValue(codeValues, 'beacon_major', params.beacon_major);\\r\\n } else {\\r\\n AddValue(codeValues, 'beacon_major', 0);\\r\\n }\\r\\n if (params.beacon_minor) {\\r\\n AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\r\\n } else {\\r\\n AddValue(codeValues, 'beacon_minor', 0);\\r\\n }\\r\\n //AddValue(codeValues,'oysta_labels', label);\\r\\n //AddValue(codeValues,'oysta_value', mac);\\r\\n }\\r\\n /* meter mas tarde... \\r\\n if (params.smart_data !== 'undefined') {\\r\\n var gen_location = params.smart_data.split(',')\\r\\n var latitude = gen_location[0]\\r\\n var longitude = gen_location[1]\\r\\n var location_accuracy = gen_location[2]\\r\\n var altitude = gen_location[3]\\r\\n AddValue(codeValues,'latitude', latitude);\\r\\n AddValue(codeValues,'longitude', longitude);\\r\\n AddValue(codeValues,'altitude', altitude);\\r\\n AddValue(codeValues,'location_accuracy', location_accuracy);\\r\\n }\\r\\n */\\r\\n /*else if ((params.event_time) && (params.event_time == '')) {\\r\\n var event_time = moment.utc().unix();\\r\\n AddValue(codeValues,'event_time', event_time);\\r\\n } revisar mas adelante*/\\r\\n if (params.location_time) {\\r\\n AddValue(codeValues, 'location_time', params.location_time);\\r\\n }\\r\\n if (params.event_time) {\\r\\n AddValue(codeValues, 'event_time', params.event_time);\\r\\n }\\r\\n // to parse SMS info from the device\\r\\n switch (messageTypeLocalCode) {\\r\\n case 'COMM-SMS': // SMS message sent in\\r\\n if (params.data.startsWith('Device location request')) {\\r\\n configsToAck.push(configIds.Controls.RealTimeLocate);\\r\\n } else if (params.data.startsWith('Set IP ok')) {\\r\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n } else if (params.data.startsWith('IMEI:')) {\\r\\n configsToAck.push(configIds.Controls.GetFirmwareVersion);\\r\\n } else if (params.data.startsWith('Set IP ok')) {\\r\\n configsToAck.push(configIds.Controls.ClearBufferedMessages);\\r\\n } else if (params.data.startsWith('flush ok')) {\\r\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n } else if (params.data.startsWith('Set Watch-')) {\\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 = (`Watch-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 = (`Watch;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 = (`Watch;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 = (`Watch-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(JSON.stringify(dataToReceiver));\\r\\n // return the object that contains your data\\r\\n return dataToReceiver;\\r\\n // end of main operation\\r\\n // define functions used in operation\\r\\n // decode global msg\\r\\n function decoder(str) { // decode rawdata\\r\\n // CARE Decoder\\r\\n //AddValue(codeValues, 'Message : ', str);\\r\\n var message = str;\\r\\n var index = 18;\\r\\n //parse header & properties\\r\\n var properties = message.substring(2, 4);\\r\\n var lengthLittleEndian = message.substring(4, 8);\\r\\n var total_length = lengthLittleEndian.substring(2, 4) + lengthLittleEndian.substring(0, 2);\\r\\n total_length = 2 * hexToDecimal(total_length.substring(0, 4));\\r\\n var sequenceID = message.substring(12, 16);\\r\\n var command = message.substring(16, 18);\\r\\n //mask bitwise (properties should be '10')\\r\\n if ((parseInt(properties) & 8) == 8) {\\r\\n needsAck = true;\\r\\n } else needsAck = false;\\r\\n // need to check if checksum is correct for possible msg corruption 10/03/23\\r\\n var checksum = message.substring(8, 12);\\r\\n var messageBody = message.substring(16, message.length);\\r\\n debug('message =' + message);\\r\\n debug('checksum =' + checksum);\\r\\n debug('calculateCheckSum =' + calculateCheckSum(messageBody));\\r\\n if (calculateCheckSum(messageBody) == checksum) { // payload is valid\\r\\n debug(\\\"message has valid checksum\\\");\\r\\n var messageBody = command; // update value for the ACK\\r\\n debug('command =' + command);\\r\\n if (command == '01') {\\r\\n while (index < total_length + 16) {\\r\\n 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\\r\\n if ((alarmCodeExtInt & 1) == 1) {\\r\\n var alarm = 'ALF-C';\\r\\n }\\r\\n // Welfare Check-out\\r\\n else if ((alarmCodeExtInt & 2) == 2) {\\r\\n var alarm = 'ALA-C';\\r\\n }\\r\\n // Standard Alerts\\r\\n //Battery low\\r\\n else if ((alarmCodeInt & 1) == 1) {\\r\\n var alarm = 'BATL';\\r\\n }\\r\\n //Overspeed\\r\\n else if ((alarmCodeInt & 2) == 2) {\\r\\n var alarm = 'ALSP';\\r\\n }\\r\\n //Fall\\r\\n else if ((alarmCodeInt & 4) == 4) {\\r\\n var alarm = 'ALF';\\r\\n }\\r\\n //Tilt\\r\\n else if ((alarmCodeInt & 8) == 8) {\\r\\n var alarm = 'TLT';\\r\\n } else if ((alarmCodeInt & 16) == 16) {\\r\\n if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n var alarm = 'Geo1-IN';\\r\\n } else {\\r\\n var alarm = 'Geo1-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 32) == 32) {\\r\\n if ((alarmCodeInt & 33554432) == 33554432) {\\r\\n var alarm = 'Geo2-IN';\\r\\n } else {\\r\\n var alarm = 'Geo2-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 64) == 64) {\\r\\n if ((alarmCodeInt & 67108864) == 67108864) {\\r\\n var alarm = 'Geo3-IN';\\r\\n } else {\\r\\n var alarm = 'Geo3-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 128) == 128) {\\r\\n if ((alarmCodeInt & 134217728) == 134217728) {\\r\\n var alarm = 'Geo4-IN';\\r\\n } else {\\r\\n var alarm = 'Geo4-OUT';\\r\\n }\\r\\n }\\r\\n //Power Off\\r\\n else if ((alarmCodeInt & 256) == 256) {\\r\\n var alarm = 'PWRF';\\r\\n }\\r\\n //Power On\\r\\n else if ((alarmCodeInt & 512) == 512) {\\r\\n var alarm = 'PWRN';\\r\\n }\\r\\n //Motion\\r\\n else if ((alarmCodeInt & 1024) == 1024) {\\r\\n var alarm = 'ALMOV';\\r\\n }\\r\\n //No Motion\\r\\n else if ((alarmCodeInt & 2048) == 2048) {\\r\\n var alarm = 'ALNM';\\r\\n }\\r\\n //SOS\\r\\n else if ((alarmCodeInt & 4096) == 4096) {\\r\\n var alarm = 'ALSOS';\\r\\n } else if ((alarmCodeInt & 8192) == 8192) {\\r\\n var alarm = 'Side1';\\r\\n } else if ((alarmCodeInt & 16384) == 16384) {\\r\\n var alarm = 'Side2';\\r\\n }\\r\\n //Battery charging\\r\\n else if ((alarmCodeInt & 32768) == 32768) {\\r\\n var alarm = 'BATCN';\\r\\n }\\r\\n //Battery no charging\\r\\n else if ((alarmCodeInt & 65536) == 65536) {\\r\\n var alarm = 'BATCF';\\r\\n }\\r\\n //SOS Ending\\r\\n // Temporary Commented until we know exactly how it works. 22/09/2022\\r\\n else if ((alarmCodeInt & 131072) == 131072) {\\r\\n var alarm = 'ALA-F';\\r\\n info = 'Alarm Finished';\\r\\n }\\r\\n //Amber Alert EC03 only\\r\\n else if ((alarmCodeInt & 262144) == 262144) {\\r\\n var alarm = 'ALA';\\r\\n }\\r\\n // welfare Alert check-in ALA-O\\r\\n else if ((alarmCodeInt & 524288) == 524288) {\\r\\n var alarm = 'ALA-O';\\r\\n }\\r\\n // Amber alert Ending ALA-C\\r\\n else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n var alarm = 'ALA-C';\\r\\n }\\r\\n // Amber alert Ending ALA-C\\r\\n //else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n // var alarm = 'ALA-C';\\r\\n //}\\r\\n // Fall-Down Alert ending\\r\\n else if ((alarmCodeInt & 2097152) == 2097152) {\\r\\n var alarm = 'ALF-C';\\r\\n }\\r\\n // welfare Alert Ending ALA\\r\\n else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n var alarm = 'ALA';\\r\\n }\\r\\n // Beacon absent Alert 11/10/22. Need to be added in msg types\\r\\n //else if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n // var alarm = 'BEA';\\r\\n //}\\r\\n general += 'alarm:' + alarm + ',';\\r\\n break;\\r\\n //Custom ID\\r\\n case '03':\\r\\n customID = value;\\r\\n if (!allowedCID.includes(value)) {\\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 //<>,<>,<>,<>,<>\\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 if (!allowedCID.includes(customID)) {\\r\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n AddValue(codeValues, \\\"customID\\\", customID);\\r\\n return\\r\\n }\\r\\n if (statusDevice) {\\r\\n messageForReceiver = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n }\\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;\\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 }\\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 = 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 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 var rawlabel = 'steps';\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=${rawlabel}`);\\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 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 var rawlabel = 'bpm';\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=${rawlabel}`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n }\\r\\n break;\\r\\n // SPO2\\r\\n case '41':\\r\\n var numSPO = (keyLength - 2) / 12;\\r\\n for (let j = 0; j < numSPO; 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 SPOHex = value.substring(8, 10);\\r\\n var SPO = hexToDecimal(SPOHex);\\r\\n var trustLevelHex = value.substring(10, 12);\\r\\n var trustLevel = hexToDecimal(trustLevelHex);\\r\\n info = SPO;\\r\\n //var alarmCode = 'True';\\r\\n var alarm = 'SPO2';\\r\\n general += ' SPO2 rate' + j + ':' + SPO + ',';\\r\\n var rawlabel = '%';\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};SPO2=${info};TLEVEL=${trustLevel};LABEL=${rawlabel}`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n }\\r\\n break;\\r\\n //BLE Connected . For Flic button\\r\\n case '62':\\r\\n location_type = 'BLE';\\r\\n //var alarm = 'EBZI'; \\r\\n //var latitudeHex = '00';\\r\\n //var longitudeHex = '00';\\r\\n //var descr = 'empty';\\r\\n var flag = hexToDecimal(value.substring(0, 2)); // 0= Disconnected, 1= Connected\\r\\n var mac = value.substring(2, 14); // No hace falta darle la vuelta\\r\\n // add : format in MAC\\r\\n mac = mac.match(/.{1,2}/g).join(':');\\r\\n var batLevel = hexToDecimal(value.substring(14, 16)); // 0-100\\r\\n //location_time = timestamp;\\r\\n ble_data = `${flag},${batLevel},${mac}`;\\r\\n general += 'BLE location (State):' + flag + ', (bat):' + batLevel + ', (mac):' + mac + ',';\\r\\n break;\\r\\n }\\r\\n }\\r\\n if (alarmCode) {\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch;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 = (`Watch;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': // Ringer Volume\\r\\n var volume = hexToDecimal(value);\\r\\n imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;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 = (`Watch;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 '0F': // Enable control.... Used for STEP COUNTING SETTINGS\\r\\n // 'FF FF 21 80'\\r\\n var StepStatus = hex2bin(value.substring(4, 6));\\r\\n var enalbleDisable = '';\\r\\n if (StepStatus.substring(7, 8) == '1') {\\r\\n var step = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var step = 'Disable, '\\r\\n };\\r\\n //var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n //hrate += detectingInterval;\\r\\n AddValue(codeValues, \\\"step\\\", step);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadStepsSettings.EnableDisableReadStepsSettings, enalbleDisable);\\r\\n //AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadStepsSettings.EnableDisableReadStepsSettings);\\r\\n //configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\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 = (`Watch;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 '34': //ContactList with name\\r\\n var contactNumber = value.substring(1, 2);\\r\\n var telLength = hexToDecimal(value.substring(2, 4));\\r\\n var tel = '';\\r\\n switch (contactNumber) {\\r\\n // Emergency Number\\r\\n case '0':\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n break;\\r\\n // Speed Dial Number\\r\\n //case '1':\\r\\n // tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n // AddValue(codeValues, \\\"SpeedDialNumber\\\", tel);\\r\\n // AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.SpeedDialNumber, tel);\\r\\n // configsToAck.push(configIds.ReadSpeedDialSettings.SpeedDialNumber);\\r\\n // break;\\r\\n // Gateway Number\\r\\n case '9': //00447781482635,Esendex UK 0034627177148,Esendex Spain 00447507288240,Esendex UK Acceptance\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n if (tel.includes('447781482635') || tel.includes('00447781482635')) {\\r\\n tel = 'Esendex UK'\\r\\n } else if (tel.includes('34627177148') || tel.includes('0034627177148')) {\\r\\n tel = 'Esendex Spain'\\r\\n } else if (tel.includes('447507288240') || tel.includes('00447507288240')) {\\r\\n tel = 'Esendex UK Acceptance'\\r\\n } else {\\r\\n tel = 'Default'\\r\\n }\\r\\n AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n break;\\r\\n default:\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n if (tel.length < 6) {\\r\\n contacts += '';\\r\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n break;\\r\\n }\\r\\n //contacts += 'A' + (contactNumber - 1) + ': ' + tel + ', ';\\r\\n contacts += tel + ', ';\\r\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n break;\\r\\n }\\r\\n break;\\r\\n case '40': // APN\\r\\n //no ACK need\\r\\n AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'));\\r\\n configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\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 = (`Watch;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 = (`Watch;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 '46': //HeartRate\\r\\n // '10 0E 00 80'\\r\\n var HeartRateStatus = hex2bin(value.substring(6, 8));\\r\\n var enalbleDisable = '';\\r\\n if (HeartRateStatus.substring(0, 1) == '1') {\\r\\n var hrate = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var hrate = 'Disable, '\\r\\n };\\r\\n var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n hrate += detectingInterval;\\r\\n AddValue(codeValues, \\\"hrate\\\", hrate);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings);\\r\\n configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\r\\n break;\\r\\n case '47': // Custom Id\\r\\n imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;ACK-CUSTID;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"customeid\\\", value);\\r\\n AddValue(configsToUpdate, configIds.ReadState.CustomId, hex_to_ascii(value)); //now it comes \\\"3036\\\"\\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 // commented until Eview fixes this function\\r\\n /*\\r\\n messageForReceiver = (`Watch;ACK-NOMOTION;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"nomotion\\\", alertSetting);\\r\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings, enableDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n configsToAck.push(configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings);\\r\\n configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n */\\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 = (`Watch;ACK-FALLALERT;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n var sesibityOptionValue = hexToDecimal(value.substring(1, 2));\\r\\n sensibility += sesibityOptionValue;\\r\\n AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n //AddValue(configsToUpdate, configIds.ReadAlertSettings.FallSettings, sensibility);\\r\\n AddValue(configsToUpdate, configIds.ReadFallSettings.EnableDisableFallSettings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadFallSettings.Sensitivity, sesibityOptionValue);\\r\\n //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n configsToAck.push(configIds.ReadFallSettings.EnableDisableFallSettings);\\r\\n configsToAck.push(configIds.ReadFallSettings.Sensitivity);\\r\\n break;\\r\\n case '73': //BeaconList\\r\\n var beaconNumber = hexToDecimal(value.substring(1, 2));\\r\\n var beaconStatus = hex2bin(value.substring(0, 1));\\r\\n beaconStatus = hex_to_ascii(value.substring(30, value.length));\\r\\n //beaconStatus = changeEndianness(value.substring(30, value.length));\\r\\n //homeBeacon += 'B' + (beaconNumber + 1) + ': ' + beaconStatus + ', ';\\r\\n homeBeacon += beaconStatus + ', ';\\r\\n AddValue(codeValues, \\\"homeBeacon\\\", homeBeacon);\\r\\n messageForReceiver = (`Watch;ACK-GDATA;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n break;\\r\\n case '4A': //Wifi Network List\\r\\n var wifiSSIDLenght = hexToDecimal(value.substring(2, 4));\\r\\n var wifiPasswordLenght = hexToDecimal(value.substring(4, 6));\\r\\n var wifiIndex = hexToDecimal(value.substring(1, 2));\\r\\n //var wifiStatus = hexToDecimal(value.substring(0, 1));\\r\\n var wifiStatus = value.substring(0, 1);\\r\\n /*var enalbleDisable = wifiSSID = wifiPassword = homeWifi = '';\\r\\n /var homeWifi = '';\\r\\n if (wifiIndex == '0') { // Only first Wifi of the list\\r\\n if (wifiStatus == '8') {\\r\\n homeWifi += ' Enable, '\\r\\n enalbleDisable = '1';\\r\\n } else {\\r\\n homeWifi += ' Disable, '\\r\\n //enalbleDisable = '0';\\r\\n };*/\\r\\n if ((wifiStatus == '8') || (wifiStatus == 'C')) { // 8 == ON OR C== ON and Connected\\r\\n var wifiSSID = hex_to_ascii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\r\\n var wifiPassword = hex_to_ascii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\r\\n var imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;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 = (`Watch;ACK-SPEED;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"speed\\\", alertSetting);\\r\\n AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\r\\n configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n break;\\r\\n case '7A': //[Length]:05 [Key]:7A [Value]:60 54 00 80\\r\\n // {\\\"spo2Interval\\\":{\\\"interval\\\":21600,\\\"status\\\":1}}\\r\\n var SPOStatus = hex2bin(value.substring(6, 8));\\r\\n var enalbleDisable = '';\\r\\n if (SPOStatus.substring(0, 1) == '1') {\\r\\n var spo = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var spo = 'Disable, '\\r\\n };\\r\\n var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n spo += detectingInterval;\\r\\n AddValue(codeValues, \\\"SPO2\\\", spo);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadSPO2Settings.EnableDisableReadSPO2Settings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadSPO2Settings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadSPO2Settings.EnableDisableReadSPO2Settings);\\r\\n configsToAck.push(configIds.ReadSPO2Settings.ReportingFrequency);\\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 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 = (`Watch-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 = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch-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 if (typeof configIds !== 'undefined' && configIds && configIds.ConfigureDevice && configIds.ConfigureDevice.LastConfigured) { // when is defined\\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 }\\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(hex) { // Hex to Ascii \\r\\n if (hex.length % 2 !== 0) {\\r\\n throw new Error(\\\"Hex string length must be even\\\");\\r\\n }\\r\\n let ascii = '';\\r\\n for (let i = 0; i < hex.length; i += 2) {\\r\\n const byte = hex.substr(i, 2);\\r\\n const charCode = parseInt(byte, 16);\\r\\n if (charCode !== 0) { // remove null character (\\\\u0000)\\r\\n ascii += String.fromCharCode(charCode);\\r\\n }\\r\\n }\\r\\n return ascii;\\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 normalizeLabels(raw) { // output labels as array\\r\\n if (!raw) return [];\\r\\n return [String(raw)];\\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}\\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":1765522431},{"Type":1,"NewValue":"{\"Id\":437,\"Name\":\"Access TEC Care Watch\",\"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 // Watch protocol - please see variables and typical values in order below\\r\\n // Watch-CYC;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;SIGNAL=<>;WM=<>;GENERAL=<>\\r\\n // Watch-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\r\\n //\\r\\n // Author: Juanmi Navarro\\r\\n // Created: 01/01/0000\\r\\n // Last modified: 18/09/2025\\r\\n //\\r\\n ///////////////////////////////////////////////////////////////////////////////\\r\\n if (typeof localTesting === \\\"undefined\\\") {\\r\\n let localTesting = false;\\r\\n }\\r\\n const crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,\\r\\n 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,\\r\\n 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,\\r\\n 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,\\r\\n 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,\\r\\n 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,\\r\\n 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,\\r\\n 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,\\r\\n 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,\\r\\n 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,\\r\\n 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,\\r\\n 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,\\r\\n 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,\\r\\n 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,\\r\\n 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,\\r\\n 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,\\r\\n 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,\\r\\n 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,\\r\\n 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,\\r\\n 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,\\r\\n 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,\\r\\n 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n ];\\r\\n var codeValues = [];\\r\\n AddValue(codeValues, \\\"protocol_template\\\", \\\"Watch\\\");\\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 = (`Watch-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 var allowedCID = ['3036', '06'];\\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 } else if (oystaTemplate == 'True') { // Oysta Template \\r\\n AddValue(codeValues, \\\"rawMsg\\\", raw);\\r\\n if ((params.rawlabel) && (params.rawlabel !== '')) { // decode label if exists\\r\\n var labels = normalizeLabels(params.rawlabel); // \\\"steps\\\" -> [\\\"steps\\\"]\\r\\n AddValue(codeValues, \\\"oysta_labels\\\", labels);\\r\\n //AddValue(codeValues, \\\"oysta_labels\\\", params.rawlabel);\\r\\n }\\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 //<>,<>,<> \\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];\\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 //<>,<>,<> \\r\\n if (mac2) {\\r\\n AddValue(codeValues, 'beacon_mac', mac2);\\r\\n var simpleQuery2 = [{\\r\\n 'code': 'Mac',\\r\\n 'value': mac2,\\r\\n }];\\r\\n var simpleQueryLabel2 = {\\r\\n 'table': 'beacons',\\r\\n 'select': 'Name',\\r\\n 'query': simpleQuery2\\r\\n };\\r\\n var labels2 = [];\\r\\n labels2.push(JSON.stringify(simpleQueryLabel2));\\r\\n AddValue(codeValues, 'oysta_labels', JSON.stringify(labels2));\\r\\n }\\r\\n if (params.beacon_major) {\\r\\n AddValue(codeValues, 'beacon_major', params.beacon_major);\\r\\n } else {\\r\\n AddValue(codeValues, 'beacon_major', 0);\\r\\n }\\r\\n if (params.beacon_minor) {\\r\\n AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\r\\n } else {\\r\\n AddValue(codeValues, 'beacon_minor', 0);\\r\\n }\\r\\n //AddValue(codeValues,'oysta_labels', label);\\r\\n //AddValue(codeValues,'oysta_value', mac);\\r\\n }\\r\\n /* meter mas tarde... \\r\\n if (params.smart_data !== 'undefined') {\\r\\n var gen_location = params.smart_data.split(',')\\r\\n var latitude = gen_location[0]\\r\\n var longitude = gen_location[1]\\r\\n var location_accuracy = gen_location[2]\\r\\n var altitude = gen_location[3]\\r\\n AddValue(codeValues,'latitude', latitude);\\r\\n AddValue(codeValues,'longitude', longitude);\\r\\n AddValue(codeValues,'altitude', altitude);\\r\\n AddValue(codeValues,'location_accuracy', location_accuracy);\\r\\n }\\r\\n */\\r\\n /*else if ((params.event_time) && (params.event_time == '')) {\\r\\n var event_time = moment.utc().unix();\\r\\n AddValue(codeValues,'event_time', event_time);\\r\\n } revisar mas adelante*/\\r\\n if (params.location_time) {\\r\\n AddValue(codeValues, 'location_time', params.location_time);\\r\\n }\\r\\n if (params.event_time) {\\r\\n AddValue(codeValues, 'event_time', params.event_time);\\r\\n }\\r\\n // to parse SMS info from the device\\r\\n switch (messageTypeLocalCode) {\\r\\n case 'COMM-SMS': // SMS message sent in\\r\\n if (params.data.startsWith('Device location request')) {\\r\\n configsToAck.push(configIds.Controls.RealTimeLocate);\\r\\n } else if (params.data.startsWith('Set IP ok')) {\\r\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n } else if (params.data.startsWith('IMEI:')) {\\r\\n configsToAck.push(configIds.Controls.GetFirmwareVersion);\\r\\n } else if (params.data.startsWith('Set IP ok')) {\\r\\n configsToAck.push(configIds.Controls.ClearBufferedMessages);\\r\\n } else if (params.data.startsWith('flush ok')) {\\r\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n } else if (params.data.startsWith('Set Watch-')) {\\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 = (`Watch-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 = (`Watch;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 = (`Watch;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 = (`Watch-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(JSON.stringify(dataToReceiver));\\r\\n // return the object that contains your data\\r\\n return dataToReceiver;\\r\\n // end of main operation\\r\\n // define functions used in operation\\r\\n // decode global msg\\r\\n function decoder(str) { // decode rawdata\\r\\n // CARE Decoder\\r\\n //AddValue(codeValues, 'Message : ', str);\\r\\n var message = str;\\r\\n var index = 18;\\r\\n //parse header & properties\\r\\n var properties = message.substring(2, 4);\\r\\n var lengthLittleEndian = message.substring(4, 8);\\r\\n var total_length = lengthLittleEndian.substring(2, 4) + lengthLittleEndian.substring(0, 2);\\r\\n total_length = 2 * hexToDecimal(total_length.substring(0, 4));\\r\\n var sequenceID = message.substring(12, 16);\\r\\n var command = message.substring(16, 18);\\r\\n //mask bitwise (properties should be '10')\\r\\n if ((parseInt(properties) & 8) == 8) {\\r\\n needsAck = true;\\r\\n } else needsAck = false;\\r\\n // need to check if checksum is correct for possible msg corruption 10/03/23\\r\\n var checksum = message.substring(8, 12);\\r\\n var messageBody = message.substring(16, message.length);\\r\\n debug('message =' + message);\\r\\n debug('checksum =' + checksum);\\r\\n debug('calculateCheckSum =' + calculateCheckSum(messageBody));\\r\\n if (calculateCheckSum(messageBody) == checksum) { // payload is valid\\r\\n debug(\\\"message has valid checksum\\\");\\r\\n var messageBody = command; // update value for the ACK\\r\\n debug('command =' + command);\\r\\n if (command == '01') {\\r\\n while (index < total_length + 16) {\\r\\n 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\\r\\n if ((alarmCodeExtInt & 1) == 1) {\\r\\n var alarm = 'ALF-C';\\r\\n }\\r\\n // Welfare Check-out\\r\\n else if ((alarmCodeExtInt & 2) == 2) {\\r\\n var alarm = 'ALA-C';\\r\\n }\\r\\n // Standard Alerts\\r\\n //Battery low\\r\\n else if ((alarmCodeInt & 1) == 1) {\\r\\n var alarm = 'BATL';\\r\\n }\\r\\n //Overspeed\\r\\n else if ((alarmCodeInt & 2) == 2) {\\r\\n var alarm = 'ALSP';\\r\\n }\\r\\n //Fall\\r\\n else if ((alarmCodeInt & 4) == 4) {\\r\\n var alarm = 'ALF';\\r\\n }\\r\\n //Tilt\\r\\n else if ((alarmCodeInt & 8) == 8) {\\r\\n var alarm = 'TLT';\\r\\n } else if ((alarmCodeInt & 16) == 16) {\\r\\n if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n var alarm = 'Geo1-IN';\\r\\n } else {\\r\\n var alarm = 'Geo1-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 32) == 32) {\\r\\n if ((alarmCodeInt & 33554432) == 33554432) {\\r\\n var alarm = 'Geo2-IN';\\r\\n } else {\\r\\n var alarm = 'Geo2-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 64) == 64) {\\r\\n if ((alarmCodeInt & 67108864) == 67108864) {\\r\\n var alarm = 'Geo3-IN';\\r\\n } else {\\r\\n var alarm = 'Geo3-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 128) == 128) {\\r\\n if ((alarmCodeInt & 134217728) == 134217728) {\\r\\n var alarm = 'Geo4-IN';\\r\\n } else {\\r\\n var alarm = 'Geo4-OUT';\\r\\n }\\r\\n }\\r\\n //Power Off\\r\\n else if ((alarmCodeInt & 256) == 256) {\\r\\n var alarm = 'PWRF';\\r\\n }\\r\\n //Power On\\r\\n else if ((alarmCodeInt & 512) == 512) {\\r\\n var alarm = 'PWRN';\\r\\n }\\r\\n //Motion\\r\\n else if ((alarmCodeInt & 1024) == 1024) {\\r\\n var alarm = 'ALMOV';\\r\\n }\\r\\n //No Motion\\r\\n else if ((alarmCodeInt & 2048) == 2048) {\\r\\n var alarm = 'ALNM';\\r\\n }\\r\\n //SOS\\r\\n else if ((alarmCodeInt & 4096) == 4096) {\\r\\n var alarm = 'ALSOS';\\r\\n } else if ((alarmCodeInt & 8192) == 8192) {\\r\\n var alarm = 'Side1';\\r\\n } else if ((alarmCodeInt & 16384) == 16384) {\\r\\n var alarm = 'Side2';\\r\\n }\\r\\n //Battery charging\\r\\n else if ((alarmCodeInt & 32768) == 32768) {\\r\\n var alarm = 'BATCN';\\r\\n }\\r\\n //Battery no charging\\r\\n else if ((alarmCodeInt & 65536) == 65536) {\\r\\n var alarm = 'BATCF';\\r\\n }\\r\\n //SOS Ending\\r\\n // Temporary Commented until we know exactly how it works. 22/09/2022\\r\\n else if ((alarmCodeInt & 131072) == 131072) {\\r\\n var alarm = 'ALA-F';\\r\\n info = 'Alarm Finished';\\r\\n }\\r\\n //Amber Alert EC03 only\\r\\n else if ((alarmCodeInt & 262144) == 262144) {\\r\\n var alarm = 'ALA';\\r\\n }\\r\\n // welfare Alert check-in ALA-O\\r\\n else if ((alarmCodeInt & 524288) == 524288) {\\r\\n var alarm = 'ALA-O';\\r\\n }\\r\\n // Amber alert Ending ALA-C\\r\\n else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n var alarm = 'ALA-C';\\r\\n }\\r\\n // Amber alert Ending ALA-C\\r\\n //else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n // var alarm = 'ALA-C';\\r\\n //}\\r\\n // Fall-Down Alert ending\\r\\n else if ((alarmCodeInt & 2097152) == 2097152) {\\r\\n var alarm = 'ALF-C';\\r\\n }\\r\\n // welfare Alert Ending ALA\\r\\n else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n var alarm = 'ALA';\\r\\n }\\r\\n // Beacon absent Alert 11/10/22. Need to be added in msg types\\r\\n //else if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n // var alarm = 'BEA';\\r\\n //}\\r\\n general += 'alarm:' + alarm + ',';\\r\\n break;\\r\\n //Custom ID\\r\\n case '03':\\r\\n customID = value;\\r\\n if (!allowedCID.includes(value)) {\\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 //<>,<>,<>,<>,<>\\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 if (!allowedCID.includes(customID)) {\\r\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n AddValue(codeValues, \\\"customID\\\", customID);\\r\\n return\\r\\n }\\r\\n if (statusDevice) {\\r\\n messageForReceiver = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n }\\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;\\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 }\\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 = 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 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 var rawlabel = 'steps';\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=${rawlabel}`);\\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 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 var rawlabel = 'bpm';\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=${rawlabel}`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n }\\r\\n break;\\r\\n // SPO2\\r\\n case '41':\\r\\n var numSPO = (keyLength - 2) / 12;\\r\\n for (let j = 0; j < numSPO; 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 SPOHex = value.substring(8, 10);\\r\\n var SPO = hexToDecimal(SPOHex);\\r\\n var trustLevelHex = value.substring(10, 12);\\r\\n var trustLevel = hexToDecimal(trustLevelHex);\\r\\n info = SPO;\\r\\n //var alarmCode = 'True';\\r\\n var alarm = 'SPO2';\\r\\n general += ' SPO2 rate' + j + ':' + SPO + ',';\\r\\n var rawlabel = '%';\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};SPO2=${info};TLEVEL=${trustLevel};LABEL=${rawlabel}`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n }\\r\\n break;\\r\\n //BLE Connected . For Flic button\\r\\n case '62':\\r\\n location_type = 'BLE';\\r\\n //var alarm = 'EBZI'; \\r\\n //var latitudeHex = '00';\\r\\n //var longitudeHex = '00';\\r\\n //var descr = 'empty';\\r\\n var flag = hexToDecimal(value.substring(0, 2)); // 0= Disconnected, 1= Connected\\r\\n var mac = value.substring(2, 14); // No hace falta darle la vuelta\\r\\n // add : format in MAC\\r\\n mac = mac.match(/.{1,2}/g).join(':');\\r\\n var batLevel = hexToDecimal(value.substring(14, 16)); // 0-100\\r\\n //location_time = timestamp;\\r\\n ble_data = `${flag},${batLevel},${mac}`;\\r\\n general += 'BLE location (State):' + flag + ', (bat):' + batLevel + ', (mac):' + mac + ',';\\r\\n break;\\r\\n }\\r\\n }\\r\\n if (alarmCode) {\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch;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 = (`Watch;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': // Ringer Volume\\r\\n var volume = hexToDecimal(value);\\r\\n imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;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 = (`Watch;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 '0F': // Enable control.... Used for STEP COUNTING SETTINGS\\r\\n // 'FF FF 21 80'\\r\\n var StepStatus = hex2bin(value.substring(4, 6));\\r\\n var enalbleDisable = '';\\r\\n if (StepStatus.substring(7, 8) == '1') {\\r\\n var step = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var step = 'Disable, '\\r\\n };\\r\\n //var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n //hrate += detectingInterval;\\r\\n AddValue(codeValues, \\\"step\\\", step);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadStepsSettings.EnableDisableReadStepsSettings, enalbleDisable);\\r\\n //AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadStepsSettings.EnableDisableReadStepsSettings);\\r\\n //configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\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 = (`Watch;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 '34': //ContactList with name\\r\\n var contactNumber = value.substring(1, 2);\\r\\n var telLength = hexToDecimal(value.substring(2, 4));\\r\\n var tel = '';\\r\\n switch (contactNumber) {\\r\\n // Emergency Number\\r\\n case '0':\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n break;\\r\\n // Speed Dial Number\\r\\n //case '1':\\r\\n // tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n // AddValue(codeValues, \\\"SpeedDialNumber\\\", tel);\\r\\n // AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.SpeedDialNumber, tel);\\r\\n // configsToAck.push(configIds.ReadSpeedDialSettings.SpeedDialNumber);\\r\\n // break;\\r\\n // Gateway Number\\r\\n case '9': //00447781482635,Esendex UK 0034627177148,Esendex Spain 00447507288240,Esendex UK Acceptance\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n if (tel.includes('447781482635') || tel.includes('00447781482635')) {\\r\\n tel = 'Esendex UK'\\r\\n } else if (tel.includes('34627177148') || tel.includes('0034627177148')) {\\r\\n tel = 'Esendex Spain'\\r\\n } else if (tel.includes('447507288240') || tel.includes('00447507288240')) {\\r\\n tel = 'Esendex UK Acceptance'\\r\\n } else {\\r\\n tel = 'Default'\\r\\n }\\r\\n AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n break;\\r\\n default:\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n if (tel.length < 6) {\\r\\n contacts += '';\\r\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n break;\\r\\n }\\r\\n //contacts += 'A' + (contactNumber - 1) + ': ' + tel + ', ';\\r\\n contacts += tel + ', ';\\r\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n break;\\r\\n }\\r\\n break;\\r\\n case '40': // APN\\r\\n //no ACK need\\r\\n AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'));\\r\\n configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\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 = (`Watch;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 = (`Watch;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 '46': //HeartRate\\r\\n // '10 0E 00 80'\\r\\n var HeartRateStatus = hex2bin(value.substring(6, 8));\\r\\n var enalbleDisable = '';\\r\\n if (HeartRateStatus.substring(0, 1) == '1') {\\r\\n var hrate = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var hrate = 'Disable, '\\r\\n };\\r\\n var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n hrate += detectingInterval;\\r\\n AddValue(codeValues, \\\"hrate\\\", hrate);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings);\\r\\n configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\r\\n break;\\r\\n case '47': // Custom Id\\r\\n imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;ACK-CUSTID;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"customeid\\\", value);\\r\\n AddValue(configsToUpdate, configIds.ReadState.CustomId, hex_to_ascii(value)); //now it comes \\\"3036\\\"\\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 // commented until Eview fixes this function\\r\\n /*\\r\\n messageForReceiver = (`Watch;ACK-NOMOTION;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"nomotion\\\", alertSetting);\\r\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings, enableDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n configsToAck.push(configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings);\\r\\n configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n */\\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 = (`Watch;ACK-FALLALERT;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n var sesibityOptionValue = hexToDecimal(value.substring(1, 2));\\r\\n sensibility += sesibityOptionValue;\\r\\n AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n //AddValue(configsToUpdate, configIds.ReadAlertSettings.FallSettings, sensibility);\\r\\n AddValue(configsToUpdate, configIds.ReadFallSettings.EnableDisableFallSettings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadFallSettings.Sensitivity, sesibityOptionValue);\\r\\n //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n configsToAck.push(configIds.ReadFallSettings.EnableDisableFallSettings);\\r\\n configsToAck.push(configIds.ReadFallSettings.Sensitivity);\\r\\n break;\\r\\n case '73': //BeaconList\\r\\n var beaconNumber = hexToDecimal(value.substring(1, 2));\\r\\n var beaconStatus = hex2bin(value.substring(0, 1));\\r\\n beaconStatus = hex_to_ascii(value.substring(30, value.length));\\r\\n //beaconStatus = changeEndianness(value.substring(30, value.length));\\r\\n //homeBeacon += 'B' + (beaconNumber + 1) + ': ' + beaconStatus + ', ';\\r\\n homeBeacon += beaconStatus + ', ';\\r\\n AddValue(codeValues, \\\"homeBeacon\\\", homeBeacon);\\r\\n messageForReceiver = (`Watch;ACK-GDATA;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n break;\\r\\n case '4A': //Wifi Network List\\r\\n var wifiSSIDLenght = hexToDecimal(value.substring(2, 4));\\r\\n var wifiPasswordLenght = hexToDecimal(value.substring(4, 6));\\r\\n var wifiIndex = hexToDecimal(value.substring(1, 2));\\r\\n //var wifiStatus = hexToDecimal(value.substring(0, 1));\\r\\n var wifiStatus = value.substring(0, 1);\\r\\n /*var enalbleDisable = wifiSSID = wifiPassword = homeWifi = '';\\r\\n /var homeWifi = '';\\r\\n if (wifiIndex == '0') { // Only first Wifi of the list\\r\\n if (wifiStatus == '8') {\\r\\n homeWifi += ' Enable, '\\r\\n enalbleDisable = '1';\\r\\n } else {\\r\\n homeWifi += ' Disable, '\\r\\n //enalbleDisable = '0';\\r\\n };*/\\r\\n if ((wifiStatus == '8') || (wifiStatus == 'C')) { // 8 == ON OR C== ON and Connected\\r\\n var wifiSSID = hex_to_ascii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\r\\n var wifiPassword = hex_to_ascii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\r\\n var imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;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 = (`Watch;ACK-SPEED;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"speed\\\", alertSetting);\\r\\n AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\r\\n configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n break;\\r\\n case '7A': //[Length]:05 [Key]:7A [Value]:60 54 00 80\\r\\n // {\\\"spo2Interval\\\":{\\\"interval\\\":21600,\\\"status\\\":1}}\\r\\n var SPOStatus = hex2bin(value.substring(6, 8));\\r\\n var enalbleDisable = '';\\r\\n if (SPOStatus.substring(0, 1) == '1') {\\r\\n var spo = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var spo = 'Disable, '\\r\\n };\\r\\n var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n spo += detectingInterval;\\r\\n AddValue(codeValues, \\\"SPO2\\\", spo);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadSPO2Settings.EnableDisableReadSPO2Settings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadSPO2Settings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadSPO2Settings.EnableDisableReadSPO2Settings);\\r\\n configsToAck.push(configIds.ReadSPO2Settings.ReportingFrequency);\\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 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 = (`Watch-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 = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch-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 if (typeof configIds !== 'undefined' && configIds && configIds.ConfigureDevice && configIds.ConfigureDevice.LastConfigured) { // when is defined\\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 }\\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(hex) { // Hex to Ascii \\r\\n if (hex.length % 2 !== 0) {\\r\\n throw new Error(\\\"Hex string length must be even\\\");\\r\\n }\\r\\n let ascii = '';\\r\\n for (let i = 0; i < hex.length; i += 2) {\\r\\n const byte = hex.substr(i, 2);\\r\\n const charCode = parseInt(byte, 16);\\r\\n if (charCode !== 0) { // remove null character (\\\\u0000)\\r\\n ascii += String.fromCharCode(charCode);\\r\\n }\\r\\n }\\r\\n return ascii;\\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 normalizeLabels(raw) { // output labels as array\\r\\n if (!raw) return [];\\r\\n return [String(raw)];\\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}\\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":1765522901},{"Type":1,"NewValue":"{\"Id\":437,\"Name\":\"Access TEC Care Watch\",\"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 // Watch protocol - please see variables and typical values in order below\\r\\n // Watch-CYC;<>;STATUS=<>;LTIME=<>;ETIME=<>;BATP=<>;LGPS=<>;LWIF=<>;LLBS=<>;LBEACON=<>;BLE=<>;SIGNAL=<>;WM=<>;GENERAL=<>\\r\\n // Watch-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\r\\n //\\r\\n // Author: Juanmi Navarro\\r\\n // Created: 01/01/0000\\r\\n // Last modified: 18/09/2025\\r\\n //\\r\\n ///////////////////////////////////////////////////////////////////////////////\\r\\n if (typeof localTesting === \\\"undefined\\\") {\\r\\n let localTesting = false;\\r\\n }\\r\\n const crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,\\r\\n 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,\\r\\n 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,\\r\\n 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,\\r\\n 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,\\r\\n 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,\\r\\n 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,\\r\\n 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,\\r\\n 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,\\r\\n 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,\\r\\n 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,\\r\\n 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,\\r\\n 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,\\r\\n 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,\\r\\n 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,\\r\\n 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,\\r\\n 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,\\r\\n 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,\\r\\n 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,\\r\\n 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,\\r\\n 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,\\r\\n 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n ];\\r\\n var codeValues = [];\\r\\n AddValue(codeValues, \\\"protocol_template\\\", \\\"Watch\\\");\\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 = (`Watch-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 var allowedCID = ['3036', '06'];\\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 } else if (oystaTemplate == 'True') { // Oysta Template \\r\\n AddValue(codeValues, \\\"rawMsg\\\", raw);\\r\\n if ((params.rawlabel) && (params.rawlabel !== '')) { // decode label if exists\\r\\n //var labels = normalizeLabels(params.rawlabel); // \\\"steps\\\" -> [\\\"steps\\\"]\\r\\n //AddValue(codeValues, \\\"oysta_labels\\\", labels);\\r\\n AddValue(codeValues, \\\"oysta_labels\\\", params.rawlabel);\\r\\n }\\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 //<>,<>,<> \\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];\\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 //<>,<>,<> \\r\\n if (mac2) {\\r\\n AddValue(codeValues, 'beacon_mac', mac2);\\r\\n var simpleQuery2 = [{\\r\\n 'code': 'Mac',\\r\\n 'value': mac2,\\r\\n }];\\r\\n var simpleQueryLabel2 = {\\r\\n 'table': 'beacons',\\r\\n 'select': 'Name',\\r\\n 'query': simpleQuery2\\r\\n };\\r\\n var labels2 = [];\\r\\n labels2.push(JSON.stringify(simpleQueryLabel2));\\r\\n AddValue(codeValues, 'oysta_labels', JSON.stringify(labels2));\\r\\n }\\r\\n if (params.beacon_major) {\\r\\n AddValue(codeValues, 'beacon_major', params.beacon_major);\\r\\n } else {\\r\\n AddValue(codeValues, 'beacon_major', 0);\\r\\n }\\r\\n if (params.beacon_minor) {\\r\\n AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\r\\n } else {\\r\\n AddValue(codeValues, 'beacon_minor', 0);\\r\\n }\\r\\n //AddValue(codeValues,'oysta_labels', label);\\r\\n //AddValue(codeValues,'oysta_value', mac);\\r\\n }\\r\\n /* meter mas tarde... \\r\\n if (params.smart_data !== 'undefined') {\\r\\n var gen_location = params.smart_data.split(',')\\r\\n var latitude = gen_location[0]\\r\\n var longitude = gen_location[1]\\r\\n var location_accuracy = gen_location[2]\\r\\n var altitude = gen_location[3]\\r\\n AddValue(codeValues,'latitude', latitude);\\r\\n AddValue(codeValues,'longitude', longitude);\\r\\n AddValue(codeValues,'altitude', altitude);\\r\\n AddValue(codeValues,'location_accuracy', location_accuracy);\\r\\n }\\r\\n */\\r\\n /*else if ((params.event_time) && (params.event_time == '')) {\\r\\n var event_time = moment.utc().unix();\\r\\n AddValue(codeValues,'event_time', event_time);\\r\\n } revisar mas adelante*/\\r\\n if (params.location_time) {\\r\\n AddValue(codeValues, 'location_time', params.location_time);\\r\\n }\\r\\n if (params.event_time) {\\r\\n AddValue(codeValues, 'event_time', params.event_time);\\r\\n }\\r\\n // to parse SMS info from the device\\r\\n switch (messageTypeLocalCode) {\\r\\n case 'COMM-SMS': // SMS message sent in\\r\\n if (params.data.startsWith('Device location request')) {\\r\\n configsToAck.push(configIds.Controls.RealTimeLocate);\\r\\n } else if (params.data.startsWith('Set IP ok')) {\\r\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n } else if (params.data.startsWith('IMEI:')) {\\r\\n configsToAck.push(configIds.Controls.GetFirmwareVersion);\\r\\n } else if (params.data.startsWith('Set IP ok')) {\\r\\n configsToAck.push(configIds.Controls.ClearBufferedMessages);\\r\\n } else if (params.data.startsWith('flush ok')) {\\r\\n configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n } else if (params.data.startsWith('Set Watch-')) {\\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 = (`Watch-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 = (`Watch;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 = (`Watch;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 = (`Watch-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 // console.log(JSON.stringify(dataToReceiver));\\r\\n // return the object that contains your data\\r\\n return dataToReceiver;\\r\\n // end of main operation\\r\\n // define functions used in operation\\r\\n // decode global msg\\r\\n function decoder(str) { // decode rawdata\\r\\n // CARE Decoder\\r\\n //AddValue(codeValues, 'Message : ', str);\\r\\n var message = str;\\r\\n var index = 18;\\r\\n //parse header & properties\\r\\n var properties = message.substring(2, 4);\\r\\n var lengthLittleEndian = message.substring(4, 8);\\r\\n var total_length = lengthLittleEndian.substring(2, 4) + lengthLittleEndian.substring(0, 2);\\r\\n total_length = 2 * hexToDecimal(total_length.substring(0, 4));\\r\\n var sequenceID = message.substring(12, 16);\\r\\n var command = message.substring(16, 18);\\r\\n //mask bitwise (properties should be '10')\\r\\n if ((parseInt(properties) & 8) == 8) {\\r\\n needsAck = true;\\r\\n } else needsAck = false;\\r\\n // need to check if checksum is correct for possible msg corruption 10/03/23\\r\\n var checksum = message.substring(8, 12);\\r\\n var messageBody = message.substring(16, message.length);\\r\\n debug('message =' + message);\\r\\n debug('checksum =' + checksum);\\r\\n debug('calculateCheckSum =' + calculateCheckSum(messageBody));\\r\\n if (calculateCheckSum(messageBody) == checksum) { // payload is valid\\r\\n debug(\\\"message has valid checksum\\\");\\r\\n var messageBody = command; // update value for the ACK\\r\\n debug('command =' + command);\\r\\n if (command == '01') {\\r\\n while (index < total_length + 16) {\\r\\n 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\\r\\n if ((alarmCodeExtInt & 1) == 1) {\\r\\n var alarm = 'ALF-C';\\r\\n }\\r\\n // Welfare Check-out\\r\\n else if ((alarmCodeExtInt & 2) == 2) {\\r\\n var alarm = 'ALA-C';\\r\\n }\\r\\n // Standard Alerts\\r\\n //Battery low\\r\\n else if ((alarmCodeInt & 1) == 1) {\\r\\n var alarm = 'BATL';\\r\\n }\\r\\n //Overspeed\\r\\n else if ((alarmCodeInt & 2) == 2) {\\r\\n var alarm = 'ALSP';\\r\\n }\\r\\n //Fall\\r\\n else if ((alarmCodeInt & 4) == 4) {\\r\\n var alarm = 'ALF';\\r\\n }\\r\\n //Tilt\\r\\n else if ((alarmCodeInt & 8) == 8) {\\r\\n var alarm = 'TLT';\\r\\n } else if ((alarmCodeInt & 16) == 16) {\\r\\n if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n var alarm = 'Geo1-IN';\\r\\n } else {\\r\\n var alarm = 'Geo1-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 32) == 32) {\\r\\n if ((alarmCodeInt & 33554432) == 33554432) {\\r\\n var alarm = 'Geo2-IN';\\r\\n } else {\\r\\n var alarm = 'Geo2-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 64) == 64) {\\r\\n if ((alarmCodeInt & 67108864) == 67108864) {\\r\\n var alarm = 'Geo3-IN';\\r\\n } else {\\r\\n var alarm = 'Geo3-OUT';\\r\\n }\\r\\n } else if ((alarmCodeInt & 128) == 128) {\\r\\n if ((alarmCodeInt & 134217728) == 134217728) {\\r\\n var alarm = 'Geo4-IN';\\r\\n } else {\\r\\n var alarm = 'Geo4-OUT';\\r\\n }\\r\\n }\\r\\n //Power Off\\r\\n else if ((alarmCodeInt & 256) == 256) {\\r\\n var alarm = 'PWRF';\\r\\n }\\r\\n //Power On\\r\\n else if ((alarmCodeInt & 512) == 512) {\\r\\n var alarm = 'PWRN';\\r\\n }\\r\\n //Motion\\r\\n else if ((alarmCodeInt & 1024) == 1024) {\\r\\n var alarm = 'ALMOV';\\r\\n }\\r\\n //No Motion\\r\\n else if ((alarmCodeInt & 2048) == 2048) {\\r\\n var alarm = 'ALNM';\\r\\n }\\r\\n //SOS\\r\\n else if ((alarmCodeInt & 4096) == 4096) {\\r\\n var alarm = 'ALSOS';\\r\\n } else if ((alarmCodeInt & 8192) == 8192) {\\r\\n var alarm = 'Side1';\\r\\n } else if ((alarmCodeInt & 16384) == 16384) {\\r\\n var alarm = 'Side2';\\r\\n }\\r\\n //Battery charging\\r\\n else if ((alarmCodeInt & 32768) == 32768) {\\r\\n var alarm = 'BATCN';\\r\\n }\\r\\n //Battery no charging\\r\\n else if ((alarmCodeInt & 65536) == 65536) {\\r\\n var alarm = 'BATCF';\\r\\n }\\r\\n //SOS Ending\\r\\n // Temporary Commented until we know exactly how it works. 22/09/2022\\r\\n else if ((alarmCodeInt & 131072) == 131072) {\\r\\n var alarm = 'ALA-F';\\r\\n info = 'Alarm Finished';\\r\\n }\\r\\n //Amber Alert EC03 only\\r\\n else if ((alarmCodeInt & 262144) == 262144) {\\r\\n var alarm = 'ALA';\\r\\n }\\r\\n // welfare Alert check-in ALA-O\\r\\n else if ((alarmCodeInt & 524288) == 524288) {\\r\\n var alarm = 'ALA-O';\\r\\n }\\r\\n // Amber alert Ending ALA-C\\r\\n else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n var alarm = 'ALA-C';\\r\\n }\\r\\n // Amber alert Ending ALA-C\\r\\n //else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n // var alarm = 'ALA-C';\\r\\n //}\\r\\n // Fall-Down Alert ending\\r\\n else if ((alarmCodeInt & 2097152) == 2097152) {\\r\\n var alarm = 'ALF-C';\\r\\n }\\r\\n // welfare Alert Ending ALA\\r\\n else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n var alarm = 'ALA';\\r\\n }\\r\\n // Beacon absent Alert 11/10/22. Need to be added in msg types\\r\\n //else if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n // var alarm = 'BEA';\\r\\n //}\\r\\n general += 'alarm:' + alarm + ',';\\r\\n break;\\r\\n //Custom ID\\r\\n case '03':\\r\\n customID = value;\\r\\n if (!allowedCID.includes(value)) {\\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 //<>,<>,<>,<>,<>\\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 if (!allowedCID.includes(customID)) {\\r\\n AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n AddValue(codeValues, \\\"customID\\\", customID);\\r\\n return\\r\\n }\\r\\n if (statusDevice) {\\r\\n messageForReceiver = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n }\\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;\\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 }\\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 = 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 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 var rawlabel = 'steps';\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=${rawlabel}`);\\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 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 var rawlabel = 'bpm';\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=${rawlabel}`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n }\\r\\n break;\\r\\n // SPO2\\r\\n case '41':\\r\\n var numSPO = (keyLength - 2) / 12;\\r\\n for (let j = 0; j < numSPO; 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 SPOHex = value.substring(8, 10);\\r\\n var SPO = hexToDecimal(SPOHex);\\r\\n var trustLevelHex = value.substring(10, 12);\\r\\n var trustLevel = hexToDecimal(trustLevelHex);\\r\\n info = SPO;\\r\\n //var alarmCode = 'True';\\r\\n var alarm = 'SPO2';\\r\\n general += ' SPO2 rate' + j + ':' + SPO + ',';\\r\\n var rawlabel = '%';\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};SPO2=${info};TLEVEL=${trustLevel};LABEL=${rawlabel}`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n }\\r\\n break;\\r\\n //BLE Connected . For Flic button\\r\\n case '62':\\r\\n location_type = 'BLE';\\r\\n //var alarm = 'EBZI'; \\r\\n //var latitudeHex = '00';\\r\\n //var longitudeHex = '00';\\r\\n //var descr = 'empty';\\r\\n var flag = hexToDecimal(value.substring(0, 2)); // 0= Disconnected, 1= Connected\\r\\n var mac = value.substring(2, 14); // No hace falta darle la vuelta\\r\\n // add : format in MAC\\r\\n mac = mac.match(/.{1,2}/g).join(':');\\r\\n var batLevel = hexToDecimal(value.substring(14, 16)); // 0-100\\r\\n //location_time = timestamp;\\r\\n ble_data = `${flag},${batLevel},${mac}`;\\r\\n general += 'BLE location (State):' + flag + ', (bat):' + batLevel + ', (mac):' + mac + ',';\\r\\n break;\\r\\n }\\r\\n }\\r\\n if (alarmCode) {\\r\\n messageForReceiver = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch;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 = (`Watch;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': // Ringer Volume\\r\\n var volume = hexToDecimal(value);\\r\\n imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;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 = (`Watch;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 '0F': // Enable control.... Used for STEP COUNTING SETTINGS\\r\\n // 'FF FF 21 80'\\r\\n var StepStatus = hex2bin(value.substring(4, 6));\\r\\n var enalbleDisable = '';\\r\\n if (StepStatus.substring(7, 8) == '1') {\\r\\n var step = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var step = 'Disable, '\\r\\n };\\r\\n //var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n //hrate += detectingInterval;\\r\\n AddValue(codeValues, \\\"step\\\", step);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadStepsSettings.EnableDisableReadStepsSettings, enalbleDisable);\\r\\n //AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadStepsSettings.EnableDisableReadStepsSettings);\\r\\n //configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\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 = (`Watch;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 '34': //ContactList with name\\r\\n var contactNumber = value.substring(1, 2);\\r\\n var telLength = hexToDecimal(value.substring(2, 4));\\r\\n var tel = '';\\r\\n switch (contactNumber) {\\r\\n // Emergency Number\\r\\n case '0':\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n break;\\r\\n // Speed Dial Number\\r\\n //case '1':\\r\\n // tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n // AddValue(codeValues, \\\"SpeedDialNumber\\\", tel);\\r\\n // AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.SpeedDialNumber, tel);\\r\\n // configsToAck.push(configIds.ReadSpeedDialSettings.SpeedDialNumber);\\r\\n // break;\\r\\n // Gateway Number\\r\\n case '9': //00447781482635,Esendex UK 0034627177148,Esendex Spain 00447507288240,Esendex UK Acceptance\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n if (tel.includes('447781482635') || tel.includes('00447781482635')) {\\r\\n tel = 'Esendex UK'\\r\\n } else if (tel.includes('34627177148') || tel.includes('0034627177148')) {\\r\\n tel = 'Esendex Spain'\\r\\n } else if (tel.includes('447507288240') || tel.includes('00447507288240')) {\\r\\n tel = 'Esendex UK Acceptance'\\r\\n } else {\\r\\n tel = 'Default'\\r\\n }\\r\\n AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n break;\\r\\n default:\\r\\n tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n if (tel.length < 6) {\\r\\n contacts += '';\\r\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n break;\\r\\n }\\r\\n //contacts += 'A' + (contactNumber - 1) + ': ' + tel + ', ';\\r\\n contacts += tel + ', ';\\r\\n AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n break;\\r\\n }\\r\\n break;\\r\\n case '40': // APN\\r\\n //no ACK need\\r\\n AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'));\\r\\n configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\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 = (`Watch;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 = (`Watch;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 '46': //HeartRate\\r\\n // '10 0E 00 80'\\r\\n var HeartRateStatus = hex2bin(value.substring(6, 8));\\r\\n var enalbleDisable = '';\\r\\n if (HeartRateStatus.substring(0, 1) == '1') {\\r\\n var hrate = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var hrate = 'Disable, '\\r\\n };\\r\\n var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n hrate += detectingInterval;\\r\\n AddValue(codeValues, \\\"hrate\\\", hrate);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadHeartrateSettings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadHeartrateSettings.EnableDisableReadHeartrateSettings);\\r\\n configsToAck.push(configIds.ReadHeartrateSettings.ReportingFrequency);\\r\\n break;\\r\\n case '47': // Custom Id\\r\\n imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;ACK-CUSTID;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"customeid\\\", value);\\r\\n AddValue(configsToUpdate, configIds.ReadState.CustomId, hex_to_ascii(value)); //now it comes \\\"3036\\\"\\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 // commented until Eview fixes this function\\r\\n /*\\r\\n messageForReceiver = (`Watch;ACK-NOMOTION;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"nomotion\\\", alertSetting);\\r\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings, enableDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n configsToAck.push(configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings);\\r\\n configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n */\\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 = (`Watch;ACK-FALLALERT;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n var sesibityOptionValue = hexToDecimal(value.substring(1, 2));\\r\\n sensibility += sesibityOptionValue;\\r\\n AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n //AddValue(configsToUpdate, configIds.ReadAlertSettings.FallSettings, sensibility);\\r\\n AddValue(configsToUpdate, configIds.ReadFallSettings.EnableDisableFallSettings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadFallSettings.Sensitivity, sesibityOptionValue);\\r\\n //configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n configsToAck.push(configIds.ReadFallSettings.EnableDisableFallSettings);\\r\\n configsToAck.push(configIds.ReadFallSettings.Sensitivity);\\r\\n break;\\r\\n case '73': //BeaconList\\r\\n var beaconNumber = hexToDecimal(value.substring(1, 2));\\r\\n var beaconStatus = hex2bin(value.substring(0, 1));\\r\\n beaconStatus = hex_to_ascii(value.substring(30, value.length));\\r\\n //beaconStatus = changeEndianness(value.substring(30, value.length));\\r\\n //homeBeacon += 'B' + (beaconNumber + 1) + ': ' + beaconStatus + ', ';\\r\\n homeBeacon += beaconStatus + ', ';\\r\\n AddValue(codeValues, \\\"homeBeacon\\\", homeBeacon);\\r\\n messageForReceiver = (`Watch;ACK-GDATA;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\r\\n configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n break;\\r\\n case '4A': //Wifi Network List\\r\\n var wifiSSIDLenght = hexToDecimal(value.substring(2, 4));\\r\\n var wifiPasswordLenght = hexToDecimal(value.substring(4, 6));\\r\\n var wifiIndex = hexToDecimal(value.substring(1, 2));\\r\\n //var wifiStatus = hexToDecimal(value.substring(0, 1));\\r\\n var wifiStatus = value.substring(0, 1);\\r\\n /*var enalbleDisable = wifiSSID = wifiPassword = homeWifi = '';\\r\\n /var homeWifi = '';\\r\\n if (wifiIndex == '0') { // Only first Wifi of the list\\r\\n if (wifiStatus == '8') {\\r\\n homeWifi += ' Enable, '\\r\\n enalbleDisable = '1';\\r\\n } else {\\r\\n homeWifi += ' Disable, '\\r\\n //enalbleDisable = '0';\\r\\n };*/\\r\\n if ((wifiStatus == '8') || (wifiStatus == 'C')) { // 8 == ON OR C== ON and Connected\\r\\n var wifiSSID = hex_to_ascii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\r\\n var wifiPassword = hex_to_ascii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\r\\n var imei = serverParams.Imei;\\r\\n messageForReceiver = (`Watch;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 = (`Watch;ACK-SPEED;${imei};`);\\r\\n sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(codeValues, \\\"speed\\\", alertSetting);\\r\\n AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\r\\n configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n break;\\r\\n case '7A': //[Length]:05 [Key]:7A [Value]:60 54 00 80\\r\\n // {\\\"spo2Interval\\\":{\\\"interval\\\":21600,\\\"status\\\":1}}\\r\\n var SPOStatus = hex2bin(value.substring(6, 8));\\r\\n var enalbleDisable = '';\\r\\n if (SPOStatus.substring(0, 1) == '1') {\\r\\n var spo = 'Enable, '\\r\\n enalbleDisable = '1'\\r\\n } else {\\r\\n var spo = 'Disable, '\\r\\n };\\r\\n var detectingInterval = hexToDecimal(changeEndianness(value.substring(0, 6))) / 60; //to minutes\\r\\n spo += detectingInterval;\\r\\n AddValue(codeValues, \\\"SPO2\\\", spo);\\r\\n //var imei = serverParams.Imei;\\r\\n //messageForReceiver = (`Watch;ACK-HRATE;${imei};`);\\r\\n //sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n AddValue(configsToUpdate, configIds.ReadSPO2Settings.EnableDisableReadSPO2Settings, enalbleDisable);\\r\\n AddValue(configsToUpdate, configIds.ReadSPO2Settings.ReportingFrequency, detectingInterval);\\r\\n configsToAck.push(configIds.ReadSPO2Settings.EnableDisableReadSPO2Settings);\\r\\n configsToAck.push(configIds.ReadSPO2Settings.ReportingFrequency);\\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 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 = (`Watch-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 = (`Watch-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};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 = (`Watch-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 if (typeof configIds !== 'undefined' && configIds && configIds.ConfigureDevice && configIds.ConfigureDevice.LastConfigured) { // when is defined\\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 }\\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(hex) { // Hex to Ascii \\r\\n if (hex.length % 2 !== 0) {\\r\\n throw new Error(\\\"Hex string length must be even\\\");\\r\\n }\\r\\n let ascii = '';\\r\\n for (let i = 0; i < hex.length; i += 2) {\\r\\n const byte = hex.substr(i, 2);\\r\\n const charCode = parseInt(byte, 16);\\r\\n if (charCode !== 0) { // remove null character (\\\\u0000)\\r\\n ascii += String.fromCharCode(charCode);\\r\\n }\\r\\n }\\r\\n return ascii;\\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 normalizeLabels(raw) { // output labels as array\\r\\n if (!raw) return [];\\r\\n return [String(raw)];\\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}\\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":1765523333}]},{"Id":436,"Name":"OnUpdateProtocol_CareWatch","Operation":"/*\r\nlet configsToUpdate = [];\r\nif (configs.HeartRateMonitor.EnableDisableHeartRateMonitor === \"\") {\r\n configsToUpdate.push({\r\n 'code': configIds.HeartRateMonitor.EnableDisableHeartRateMonitor,\r\n 'value': 'false'\r\n });\r\n}\r\nif (configs.HeartRateMonitor.HeartRateDetectingInterval === \"\") {\r\n configsToUpdate.push({\r\n 'code': configIds.HeartRateMonitor.HeartRateDetectingInterval,\r\n 'value': '10'\r\n });\r\n}\r\nif (configs.StepCounting.EnableDisableStepCounting === \"\") {\r\n configsToUpdate.push({\r\n 'code': configIds.StepCounting.EnableDisableStepCounting,\r\n 'value': 'false'\r\n });\r\n}\r\nif (configs.StepCounting.StepCountingInterval === \"\") {\r\n configsToUpdate.push({\r\n 'code': configIds.StepCounting.StepCountingInterval,\r\n 'value': '10'\r\n });\r\n}\r\nif (configs.DeviceVersion.DeviceVersion === \"\") {\r\n configsToUpdate.push({\r\n 'code': configIds.DeviceVersion.DeviceVersion,\r\n 'value': '1'\r\n });\r\n}\r\nif (configs.NoActivity.EnableDisableNoActivity === \"\") {\r\n configsToUpdate.push({\r\n 'code': configIds.NoActivity.EnableDisableNoActivity,\r\n 'value': 'false'\r\n });\r\n}\r\nif (configs.NoActivity.NoActivity === \"\") {\r\n configsToUpdate.push({\r\n 'code': configIds.NoActivity.NoActivity,\r\n 'value': '3600'\r\n });\r\n}\r\nif (configs.VoicePrompt.Activity === \"\") {\r\n configsToUpdate.push({\r\n 'code': configIds.VoicePrompt.Activity,\r\n 'value': 'true'\r\n });\r\n}\r\nif (configs.VoicePrompt.AlarmCancel === \"\") {\r\n configsToUpdate.push({\r\n 'code': configIds.VoicePrompt.AlarmCancel,\r\n 'value': 'true'\r\n });\r\n}\r\nif (configs.VoicePrompt.AlarmComplete === \"\") {\r\n configsToUpdate.push({\r\n 'code': configIds.VoicePrompt.AlarmComplete,\r\n 'value': 'true'\r\n });\r\n}\r\nif (configs.VoicePrompt.BaseLocation === \"\") {\r\n configsToUpdate.push({\r\n 'code': configIds.VoicePrompt.BaseLocation,\r\n 'value': 'true'\r\n });\r\n}\r\nif (configs.VoicePrompt.Battery === \"\") {\r\n configsToUpdate.push({\r\n 'code': configIds.VoicePrompt.Battery,\r\n 'value': 'true'\r\n });\r\n}\r\nif (configs.VoicePrompt.Beep === \"\") {\r\n configsToUpdate.push({\r\n 'code': configIds.VoicePrompt.Beep,\r\n 'value': 'true'\r\n });\r\n}\r\nif (configs.VoicePrompt.BLE === \"\") {\r\n configsToUpdate.push({\r\n 'code': configIds.VoicePrompt.BLE,\r\n 'value': 'true'\r\n });\r\n}\r\nif (configs.VoicePrompt.Call1 === \"\") {\r\n configsToUpdate.push({\r\n 'code': configIds.VoicePrompt.Call1,\r\n 'value': 'true'\r\n });\r\n}\r\nif (configs.VoicePrompt.Call2 === \"\") {\r\n configsToUpdate.push({\r\n 'code': configIds.VoicePrompt.Call2,\r\n 'value': 'true'\r\n });\r\n}\r\nif (configs.VoicePrompt.Call3 === \"\") {\r\n configsToUpdate.push({\r\n 'code': configIds.VoicePrompt.Call3,\r\n 'value': 'true'\r\n });\r\n}\r\nif (configs.VoicePrompt.Call4 === \"\") {\r\n configsToUpdate.push({\r\n 'code': configIds.VoicePrompt.Call4,\r\n 'value': 'true'\r\n });\r\n}\r\nif (configs.VoicePrompt.Call5 === \"\") {\r\n configsToUpdate.push({\r\n 'code': configIds.VoicePrompt.Call5,\r\n 'value': 'true'\r\n });\r\n}\r\nif (configs.VoicePrompt.Call6 === \"\") {\r\n configsToUpdate.push({\r\n 'code': configIds.VoicePrompt.Call6,\r\n 'value': 'true'\r\n });\r\n}\r\nif (configs.VoicePrompt.Call7 === \"\") {\r\n configsToUpdate.push({\r\n 'code': configIds.VoicePrompt.Call7,\r\n 'value': 'true'\r\n });\r\n}\r\nif (configs.VoicePrompt.Call8 === \"\") {\r\n configsToUpdate.push({\r\n 'code': configIds.VoicePrompt.Call8,\r\n 'value': 'true'\r\n });\r\n}\r\nif (configs.VoicePrompt.Call9 === \"\") {\r\n configsToUpdate.push({\r\n 'code': configIds.VoicePrompt.Call9,\r\n 'value': 'true'\r\n });\r\n}\r\nif (configs.VoicePrompt.Call10 === \"\") {\r\n configsToUpdate.push({\r\n 'code': configIds.VoicePrompt.Call10,\r\n 'value': 'true'\r\n });\r\n}\r\nif (configs.VoicePrompt.CallDisconnected === \"\") {\r\n configsToUpdate.push({\r\n 'code': configIds.VoicePrompt.CallDisconnected,\r\n 'value': 'true'\r\n });\r\n}\r\nif (configs.VoicePrompt.CallError === \"\") {\r\n configsToUpdate.push({\r\n 'code': configIds.VoicePrompt.CallError,\r\n 'value': 'true'\r\n });\r\n}\r\nif (configs.VoicePrompt.CallHang === \"\") {\r\n configsToUpdate.push({\r\n 'code': configIds.VoicePrompt.CallHang,\r\n 'value': 'true'\r\n });\r\n}\r\nif (configs.VoicePrompt.Charging === \"\") {\r\n configsToUpdate.push({\r\n 'code': configIds.VoicePrompt.Charging,\r\n 'value': 'true'\r\n });\r\n}\r\nif (configs.VoicePrompt.Click === \"\") {\r\n configsToUpdate.push({\r\n 'code': configIds.VoicePrompt.Click,\r\n 'value': 'true'\r\n });\r\n}\r\nif (configs.VoicePrompt.Fall === \"\") {\r\n configsToUpdate.push({\r\n 'code': configIds.VoicePrompt.Fall,\r\n 'value': 'true'\r\n });\r\n}\r\nif (configs.VoicePrompt.Find === \"\") {\r\n configsToUpdate.push({\r\n 'code': configIds.VoicePrompt.Find,\r\n 'value': 'true'\r\n });\r\n}\r\nif (configs.VoicePrompt.Motion === \"\") {\r\n configsToUpdate.push({\r\n 'code': configIds.VoicePrompt.Motion,\r\n 'value': 'true'\r\n });\r\n}\r\nif (configs.VoicePrompt.NoMotion === \"\") {\r\n configsToUpdate.push({\r\n 'code': configIds.VoicePrompt.NoMotion,\r\n 'value': 'true'\r\n });\r\n}\r\nif (configs.VoicePrompt.SOS === \"\") {\r\n configsToUpdate.push({\r\n 'code': configIds.VoicePrompt.SOS,\r\n 'value': 'true'\r\n });\r\n}\r\nif (configs.VoicePrompt.Tilt === \"\") {\r\n configsToUpdate.push({\r\n 'code': configIds.VoicePrompt.Tilt,\r\n 'value': 'true'\r\n });\r\n}\r\nif (configs.VoicePrompt.TiltCancel === \"\") {\r\n configsToUpdate.push({\r\n 'code': configIds.VoicePrompt.TiltCancel,\r\n 'value': 'true'\r\n });\r\n}\r\nif (configs.VoicePrompt.Time === \"\") {\r\n configsToUpdate.push({\r\n 'code': configIds.VoicePrompt.Time,\r\n 'value': 'true'\r\n });\r\n}\r\nif (configs.EnableControl.Step === \"\") {\r\n configsToUpdate.push({\r\n 'code': configIds.EnableControl.Step,\r\n 'value': 'false'\r\n });\r\n}\r\nif (configs.SystemLanguage.Language === \"\") {\r\n configsToUpdate.push({\r\n 'code': configIds.SystemLanguage.Language,\r\n 'value': 'en-US'\r\n });\r\n}\r\nif (configs.WelfareCheck.EnableDisableWelfareCheck === \"\") {\r\n configsToUpdate.push({\r\n 'code': configIds.WelfareCheck.EnableDisableWelfareCheck,\r\n 'value': 'false'\r\n });\r\n}\r\nif (configs.WelfareCheck.CheckTime === \"\") {\r\n configsToUpdate.push({\r\n 'code': configIds.WelfareCheck.CheckTime,\r\n 'value': '60'\r\n });\r\n}\r\nif (configs.WelfareCheck.WarningTime === \"\") {\r\n configsToUpdate.push({\r\n 'code': configIds.WelfareCheck.WarningTime,\r\n 'value': '10'\r\n });\r\n}\r\nif (configs.WelfareCheck.DialWarningTime === \"\") {\r\n configsToUpdate.push({\r\n 'code': configIds.WelfareCheck.DialWarningTime,\r\n 'value': 'false'\r\n });\r\n}\r\nvar msg = {\r\n 'configsToUpdate': configsToUpdate\r\n};\r\nconsole.log(msg); */","Type":1,"ProtocolActionObjects":[]}],"Groups":[{"Id":7366,"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":7367,"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7368,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7369,"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":7368,"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7368,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7369,"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":[]},{"Id":7369,"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7368,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7369,"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":7370,"Parent":{"Id":7367,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7368,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7369,"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":[]},{"Id":7371,"Parent":{"Id":7367,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7368,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7369,"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":[]},{"Id":7372,"Parent":{"Id":7367,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7368,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7369,"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7373,"Parent":{"Id":7367,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7368,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7369,"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":[]},{"Id":7374,"Parent":{"Id":7369,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7368,"Name":"Controls","Json":{"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":[]},{"Id":7375,"Parent":{"Id":7369,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7368,"Name":"Controls","Json":{"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":7376,"Parent":{"Id":7369,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7368,"Name":"Controls","Json":{"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":[]},{"Id":7377,"Parent":{"Id":7369,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7368,"Name":"Controls","Json":{"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":[]},{"Id":7378,"Parent":{"Id":7367,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7368,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7369,"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":[]},{"Id":7379,"Parent":{"Id":7369,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7368,"Name":"Controls","Json":{"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":[]},{"Id":7380,"Parent":{"Id":7367,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7368,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7369,"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":[]},{"Id":7384,"Parent":{"Id":7376,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7369,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7368,"Name":"Controls","Json":{"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":7374,"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":7375,"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":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"Fall Settings","Json":"{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]}","DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[]},{"Id":7385,"Parent":{"Id":7376,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7369,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7368,"Name":"Controls","Json":{"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":7374,"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":7375,"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":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"No Activity","Json":"{\"description\":\"\",\"columns\":1,\"order\":5,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]}","DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[]},{"Id":7387,"Parent":{"Id":7378,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7367,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7368,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7369,"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":7370,"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":7371,"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":7372,"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":7373,"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":7380,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","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 Fall Settings","Json":"{\"description\":\"\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]}","DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[]},{"Id":7388,"Parent":{"Id":7378,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7367,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7368,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7369,"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":7370,"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":7371,"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":7372,"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":7373,"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":7380,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","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 Non Movement Settings","Json":"{\"description\":\"\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]}","DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[{"Type":2,"NewValue":"{\"Id\":7388,\"Parent\":{\"Id\":7378,\"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\":7388,\"Name\":\"Read Non Movement Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]}]},\"Name\":\"Read Non Movement Settings\",\"Json\":\"{\\\"description\\\":\\\"\\\",\\\"columns\\\":1,\\\"order\\\":1,\\\"listSize\\\":1,\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\"]}\",\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"LanguageId\":null,\"ProtocolActionObjects\":[]}","Timestamp":1751039724}]},{"Id":7389,"Parent":{"Id":7377,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7369,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7368,"Name":"Controls","Json":{"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7379,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Name":"Beacon List","Json":"{\"description\":null,\"columns\":1,\"order\":3,\"listSize\":20,\"toTranslate\":[\"name\",\"description\"]}","DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[]},{"Id":7390,"Parent":{"Id":7377,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7369,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7368,"Name":"Controls","Json":{"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7379,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Name":"Approved Contacts","Json":"{\"description\":\"\",\"columns\":1,\"order\":2,\"listSize\":7,\"toTranslate\":[\"name\",\"description\"]}","DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":7390,\"Parent\":{\"Id\":7377,\"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\":7390,\"Name\":\"Approved Contacts\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":2,\"listSize\":8,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":true,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[{\"Id\":7394,\"Name\":\"Eulalia\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":2,\"listSize\":7,\"toTranslate\":[\"name\",\"description\"],\"index\":1},\"Device\":null,\"DeviceRelated\":true,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":7398,\"Name\":\"juan\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":2,\"listSize\":7,\"toTranslate\":[\"name\",\"description\"],\"index\":1},\"Device\":null,\"DeviceRelated\":true,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":7399,\"Name\":\"ana\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":2,\"listSize\":7,\"toTranslate\":[\"name\",\"description\"],\"index\":2},\"Device\":null,\"DeviceRelated\":true,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":7402,\"Name\":\"Teams Luton\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":2,\"listSize\":7,\"toTranslate\":[\"name\",\"description\"],\"index\":1},\"Device\":null,\"DeviceRelated\":true,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]}]},{\"Id\":7389,\"Name\":\"Beacon List\",\"Json\":{\"description\":null,\"columns\":1,\"order\":3,\"listSize\":20,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":true,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]}]},\"Name\":\"Approved Contacts\",\"Json\":\"{\\\"description\\\":\\\"\\\",\\\"columns\\\":1,\\\"order\\\":2,\\\"listSize\\\":8,\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\"]}\",\"DeviceRelated\":true,\"IsList\":false,\"IsAdminOnly\":false,\"LanguageId\":null,\"ProtocolActionObjects\":[]}","Timestamp":1748619953},{"Type":1,"NewValue":"{\"Id\":7390,\"Parent\":{\"Id\":7377,\"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\":7390,\"Name\":\"Approved Contacts\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":2,\"listSize\":8,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":true,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":7389,\"Name\":\"Beacon List\",\"Json\":{\"description\":null,\"columns\":1,\"order\":3,\"listSize\":20,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":true,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]}]},\"Name\":\"Approved Contacts\",\"Json\":\"{\\\"description\\\":\\\"\\\",\\\"columns\\\":1,\\\"order\\\":2,\\\"listSize\\\":8,\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\"]}\",\"DeviceRelated\":true,\"IsList\":false,\"IsAdminOnly\":false,\"LanguageId\":null,\"ProtocolActionObjects\":[]}","Timestamp":1748622501}]},{"Id":7391,"Parent":{"Id":7376,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7369,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7368,"Name":"Controls","Json":{"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":7374,"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":7375,"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":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"Non Movement Settings","Json":"{\"description\":null,\"columns\":1,\"order\":3,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]}","DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[{"Type":2,"NewValue":"{\"Id\":7391,\"Parent\":{\"Id\":7376,\"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\":7391,\"Name\":\"Non Movement Settings\",\"Json\":{\"description\":null,\"columns\":1,\"order\":3,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]}]},\"Name\":\"Non Movement Settings\",\"Json\":\"{\\\"description\\\":null,\\\"columns\\\":1,\\\"order\\\":3,\\\"listSize\\\":1,\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\"]}\",\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"LanguageId\":null,\"ProtocolActionObjects\":[]}","Timestamp":1751039819}]},{"Id":7394,"Parent":{"Id":7390,"Name":"Approved Contacts","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":{"Id":7377,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7369,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7368,"Name":"Controls","Json":{"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7379,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"Eulalia","Json":"{ \"description\": \"\", \"columns\": 1, \"order\": 2, \"listSize\": 7, \"toTranslate\": [ \"name\", \"description\" ], \"index\": 1}","DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[]},{"Id":7398,"Parent":{"Id":7390,"Name":"Approved Contacts","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":{"Id":7377,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7369,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7368,"Name":"Controls","Json":{"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7379,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"juan","Json":"{ \"description\": \"\", \"columns\": 1, \"order\": 2, \"listSize\": 7, \"toTranslate\": [ \"name\", \"description\" ], \"index\": 1}","DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[]},{"Id":7399,"Parent":{"Id":7390,"Name":"Approved Contacts","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":{"Id":7377,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7369,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7368,"Name":"Controls","Json":{"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7379,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"ana","Json":"{ \"description\": \"\", \"columns\": 1, \"order\": 2, \"listSize\": 7, \"toTranslate\": [ \"name\", \"description\" ], \"index\": 2}","DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[]},{"Id":7401,"Parent":{"Id":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":{"Id":7377,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7369,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7368,"Name":"Controls","Json":{"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7379,"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":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"office","Json":"{ \"description\": null, \"columns\": 1, \"order\": 3, \"listSize\": 20, \"toTranslate\": [ \"name\", \"description\" ], \"index\": 1}","DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[]},{"Id":7402,"Parent":{"Id":7390,"Name":"Approved Contacts","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":{"Id":7377,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7369,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7368,"Name":"Controls","Json":{"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7379,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"Teams Luton","Json":"{ \"description\": \"\", \"columns\": 1, \"order\": 2, \"listSize\": 7, \"toTranslate\": [ \"name\", \"description\" ], \"index\": 1}","DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[]},{"Id":7411,"Parent":{"Id":7369,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7374,"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":7375,"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":7376,"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":7377,"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":7379,"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":7411,"Name":"TeleHealth","Json":{"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":"TeleHealth","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\":7411,\"Parent\":{\"Id\":7369,\"Name\":\"Configure Device\",\"Json\":{\"description\":null,\"columns\":1,\"order\":3,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":{\"Id\":7366,\"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\":7374,\"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\":7375,\"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\":7376,\"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\":7377,\"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\":7379,\"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\":7411,\"Name\":\"TeleHealth\",\"Json\":{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]}]},\"Name\":\"TeleHealth\",\"Json\":\"{\\\"description\\\":null,\\\"columns\\\":1,\\\"order\\\":1,\\\"listSize\\\":1,\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\"]}\",\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"LanguageId\":null,\"ProtocolActionObjects\":[]}","Timestamp":1748623706},{"Type":1,"NewValue":"{\"Id\":7411,\"Parent\":{\"Id\":7369,\"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\":7411,\"Name\":\"TeleHealth 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\":7374,\"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\":7375,\"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\":7376,\"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\":7377,\"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\":7379,\"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\":\"TeleHealth Settings\",\"Json\":\"{\\\"description\\\":null,\\\"columns\\\":1,\\\"order\\\":1,\\\"listSize\\\":1,\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\"]}\",\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"LanguageId\":null,\"ProtocolActionObjects\":[]}","Timestamp":1748623754},{"Type":1,"NewValue":"{\"Id\":7411,\"Parent\":{\"Id\":7369,\"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\":7411,\"Name\":\"TeleHealth Settings\",\"Json\":{\"description\":\"A group for telehealth metrics such as steps and SPO2\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":7374,\"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\":7375,\"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\":7376,\"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\":7377,\"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\":7379,\"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\":\"TeleHealth Settings\",\"Json\":\"{\\\"description\\\":\\\"A group for telehealth metrics such as steps and SPO2\\\",\\\"columns\\\":1,\\\"order\\\":1,\\\"listSize\\\":1,\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\"]}\",\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"LanguageId\":null,\"ProtocolActionObjects\":[]}","Timestamp":1748623780},{"Type":1,"NewValue":"{\"Id\":7411,\"Parent\":{\"Id\":7369,\"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\":7411,\"Name\":\"TeleHealth Settings\",\"Json\":{\"description\":\"A group for Telehealth metrics, such as Heart Rate and Steps.\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[{\"Id\":7415,\"Name\":\"Steps 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\":7416,\"Name\":\"Heartrate 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\":7374,\"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\":7375,\"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\":7376,\"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\":7377,\"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\":7379,\"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\":\"TeleHealth Settings\",\"Json\":\"{\\\"description\\\":\\\"A group for Telehealth metrics, such as Heart Rate and Steps.\\\",\\\"columns\\\":1,\\\"order\\\":1,\\\"listSize\\\":1,\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\"]}\",\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"LanguageId\":null,\"ProtocolActionObjects\":[]}","Timestamp":1749657024}]},{"Id":7412,"Parent":{"Id":7367,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7380,"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":7412,"Name":"Read TeleHealth Settings","Json":{"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 TeleHealth Settings","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\":7412,\"Parent\":{\"Id\":7367,\"Name\":\"On Device\",\"Json\":{\"description\":null,\"columns\":1,\"order\":2,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":{\"Id\":7366,\"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\":7370,\"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\":7371,\"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\":7372,\"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\":7373,\"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\":7378,\"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\":7380,\"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\":7412,\"Name\":\"Read TeleHealth Settings\",\"Json\":{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]}]},\"Name\":\"Read TeleHealth Settings\",\"Json\":\"{\\\"description\\\":null,\\\"columns\\\":1,\\\"order\\\":1,\\\"listSize\\\":1,\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\"]}\",\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"LanguageId\":null,\"ProtocolActionObjects\":[]}","Timestamp":1748623827},{"Type":1,"NewValue":"{\"Id\":7412,\"Parent\":{\"Id\":7367,\"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\":7412,\"Name\":\"Read TeleHealth Settings\",\"Json\":{\"description\":\"Read TeleHealth Settings\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":7370,\"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\":7371,\"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\":7372,\"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\":7373,\"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\":7378,\"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\":7380,\"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 TeleHealth Settings\",\"Json\":\"{\\\"description\\\":\\\"Read TeleHealth Settings\\\",\\\"columns\\\":1,\\\"order\\\":1,\\\"listSize\\\":1,\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\"]}\",\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"LanguageId\":null,\"ProtocolActionObjects\":[]}","Timestamp":1748624307}]},{"Id":7413,"Parent":{"Id":7412,"Name":"Read TeleHealth Settings","Json":{"description":"Read TeleHealth Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7367,"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":7413,"Name":"Read Steps Settings","Json":{"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 Steps Settings","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\":7413,\"Parent\":{\"Id\":7412,\"Name\":\"Read TeleHealth Settings\",\"Json\":{\"description\":\"Read TeleHealth Settings\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":{\"Id\":7367,\"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\":7413,\"Name\":\"Read Steps Settings\",\"Json\":{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]}]},\"Name\":\"Read Steps Settings\",\"Json\":\"{\\\"description\\\":null,\\\"columns\\\":1,\\\"order\\\":1,\\\"listSize\\\":1,\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\"]}\",\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"LanguageId\":null,\"ProtocolActionObjects\":[]}","Timestamp":1748625010},{"Type":1,"NewValue":"{\"Id\":7413,\"Parent\":{\"Id\":7412,\"Name\":\"Read TeleHealth Settings\",\"Json\":{\"description\":\"Read TeleHealth Settings\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[{\"Id\":7413,\"Name\":\"Read Steps 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\":7414,\"Name\":\"Read Heartrate Settings\",\"Json\":{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]}]},\"Name\":\"Read Steps Settings\",\"Json\":\"{\\\"description\\\":null,\\\"columns\\\":1,\\\"order\\\":2,\\\"listSize\\\":1,\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\"]}\",\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"LanguageId\":null,\"ProtocolActionObjects\":[]}","Timestamp":1748971795}]},{"Id":7414,"Parent":{"Id":7412,"Name":"Read TeleHealth Settings","Json":{"description":"Read TeleHealth Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7367,"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":7413,"Name":"Read Steps Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7414,"Name":"Read Heartrate Settings","Json":{"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 Heartrate Settings","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\":7414,\"Parent\":{\"Id\":7412,\"Name\":\"Read TeleHealth Settings\",\"Json\":{\"description\":\"Read TeleHealth Settings\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":{\"Id\":7367,\"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\":7413,\"Name\":\"Read Steps 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\":7414,\"Name\":\"Read Heartrate Settings\",\"Json\":{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]}]},\"Name\":\"Read Heartrate Settings\",\"Json\":\"{\\\"description\\\":null,\\\"columns\\\":1,\\\"order\\\":1,\\\"listSize\\\":1,\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\"]}\",\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"LanguageId\":null,\"ProtocolActionObjects\":[]}","Timestamp":1748625569},{"Type":1,"NewValue":"{\"Id\":7414,\"Parent\":{\"Id\":7412,\"Name\":\"Read TeleHealth Settings\",\"Json\":{\"description\":\"Read TeleHealth Settings\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[{\"Id\":7414,\"Name\":\"Read Heartrate 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\":7413,\"Name\":\"Read Steps Settings\",\"Json\":{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]}]},\"Name\":\"Read Heartrate Settings\",\"Json\":\"{\\\"description\\\":null,\\\"columns\\\":1,\\\"order\\\":2,\\\"listSize\\\":1,\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\"]}\",\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"LanguageId\":null,\"ProtocolActionObjects\":[]}","Timestamp":1748625577},{"Type":1,"NewValue":"{\"Id\":7414,\"Parent\":{\"Id\":7412,\"Name\":\"Read TeleHealth Settings\",\"Json\":{\"description\":\"Read TeleHealth Settings\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[{\"Id\":7414,\"Name\":\"Read Heartrate 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\":7413,\"Name\":\"Read Steps Settings\",\"Json\":{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]}]},\"Name\":\"Read Heartrate Settings\",\"Json\":\"{\\\"description\\\":null,\\\"columns\\\":1,\\\"order\\\":1,\\\"listSize\\\":1,\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\"]}\",\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"LanguageId\":null,\"ProtocolActionObjects\":[]}","Timestamp":1748971793}]},{"Id":7415,"Parent":{"Id":7411,"Name":"TeleHealth Settings","Json":{"description":"A group for telehealth metrics such as steps and SPO2","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7369,"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":7415,"Name":"Steps Settings","Json":{"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":"Steps Settings","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\":7415,\"Parent\":{\"Id\":7411,\"Name\":\"TeleHealth Settings\",\"Json\":{\"description\":\"A group for telehealth metrics such as steps and SPO2\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":{\"Id\":7369,\"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\":7415,\"Name\":\"Steps Settings\",\"Json\":{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]}]},\"Name\":\"Steps Settings\",\"Json\":\"{\\\"description\\\":null,\\\"columns\\\":1,\\\"order\\\":1,\\\"listSize\\\":1,\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\"]}\",\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"LanguageId\":null,\"ProtocolActionObjects\":[]}","Timestamp":1748625950},{"Type":1,"NewValue":"{\"Id\":7415,\"Parent\":{\"Id\":7411,\"Name\":\"TeleHealth Settings\",\"Json\":{\"description\":\"A group for telehealth metrics such as steps and SPO2\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[{\"Id\":7415,\"Name\":\"Steps 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\":7416,\"Name\":\"Heartrate Settings\",\"Json\":{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]}]},\"Name\":\"Steps Settings\",\"Json\":\"{\\\"description\\\":null,\\\"columns\\\":1,\\\"order\\\":2,\\\"listSize\\\":1,\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\"]}\",\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"LanguageId\":null,\"ProtocolActionObjects\":[]}","Timestamp":1748972021}]},{"Id":7416,"Parent":{"Id":7411,"Name":"TeleHealth Settings","Json":{"description":"A group for telehealth metrics such as steps and SPO2","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7369,"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":7415,"Name":"Steps Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7416,"Name":"Heartrate Settings","Json":{"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":"Heartrate Settings","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\":7416,\"Parent\":{\"Id\":7411,\"Name\":\"TeleHealth Settings\",\"Json\":{\"description\":\"A group for telehealth metrics such as steps and SPO2\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":{\"Id\":7369,\"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\":7415,\"Name\":\"Steps 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\":7416,\"Name\":\"Heartrate Settings\",\"Json\":{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]}]},\"Name\":\"Heartrate Settings\",\"Json\":\"{\\\"description\\\":null,\\\"columns\\\":1,\\\"order\\\":1,\\\"listSize\\\":1,\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\"]}\",\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"LanguageId\":null,\"ProtocolActionObjects\":[]}","Timestamp":1748625984}]},{"Id":7454,"Parent":{"Id":7411,"Name":"TeleHealth Settings","Json":{"description":"A group for Telehealth metrics, such as Heart Rate and Steps.","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7369,"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":7415,"Name":"Steps Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7416,"Name":"Heartrate Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7454,"Name":"SPO2 Settings","Json":{"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":"SPO2 Settings","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\":7454,\"Parent\":{\"Id\":7411,\"Name\":\"TeleHealth Settings\",\"Json\":{\"description\":\"A group for Telehealth metrics, such as Heart Rate and Steps.\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":{\"Id\":7369,\"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\":7415,\"Name\":\"Steps 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\":7416,\"Name\":\"Heartrate 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\":7454,\"Name\":\"SPO2 Settings\",\"Json\":{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]}]},\"Name\":\"SPO2 Settings\",\"Json\":\"{\\\"description\\\":null,\\\"columns\\\":1,\\\"order\\\":1,\\\"listSize\\\":1,\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\"]}\",\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"LanguageId\":null,\"ProtocolActionObjects\":[]}","Timestamp":1762892832}]},{"Id":7457,"Parent":{"Id":7412,"Name":"Read TeleHealth Settings","Json":{"description":"Read TeleHealth Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7367,"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":7413,"Name":"Read Steps Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7414,"Name":"Read Heartrate Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7457,"Name":"Read SPO2 Settings","Json":{"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 SPO2 Settings","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\":7457,\"Parent\":{\"Id\":7412,\"Name\":\"Read TeleHealth Settings\",\"Json\":{\"description\":\"Read TeleHealth Settings\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":{\"Id\":7367,\"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\":7413,\"Name\":\"Read Steps 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\":7414,\"Name\":\"Read Heartrate 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\":7457,\"Name\":\"Read SPO2 Settings\",\"Json\":{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]}]},\"Name\":\"Read SPO2 Settings\",\"Json\":\"{\\\"description\\\":null,\\\"columns\\\":1,\\\"order\\\":1,\\\"listSize\\\":1,\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\"]}\",\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"LanguageId\":null,\"ProtocolActionObjects\":[]}","Timestamp":1763059210}]}],"GroupParams":[{"Id":12292,"Group":{"Id":7367,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7368,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7369,"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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\"]}","Default":"false","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":12293,"Group":{"Id":7367,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7368,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7369,"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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\"]}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":12295,"Group":{"Id":7368,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7369,"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":[{"Type":1,"NewValue":"{\"Id\":12295,\"Group\":{\"Id\":7368,\"Name\":\"Controls\",\"Json\":{\"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 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\\\":12}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1750165379}],"LanguageId":null,"Tags":[]},{"Id":12296,"Group":{"Id":7368,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7369,"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":[{"Type":1,"NewValue":"{\"Id\":12296,\"Group\":{\"Id\":7368,\"Name\":\"Controls\",\"Json\":{\"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 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\\\":10}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1750165370}],"LanguageId":null,"Tags":[]},{"Id":12297,"Group":{"Id":7368,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7369,"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":12298,"Group":{"Id":7368,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7369,"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":12300,"Group":{"Id":7368,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7369,"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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\":12300,\"Group\":{\"Id\":7368,\"Name\":\"Controls\",\"Json\":{\"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\\\":6}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1750165353}],"LanguageId":null,"Tags":[]},{"Id":12301,"Group":{"Id":7368,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7369,"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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\":12301,\"Group\":{\"Id\":7368,\"Name\":\"Controls\",\"Json\":{\"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\\\":7}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1750165357}],"LanguageId":null,"Tags":[]},{"Id":12302,"Group":{"Id":7368,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7369,"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":[],"LanguageId":null,"Tags":[]},{"Id":12303,"Group":{"Id":7368,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7369,"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":[{"Type":1,"NewValue":"{\"Id\":12303,\"Group\":{\"Id\":7368,\"Name\":\"Controls\",\"Json\":{\"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\":\"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\\\":5}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1750165349}],"LanguageId":null,"Tags":[]},{"Id":12304,"Group":{"Id":7368,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7369,"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":[],"LanguageId":null,"Tags":[]},{"Id":12305,"Group":{"Id":7368,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7369,"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":[{"Type":1,"NewValue":"{\"Id\":12305,\"Group\":{\"Id\":7368,\"Name\":\"Controls\",\"Json\":{\"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 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\\\":11}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1750165375}],"LanguageId":null,"Tags":[]},{"Id":12307,"Group":{"Id":7368,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7369,"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":[],"LanguageId":null,"Tags":[]},{"Id":12306,"Group":{"Id":7368,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7369,"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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\":12306,\"Group\":{\"Id\":7368,\"Name\":\"Controls\",\"Json\":{\"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\\\":8}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1750165361}],"LanguageId":null,"Tags":[]},{"Id":12291,"Group":{"Id":7368,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7369,"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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 NOTE: Only by GPRS action\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":null,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":12291,\"Group\":{\"Id\":7368,\"Name\":\"Controls\",\"Json\":{\"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 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 to the factory defaults.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1749472684},{"Type":1,"NewValue":"{\"Id\":12291,\"Group\":{\"Id\":7368,\"Name\":\"Controls\",\"Json\":{\"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 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 to the factory defaults.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":9}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1750165365}],"LanguageId":null,"Tags":[]},{"Id":12299,"Group":{"Id":7369,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7368,"Name":"Controls","Json":{"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":12294,"Group":{"Id":7369,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7368,"Name":"Controls","Json":{"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":12320,"Group":{"Id":7370,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7367,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7368,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7369,"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":12313,"Group":{"Id":7371,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7367,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7368,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7369,"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":7370,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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\"]}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":12312,"Group":{"Id":7371,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7367,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7368,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7369,"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":7370,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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\"]}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":12310,"Group":{"Id":7372,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7367,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7368,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7369,"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":7370,"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":7371,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":"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":12309,"Group":{"Id":7372,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7367,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7368,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7369,"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":7370,"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":7371,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":"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":12311,"Group":{"Id":7372,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7367,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7368,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7369,"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":7370,"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":7371,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":"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":12308,"Group":{"Id":7373,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7367,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7368,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7369,"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":7370,"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":7371,"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":7372,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":"Home Beacon","Json":"{\"name\":\"Home Beacon\",\"default\":\"\",\"description\":\"Current Home Beacon\",\"type\":\"text\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":true,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":null,\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":12319,"Group":{"Id":7373,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7367,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7368,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7369,"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":7370,"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":7371,"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":7372,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":"Approved Contacts","Json":"{\"name\":\"Approved Contacts\",\"default\":\"\",\"description\":\"Current Approved Contacts\",\"type\":\"text\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":true,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":null,\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":12325,"Group":{"Id":7374,"Name":"System Settings","Json":{"description":"","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7369,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7368,"Name":"Controls","Json":{"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":[],"LanguageId":null,"Tags":[]},{"Id":12323,"Group":{"Id":7374,"Name":"System Settings","Json":{"description":"","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7369,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7368,"Name":"Controls","Json":{"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":[],"LanguageId":null,"Tags":[]},{"Id":12330,"Group":{"Id":7374,"Name":"System Settings","Json":{"description":"","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7369,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7368,"Name":"Controls","Json":{"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":[],"LanguageId":null,"Tags":[]},{"Id":12329,"Group":{"Id":7374,"Name":"System Settings","Json":{"description":"","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7369,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7368,"Name":"Controls","Json":{"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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\":12329,\"Group\":{\"Id\":7374,\"Name\":\"System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":5,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"SystemLanguage\",\"Json\":\"{\\\"name\\\":\\\"SystemLanguage\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"System Language\\\",\\\"type\\\":\\\"select\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"System Language\\\",\\\"options\\\":[{\\\"label\\\":\\\"en-US (English)\\\",\\\"value\\\":\\\"en-US\\\"},{\\\"label\\\":\\\"es (Español)\\\",\\\"value\\\":\\\"es\\\"},{\\\"label\\\":\\\"fr (French)\\\",\\\"value\\\":\\\"fr\\\"},{\\\"label\\\":\\\"nl (Dutch)\\\",\\\"value\\\":\\\"nl\\\"},{\\\"label\\\":\\\"ja (Japanese)\\\",\\\"value\\\":\\\"ja\\\"},{\\\"label\\\":\\\"cn (Chinese)\\\",\\\"value\\\":\\\"cn\\\"},{\\\"label\\\":\\\"de (German)\\\",\\\"value\\\":\\\"de\\\"},{\\\"label\\\":\\\"pl (Polish)\\\",\\\"value\\\":\\\"pl\\\"},{\\\"label\\\":\\\"pt (portuguese)\\\",\\\"value\\\":\\\"pt\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1750272360},{"Type":1,"NewValue":"{\"Id\":12329,\"Group\":{\"Id\":7374,\"Name\":\"System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":5,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"SystemLanguage\",\"Json\":\"{\\\"name\\\":\\\"SystemLanguage\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"System Language\\\",\\\"type\\\":\\\"select\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"System Language\\\",\\\"options\\\":[{\\\"value\\\":\\\"en-US\\\",\\\"label\\\":\\\"en-US (English)\\\"},{\\\"value\\\":\\\"es\\\",\\\"label\\\":\\\"es (Español)\\\"},{\\\"value\\\":\\\"fr\\\",\\\"label\\\":\\\"fr (French)\\\"},{\\\"value\\\":\\\"nl\\\",\\\"label\\\":\\\"nl (Dutch)\\\"},{\\\"value\\\":\\\"ja\\\",\\\"label\\\":\\\"ja (Japanese)\\\"},{\\\"value\\\":\\\"cn\\\",\\\"label\\\":\\\"cn (Chinese)\\\"},{\\\"value\\\":\\\"de\\\",\\\"label\\\":\\\"de (German)\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1750348556},{"Type":1,"NewValue":"{\"Id\":12329,\"Group\":{\"Id\":7374,\"Name\":\"System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":5,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"SystemLanguage\",\"Json\":\"{\\\"name\\\":\\\"SystemLanguage\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"System Language\\\",\\\"type\\\":\\\"select\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"System Language\\\",\\\"options\\\":[{\\\"value\\\":\\\"en-US\\\",\\\"label\\\":\\\"en-US (English)\\\"},{\\\"label\\\":\\\"es (Español)\\\",\\\"value\\\":\\\"es-US\\\"},{\\\"label\\\":\\\"pt (Portuguese)\\\",\\\"value\\\":\\\"pt-PT\\\"},{\\\"label\\\":\\\"fr (French)\\\",\\\"value\\\":\\\"fr-FR\\\"},{\\\"label\\\":\\\"nl (Dutch)\\\",\\\"value\\\":\\\"nl-NL\\\"},{\\\"label\\\":\\\"de (German)\\\",\\\"value\\\":\\\"de-DE\\\"},{\\\"label\\\":\\\"ja (Japanese)\\\",\\\"value\\\":\\\"ja-JP\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751442394}],"LanguageId":null,"Tags":[]},{"Id":12327,"Group":{"Id":7375,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7369,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7368,"Name":"Controls","Json":{"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":7374,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":"SMS Gateway","Json":"{\"name\":\"SMS Gateway\",\"default\":\"\",\"description\":\"Set SMS Gateway\",\"type\":\"select\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Select the SMS gateway that the device will use to send and receive SMSs (Esendex UK/Esendex Spain)\",\"options\":[{\"value\":\"00447781482635,Esendex UK\",\"label\":\"Esendex UK\"},{\"value\":\"0034627177148,Esendex Spain\",\"label\":\"Esendex Spain\"},{\"value\":\"00447507288240,Esendex UK Acceptance\",\"label\":\"Esendex UK Acceptance\"},{\"value\":\"default\",\"label\":\"default\"}],\"toTranslate\":[\"name\",\"description\",\"helpText\",\"label\"]}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":12322,"Group":{"Id":7375,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7369,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7368,"Name":"Controls","Json":{"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":7374,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":"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\" }, { \"value\": \"everywhere,eesecure,eesecure\", \"label\": \"EE Secure [uk]\" } ], \"toTranslate\": [ \"name\", \"description\", \"helpText\", \"label\" ]}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":12326,"Group":{"Id":7375,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7369,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7368,"Name":"Controls","Json":{"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":7374,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":"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":12324,"Group":{"Id":7376,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7369,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7368,"Name":"Controls","Json":{"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":7374,"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":7375,"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":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"Emergency Number","Json":"{\"name\":\"Emergency Number\",\"default\":\"\",\"description\":\"Emergency Number\",\"type\":\"phone\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"The number called when the default SOS button is pushed on the device (typically the ARC)\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":12314,"Group":{"Id":7378,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7367,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7368,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7369,"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":7370,"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":7371,"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":7372,"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":7373,"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":7380,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","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":"No Motion Alert","Json":"{\"name\":\"No Motion Alert\",\"default\":\"\",\"description\":\"No Motion Alert\",\"type\":\"text\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":true,\"isHidden\":true,\"minLength\":null,\"maxLength\":null,\"helpText\":\"No Motion Alert Debugging only\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":12316,"Group":{"Id":7378,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7367,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7368,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7369,"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":7370,"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":7371,"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":7372,"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":7373,"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":7380,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","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":"Emergency Number","Json":"{\"name\":\"Emergency Number\",\"default\":\"\",\"description\":\"Current Emergency Number\",\"type\":\"text\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":true,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"This is the number the device will call when the SOS button is pushed\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":12315,"Group":{"Id":7378,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7367,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7368,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7369,"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":7370,"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":7371,"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":7372,"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":7373,"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":7380,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","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":"Fall Settings","Json":"{\"name\":\"Fall Settings\",\"default\":\"\",\"description\":\"Fall Settings\",\"type\":\"text\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":true,\"isHidden\":true,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Fall Settings debugging only\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":12321,"Group":{"Id":7379,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7369,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7368,"Name":"Controls","Json":{"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"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":12328,"Group":{"Id":7380,"Name":"Read System Settings","Json":{"description":"","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7367,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7368,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7369,"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Auto Answer","Json":"{\"name\":\"Auto Answer\",\"default\":\"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":[],"LanguageId":null,"Tags":[]},{"Id":12317,"Group":{"Id":7380,"Name":"Read System Settings","Json":{"description":"","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7367,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7368,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7369,"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"System Language","Json":"{\"name\":\"System Language\",\"default\":\"\",\"description\":\"System Language\",\"type\":\"text\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":true,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"System Language\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"],\"order\":2}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":12318,"Group":{"Id":7380,"Name":"Read System Settings","Json":{"description":"","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7367,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7368,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7369,"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Allow List","Json":"{\"name\":\"Allow List\",\"default\":\"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":[],"LanguageId":null,"Tags":[]},{"Id":12331,"Group":{"Id":7380,"Name":"Read System Settings","Json":{"description":"","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7367,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7368,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7369,"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Volume","Json":"{\"name\":\"Volume\",\"default\":\"\",\"description\":\"Volume\",\"type\":\"radioGroup\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":true,\"isHidden\":false,\"minLength\":1,\"maxLength\":100,\"helpText\":\"Volume 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":[]},{"Id":12342,"Group":{"Id":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7376,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7369,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7368,"Name":"Controls","Json":{"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":7374,"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":7375,"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":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Sensitivity","Json":"{\"name\":\"Sensitivity\",\"default\":\"\",\"description\":\"Sensitivity\",\"type\":\"radioGroup\",\"suffix\":null,\"prefix\":null,\"min\":1,\"max\":9,\"futureOnly\":false,\"integerOnly\":true,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"1-9 (9 high sensitivity/low trigger)\",\"options\":[{\"value\":\"3\",\"label\":\"Low\"},{\"value\":\"6\",\"label\":\"Medium\"},{\"value\":\"9\",\"label\":\"High\"}],\"toTranslate\":[\"name\",\"description\",\"helpText\",\"label\"]}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":12343,"Group":{"Id":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7376,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7369,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7368,"Name":"Controls","Json":{"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":7374,"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":7375,"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":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Enable Disable Fall Settings","Json":"{\"name\":\"Enable Disable Fall Settings\",\"default\":\"false\",\"description\":\"Toggle Fall alert\",\"type\":\"enable\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Toggle feature that raises an alarm when the VIP falls and breaches the specified sensitivity setting\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"true","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":12344,"Group":{"Id":7385,"Name":"No Activity","Json":{"description":"","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7376,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7369,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7368,"Name":"Controls","Json":{"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":7374,"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":7375,"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":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Enable Disable No Activity","Json":"{\"name\":\"Enable Disable No Activity\",\"default\":\"true\",\"description\":\"Enable Disable No Activity \",\"type\":\"enable\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Enable or disable no activity alerts\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"true","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[{"Id":2219,"Name":"activateNoActivity","BackendAction":"activateNoActivity","Value":""}]},{"Id":12345,"Group":{"Id":7385,"Name":"No Activity","Json":{"description":"","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7376,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7369,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7368,"Name":"Controls","Json":{"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":7374,"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":7375,"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":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"No Activity","Json":"{\"name\":\"No Activity\",\"default\":\"\",\"description\":\"Set No Activity Events\",\"type\":\"number\",\"suffix\":null,\"prefix\":null,\"min\":5,\"max\":10080,\"futureOnly\":false,\"integerOnly\":true,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Set No Activity Alerts in minutes. If the device does not report in the time frame it triggers a No Activity alert\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[{"Id":2218,"Name":"noActivityInterval","BackendAction":"noActivityInterval","Value":""}]},{"Id":12336,"Group":{"Id":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7378,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7367,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7368,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7369,"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":7370,"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":7371,"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":7372,"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":7373,"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":7380,"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":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Sensitivity","Json":"{\"name\":\"Sensitivity\",\"default\":\"\",\"description\":\"Sensitivity\",\"type\":\"radioGroup\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":true,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"1-9 (9 high sensitivity/low trigger)\",\"options\":[{\"value\":\"3\",\"label\":\"Low\"},{\"label\":\"Medium\",\"value\":\"6\"},{\"label\":\"High\",\"value\":\"9\"}],\"toTranslate\":[\"name\",\"description\",\"helpText\",\"label\"]}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":12335,"Group":{"Id":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7378,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7367,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7368,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7369,"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":7370,"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":7371,"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":7372,"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":7373,"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":7380,"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":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Enable Disable Fall Settings","Json":"{\"name\":\"Enable Disable Fall Settings\",\"default\":\"false\",\"description\":\"Enable Disable Fall Settings\",\"type\":\"enable\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Enable Disable Fall Settings\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"true","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":12349,"Group":{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7378,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7367,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7368,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7369,"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":7370,"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":7371,"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":7372,"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":7373,"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":7380,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Enable Disable Non Movement Settings","Json":"{\"name\":\"Enable Disable Non Movement Settings\",\"default\":\"false\",\"description\":\"Enable Disable Non Movement Settings\",\"type\":\"enable\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Enable Disable Non Movement Settings\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"true","Command":null,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":12349,\"Group\":{\"Id\":7388,\"Name\":\"Read Non Movement Settings\",\"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\":\"Enable Disable Non Movement Settings\",\"Json\":\"{\\\"name\\\":\\\"Enable Disable Non Movement Settings\\\",\\\"default\\\":\\\"true\\\",\\\"description\\\":\\\"Enable Disable Non Movement Settings\\\",\\\"type\\\":\\\"enable\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":true,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Enable Disable Non Movement Settings\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"true\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1750696557},{"Type":2,"NewValue":"{\"Id\":12349,\"Group\":{\"Id\":7388,\"Name\":\"Read Non Movement Settings\",\"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\":\"Enable Disable Non Movement Settings\",\"Json\":\"{\\\"name\\\":\\\"Enable Disable Non Movement Settings\\\",\\\"default\\\":\\\"true\\\",\\\"description\\\":\\\"Enable Disable Non Movement Settings\\\",\\\"type\\\":\\\"enable\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":true,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Enable Disable Non Movement Settings\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"true\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751039678}],"LanguageId":null,"Tags":[]},{"Id":12350,"Group":{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7378,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7367,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7368,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7369,"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":7370,"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":7371,"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":7372,"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":7373,"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":7380,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Time","Json":"{\"name\":\"Time\",\"default\":\"\",\"description\":\"Time in non-movement\",\"type\":\"radioGroup\",\"suffix\":\"seconds\",\"prefix\":null,\"min\":60,\"max\":123,\"futureOnly\":false,\"integerOnly\":true,\"isReadOnly\":true,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Time in non-movement\",\"options\":[{\"value\":\"1800\",\"label\":\"30 minutes\"},{\"value\":\"3600\",\"label\":\"1 hour\"},{\"value\":\"5400\",\"label\":\"1 hour 30 minutes\"},{\"value\":\"7200\",\"label\":\"2 hours\"}],\"toTranslate\":[\"name\",\"description\",\"helpText\",\"label\"]}","Default":"","Command":null,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":12350,\"Group\":{\"Id\":7388,\"Name\":\"Read Non Movement Settings\",\"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\":\"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\\\":true,\\\"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\":[]}","Timestamp":1750696570},{"Type":2,"NewValue":"{\"Id\":12350,\"Group\":{\"Id\":7388,\"Name\":\"Read Non Movement Settings\",\"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\":\"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\\\":true,\\\"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\":[]}","Timestamp":1751039709}],"LanguageId":null,"Tags":[]},{"Id":12348,"Group":{"Id":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":{"Id":7377,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7369,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7368,"Name":"Controls","Json":{"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7379,"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":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"Beacon","Json":"{\"name\":\"Beacon\",\"default\":\"\",\"description\":null,\"type\":\"beacon\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Select beacon from the list\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":12337,"Group":{"Id":7390,"Name":"Approved Contacts","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":{"Id":7377,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7369,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7368,"Name":"Controls","Json":{"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":7374,"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":7375,"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":7376,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7379,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"Contact","Json":"{\"name\":\"Contact\",\"default\":\"\",\"description\":\"Contact\",\"type\":\"phone\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Phone number of the contact\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":null,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":12337,\"Group\":{\"Id\":7390,\"Name\":\"Approved Contacts\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":2,\"listSize\":8,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":true,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Contact\",\"Json\":\"{\\\"name\\\":\\\"Contact\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Contact\\\",\\\"type\\\":\\\"phone\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Phone number of the contact\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1764100128},{"Type":0,"NewValue":"{\"Id\":12337,\"Group\":{\"Id\":7390,\"Name\":\"Approved Contacts\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":2,\"listSize\":8,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":true,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Contact\",\"Json\":\"{\\\"name\\\":\\\"Contact\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Contact\\\",\\\"type\\\":\\\"phone\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Phone number of the contact\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"\",\"Command\":{\"Id\":5806,\"Protocol\":{\"Id\":297,\"Code\":\"Access TEC Care Watch\",\"Version\":\"1.6\",\"FirmwareVersion\":\"V06.8601.2501\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"setWatchSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"// Watch Settings\\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 Watch Settings' Only enable y disable:\\r\\n// params.StepCounting.EnableDisableStepCounting == 'true'\\r\\n// params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true'\\r\\n//var params = {StepCounting:{'EnableDisableStepCounting':'true'},HeartRateMonitor:{'EnableDisableHeartRateMonitor':'true'}, DeviceVersion:{'DeviceVersion':2}}\\r\\n// Test enabled both\\r\\n// AB 10 13 00 99 6A 0A 00 02 11 36 00 08 1B 00 00 0E 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step on HRT off\\r\\n// AB 10 13 00 DD 0C 0B 00 02 11 36 00 08 0B 00 00 0C 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step off HRT on\\r\\n// AB 10 13 00 B5 D0 09 00 02 11 36 00 08 13 00 00 0A 00 00 00 14 00 00 00 03 0A 01\\r\\n// test both off \\r\\n// AB 10 13 00 F1 B6 0C 00 02 11 36 00 08 03 00 00 08 00 00 00 14 00 00 00 03 0A 01 \\r\\n// comando para Contact on ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 4C 2E 03 00 02 11 36 00 08 1B 00 00 4E 00 00 00 14 00 00 00 03 0A 01\\r\\n// comando para contact off ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 C2 8C 04 00 02 11 36 00 08 1B 00 00 46 00 00 00 14 00 00 00 03 0A 01\\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\n// To store the quantity of contacts in the whitelist to enable disable the contact menu\\r\\nvar contactos = params.ApprovedContacts && params.ApprovedContacts.Contact;\\r\\nvar numDuplas = Array.isArray(contactos) ? contactos.length : 0;\\r\\n// configuration command (0X02) , lenght and key\\r\\nvar messageBody = '021136';\\r\\n// step count/heart value display\\r\\n// Watch setting related FACE ID\\r\\nmessageBody += '00'; // Default FACE ID 0 \\r\\n// Future\\r\\n//if (params.WatchFace.SetWatchFace) {\\r\\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \\r\\n//} else {\\r\\n// messageBody += '00'; // Analog Face Default FACE ID 0 \\r\\n//}\\r\\n// Watch Display setting related to Step and heart rate settings\\r\\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '081B0000'; //both displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += (numDuplas > 2) ? 'E' : '6';\\r\\n //messageBody += '6'; //menu 1 and 2 \\r\\n //messageBody += 'E'; //menu 1 and 2 and contact (menu 3) \\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '080B0000'; // step display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '4'; //menu 2 \\r\\n //messageBody += 'C'; // menu 2 and contact (menu 3) \\r\\n messageBody += (numDuplas > 2) ? 'C' : '4';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '08130000'; // heart display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '2'; //menu 1 no contact (menu 3) \\r\\n //messageBody += 'A'; //menu 1 and contact (menu 3) \\r\\n messageBody += (numDuplas > 2) ? 'A' : '2';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '08030000'; // no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '0000000'; // no menu , //08 only contact\\r\\n //messageBody += '8'; // //08 only contact\\r\\n messageBody += (numDuplas > 2) ? '8' : '0';\\r\\n messageBody += '000000'; // other settings\\r\\n} else {\\r\\n messageBody += '08030000'; //no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '0000000'; // no menu..\\r\\n}\\r\\n//menu items for the future\\r\\n/*if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '06000000'; //menu 1 and 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '04000000'; //menu 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '02000000'; //menu 1\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '00000000'; // no menu\\r\\n} else {\\r\\n messageBody += '00000000'; // no menu\\r\\n}*/\\r\\n// from autohome page to the end\\r\\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\\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\\n//AddValueSMS('dataSMS', dataSMS);\\r\\nvar commandConfigs = {\\r\\n template: \\\"main\\\",\\r\\n configs: configs //,\\r\\n //configsSMS: configsSMS\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n// functions\\r\\nfunction AddValue(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n var arr1 = [];\\r\\n for (var n = 0, l = str.length; n < l; n++) {\\r\\n var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n arr1.push(hex);\\r\\n }\\r\\n return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n var crc = 0x0000;\\r\\n var j, i;\\r\\n for (i = 0; i < s.length; i++) {\\r\\n c = s[i];\\r\\n if (c > 255) {\\r\\n throw new RangeError();\\r\\n }\\r\\n j = (c ^ (crc >> 8)) & 0xFF;\\r\\n crc = crcTable[j] ^ (crc << 8);\\r\\n }\\r\\n return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n var splitStr = []\\r\\n var j = 0\\r\\n for (let i = 0; i < str.length; i += 2) {\\r\\n splitStr[j] = str.substring(i, i + 2)\\r\\n j++\\r\\n }\\r\\n var bytes = []\\r\\n var bytePos = 0\\r\\n for (let i = 0; i < splitStr.length; i++) {\\r\\n var byteStr = splitStr[i]\\r\\n var b = parseInt(byteStr, 16)\\r\\n if (b < 256) {\\r\\n bytes[bytePos] = b\\r\\n bytePos++\\r\\n }\\r\\n }\\r\\n return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n hexString = str.toString(16);\\r\\n return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n let bin = 0;\\r\\n let rem, i = 1,\\r\\n step = 1;\\r\\n while (x != 0) {\\r\\n rem = x % 2;\\r\\n x = parseInt(x / 2);\\r\\n bin = bin + rem * i;\\r\\n i = i * 10;\\r\\n }\\r\\n return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n var hexa = parseInt(x, 2).toString(16);\\r\\n return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n const result = [];\\r\\n let len = string.length - 2;\\r\\n while (len >= 0) {\\r\\n result.push(string.substr(len, 2));\\r\\n len -= 2;\\r\\n }\\r\\n return result.join('');\\r\\n}\",\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":true,\"SendAttempts\":4,\"Order\":null},\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1764100131},{"Type":1,"NewValue":"{\"Id\":12337,\"Group\":{\"Id\":7390,\"Name\":\"Approved Contacts\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":2,\"listSize\":8,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":true,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Contact\",\"Json\":\"{\\\"name\\\":\\\"Contact\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Contact\\\",\\\"type\\\":\\\"phone\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Phone number of the contact\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1764101901},{"Type":2,"NewValue":"{\"Id\":12337,\"Group\":{\"Id\":7390,\"Name\":\"Approved Contacts\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":2,\"listSize\":8,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":true,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Contact\",\"Json\":\"{\\\"name\\\":\\\"Contact\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Contact\\\",\\\"type\\\":\\\"phone\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Phone number of the contact\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"\",\"Command\":{\"Id\":5806,\"Protocol\":{\"Id\":297,\"Code\":\"Access TEC Care Watch\",\"Version\":\"1.6\",\"FirmwareVersion\":\"V06.8601.2501\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"setWatchSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"// Watch Settings\\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 Watch Settings' Only enable y disable:\\r\\n// params.StepCounting.EnableDisableStepCounting == 'true'\\r\\n// params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true'\\r\\n//var params = {StepCounting:{'EnableDisableStepCounting':'true'},HeartRateMonitor:{'EnableDisableHeartRateMonitor':'true'}, DeviceVersion:{'DeviceVersion':2}}\\r\\n// Test enabled both\\r\\n// AB 10 13 00 99 6A 0A 00 02 11 36 00 08 1B 00 00 0E 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step on HRT off\\r\\n// AB 10 13 00 DD 0C 0B 00 02 11 36 00 08 0B 00 00 0C 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step off HRT on\\r\\n// AB 10 13 00 B5 D0 09 00 02 11 36 00 08 13 00 00 0A 00 00 00 14 00 00 00 03 0A 01\\r\\n// test both off \\r\\n// AB 10 13 00 F1 B6 0C 00 02 11 36 00 08 03 00 00 08 00 00 00 14 00 00 00 03 0A 01 \\r\\n// comando para Contact on ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 4C 2E 03 00 02 11 36 00 08 1B 00 00 4E 00 00 00 14 00 00 00 03 0A 01\\r\\n// comando para contact off ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 C2 8C 04 00 02 11 36 00 08 1B 00 00 46 00 00 00 14 00 00 00 03 0A 01\\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\n// To store the quantity of contacts in the whitelist to enable disable the contact menu\\r\\n//var contactos = params.ApprovedContacts && params.ApprovedContacts.Contact;\\r\\nvar numDuplas = Array.isArray(params.ApprovedContacts) ? params.ApprovedContacts.length : 0;\\r\\n// configuration command (0X02) , lenght and key\\r\\nvar messageBody = '021136';\\r\\n// step count/heart value display\\r\\n// Watch setting related FACE ID\\r\\nmessageBody += '00'; // Default FACE ID 0 \\r\\n// Future\\r\\n//if (params.WatchFace.SetWatchFace) {\\r\\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \\r\\n//} else {\\r\\n// messageBody += '00'; // Analog Face Default FACE ID 0 \\r\\n//}\\r\\n// Watch Display setting related to Step and heart rate settings\\r\\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '081B0000'; //both displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += (numDuplas > 0) ? 'E' : '6';\\r\\n //messageBody += '6'; //menu 1 and 2 \\r\\n //messageBody += 'E'; //menu 1 and 2 and contact (menu 3) \\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '080B0000'; // step display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '4'; //menu 2 \\r\\n //messageBody += 'C'; // menu 2 and contact (menu 3) \\r\\n messageBody += (numDuplas > 0) ? 'C' : '4';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '08130000'; // heart display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '2'; //menu 1 no contact (menu 3) \\r\\n //messageBody += 'A'; //menu 1 and contact (menu 3) \\r\\n messageBody += (numDuplas > 0) ? 'A' : '2';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '08030000'; // no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '0000000'; // no menu , //08 only contact\\r\\n //messageBody += '8'; // //08 only contact\\r\\n messageBody += (numDuplas > 0) ? '8' : '0';\\r\\n messageBody += '000000'; // other settings\\r\\n} else {\\r\\n messageBody += '08030000'; //no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '0000000'; // no menu..\\r\\n}\\r\\n//menu items for the future\\r\\n/*if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '06000000'; //menu 1 and 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '04000000'; //menu 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '02000000'; //menu 1\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '00000000'; // no menu\\r\\n} else {\\r\\n messageBody += '00000000'; // no menu\\r\\n}*/\\r\\n// from autohome page to the end\\r\\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\\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\\n//AddValueSMS('dataSMS', dataSMS);\\r\\nvar commandConfigs = {\\r\\n template: \\\"main\\\",\\r\\n configs: configs //,\\r\\n //configsSMS: configsSMS\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n// functions\\r\\nfunction AddValue(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n var arr1 = [];\\r\\n for (var n = 0, l = str.length; n < l; n++) {\\r\\n var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n arr1.push(hex);\\r\\n }\\r\\n return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n var crc = 0x0000;\\r\\n var j, i;\\r\\n for (i = 0; i < s.length; i++) {\\r\\n c = s[i];\\r\\n if (c > 255) {\\r\\n throw new RangeError();\\r\\n }\\r\\n j = (c ^ (crc >> 8)) & 0xFF;\\r\\n crc = crcTable[j] ^ (crc << 8);\\r\\n }\\r\\n return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n var splitStr = []\\r\\n var j = 0\\r\\n for (let i = 0; i < str.length; i += 2) {\\r\\n splitStr[j] = str.substring(i, i + 2)\\r\\n j++\\r\\n }\\r\\n var bytes = []\\r\\n var bytePos = 0\\r\\n for (let i = 0; i < splitStr.length; i++) {\\r\\n var byteStr = splitStr[i]\\r\\n var b = parseInt(byteStr, 16)\\r\\n if (b < 256) {\\r\\n bytes[bytePos] = b\\r\\n bytePos++\\r\\n }\\r\\n }\\r\\n return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n hexString = str.toString(16);\\r\\n return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n let bin = 0;\\r\\n let rem, i = 1,\\r\\n step = 1;\\r\\n while (x != 0) {\\r\\n rem = x % 2;\\r\\n x = parseInt(x / 2);\\r\\n bin = bin + rem * i;\\r\\n i = i * 10;\\r\\n }\\r\\n return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n var hexa = parseInt(x, 2).toString(16);\\r\\n return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n const result = [];\\r\\n let len = string.length - 2;\\r\\n while (len >= 0) {\\r\\n result.push(string.substr(len, 2));\\r\\n len -= 2;\\r\\n }\\r\\n return result.join('');\\r\\n}\",\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":true,\"SendAttempts\":4,\"Order\":null},\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1764101904},{"Type":1,"NewValue":"{\"Id\":12337,\"Group\":{\"Id\":7390,\"Name\":\"Approved Contacts\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":2,\"listSize\":8,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":true,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Contact\",\"Json\":\"{\\\"name\\\":\\\"Contact\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Contact\\\",\\\"type\\\":\\\"phone\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Phone number of the contact\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1764837345},{"Type":0,"NewValue":"{\"Id\":12337,\"Group\":{\"Id\":7390,\"Name\":\"Approved Contacts\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":2,\"listSize\":8,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":true,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Contact\",\"Json\":\"{\\\"name\\\":\\\"Contact\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Contact\\\",\\\"type\\\":\\\"phone\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Phone number of the contact\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"\",\"Command\":{\"Id\":5806,\"Protocol\":{\"Id\":297,\"Code\":\"Access TEC Care Watch\",\"Version\":\"1.6\",\"FirmwareVersion\":\"V06.8601.2501\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"setWatchSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"// Watch Settings\\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 Watch Settings' Only enable y disable:\\r\\n// params.StepCounting.EnableDisableStepCounting == 'true'\\r\\n// params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true'\\r\\n//var params = {StepCounting:{'EnableDisableStepCounting':'true'},HeartRateMonitor:{'EnableDisableHeartRateMonitor':'true'}, DeviceVersion:{'DeviceVersion':2}}\\r\\n// Test enabled both\\r\\n// AB 10 13 00 99 6A 0A 00 02 11 36 00 08 1B 00 00 0E 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step on HRT off\\r\\n// AB 10 13 00 DD 0C 0B 00 02 11 36 00 08 0B 00 00 0C 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step off HRT on\\r\\n// AB 10 13 00 B5 D0 09 00 02 11 36 00 08 13 00 00 0A 00 00 00 14 00 00 00 03 0A 01\\r\\n// test both off \\r\\n// AB 10 13 00 F1 B6 0C 00 02 11 36 00 08 03 00 00 08 00 00 00 14 00 00 00 03 0A 01 \\r\\n// comando para Contact on ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 4C 2E 03 00 02 11 36 00 08 1B 00 00 4E 00 00 00 14 00 00 00 03 0A 01\\r\\n// comando para contact off ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 C2 8C 04 00 02 11 36 00 08 1B 00 00 46 00 00 00 14 00 00 00 03 0A 01\\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\n// To store the quantity of contacts in the whitelist to enable disable the contact menu\\r\\n//var contactos = params.ApprovedContacts && params.ApprovedContacts.Contact;\\r\\nvar numDuplas = Array.isArray(params.ApprovedContacts) ? params.ApprovedContacts.length : 0;\\r\\n// configuration command (0X02) , lenght and key\\r\\nvar messageBody = '021136';\\r\\n// step count/heart value display\\r\\n// Watch setting related FACE ID\\r\\nmessageBody += '00'; // Default FACE ID 0 \\r\\n// Future\\r\\n//if (params.WatchFace.SetWatchFace) {\\r\\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \\r\\n//} else {\\r\\n// messageBody += '00'; // Analog Face Default FACE ID 0 \\r\\n//}\\r\\n// Watch Display setting related to Step and heart rate settings\\r\\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '081B0000'; //both displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += (numDuplas > 0) ? 'E' : '6';\\r\\n //messageBody += '6'; //menu 1 and 2 \\r\\n //messageBody += 'E'; //menu 1 and 2 and contact (menu 3) \\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '080B0000'; // step display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '4'; //menu 2 \\r\\n //messageBody += 'C'; // menu 2 and contact (menu 3) \\r\\n messageBody += (numDuplas > 0) ? 'C' : '4';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '08130000'; // heart display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '2'; //menu 1 no contact (menu 3) \\r\\n //messageBody += 'A'; //menu 1 and contact (menu 3) \\r\\n messageBody += (numDuplas > 0) ? 'A' : '2';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '08030000'; // no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '0000000'; // no menu , //08 only contact\\r\\n //messageBody += '8'; // //08 only contact\\r\\n messageBody += (numDuplas > 0) ? '8' : '0';\\r\\n messageBody += '000000'; // other settings\\r\\n} else {\\r\\n messageBody += '08030000'; //no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '0000000'; // no menu..\\r\\n}\\r\\n//menu items for the future\\r\\n/*if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '06000000'; //menu 1 and 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '04000000'; //menu 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '02000000'; //menu 1\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '00000000'; // no menu\\r\\n} else {\\r\\n messageBody += '00000000'; // no menu\\r\\n}*/\\r\\n// from autohome page to the end\\r\\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\\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\\n//AddValueSMS('dataSMS', dataSMS);\\r\\nvar commandConfigs = {\\r\\n template: \\\"main\\\",\\r\\n configs: configs //,\\r\\n //configsSMS: configsSMS\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n// functions\\r\\nfunction AddValue(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n var arr1 = [];\\r\\n for (var n = 0, l = str.length; n < l; n++) {\\r\\n var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n arr1.push(hex);\\r\\n }\\r\\n return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n var crc = 0x0000;\\r\\n var j, i;\\r\\n for (i = 0; i < s.length; i++) {\\r\\n c = s[i];\\r\\n if (c > 255) {\\r\\n throw new RangeError();\\r\\n }\\r\\n j = (c ^ (crc >> 8)) & 0xFF;\\r\\n crc = crcTable[j] ^ (crc << 8);\\r\\n }\\r\\n return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n var splitStr = []\\r\\n var j = 0\\r\\n for (let i = 0; i < str.length; i += 2) {\\r\\n splitStr[j] = str.substring(i, i + 2)\\r\\n j++\\r\\n }\\r\\n var bytes = []\\r\\n var bytePos = 0\\r\\n for (let i = 0; i < splitStr.length; i++) {\\r\\n var byteStr = splitStr[i]\\r\\n var b = parseInt(byteStr, 16)\\r\\n if (b < 256) {\\r\\n bytes[bytePos] = b\\r\\n bytePos++\\r\\n }\\r\\n }\\r\\n return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n hexString = str.toString(16);\\r\\n return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n let bin = 0;\\r\\n let rem, i = 1,\\r\\n step = 1;\\r\\n while (x != 0) {\\r\\n rem = x % 2;\\r\\n x = parseInt(x / 2);\\r\\n bin = bin + rem * i;\\r\\n i = i * 10;\\r\\n }\\r\\n return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n var hexa = parseInt(x, 2).toString(16);\\r\\n return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n const result = [];\\r\\n let len = string.length - 2;\\r\\n while (len >= 0) {\\r\\n result.push(string.substr(len, 2));\\r\\n len -= 2;\\r\\n }\\r\\n return result.join('');\\r\\n}\",\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":true,\"SendAttempts\":4,\"Order\":null},\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1764837349},{"Type":1,"NewValue":"{\"Id\":12337,\"Group\":{\"Id\":7390,\"Name\":\"Approved Contacts\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":2,\"listSize\":8,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":true,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Contact\",\"Json\":\"{\\\"name\\\":\\\"Contact\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Contact\\\",\\\"type\\\":\\\"phone\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Phone number of the contact\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1764838452},{"Type":2,"NewValue":"{\"Id\":12337,\"Group\":{\"Id\":7390,\"Name\":\"Approved Contacts\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":2,\"listSize\":8,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":true,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Contact\",\"Json\":\"{\\\"name\\\":\\\"Contact\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Contact\\\",\\\"type\\\":\\\"phone\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Phone number of the contact\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"\",\"Command\":{\"Id\":5806,\"Protocol\":{\"Id\":297,\"Code\":\"Access TEC Care Watch\",\"Version\":\"1.6\",\"FirmwareVersion\":\"V06.8601.2501\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"setWatchSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"// Watch Settings\\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 Watch Settings' Only enable y disable:\\r\\n// params.StepCounting.EnableDisableStepCounting == 'true'\\r\\n// params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true'\\r\\n//var params = {StepCounting:{'EnableDisableStepCounting':'true'},HeartRateMonitor:{'EnableDisableHeartRateMonitor':'true'}, DeviceVersion:{'DeviceVersion':2}}\\r\\n// Test enabled both\\r\\n// AB 10 13 00 99 6A 0A 00 02 11 36 00 08 1B 00 00 0E 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step on HRT off\\r\\n// AB 10 13 00 DD 0C 0B 00 02 11 36 00 08 0B 00 00 0C 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step off HRT on\\r\\n// AB 10 13 00 B5 D0 09 00 02 11 36 00 08 13 00 00 0A 00 00 00 14 00 00 00 03 0A 01\\r\\n// test both off \\r\\n// AB 10 13 00 F1 B6 0C 00 02 11 36 00 08 03 00 00 08 00 00 00 14 00 00 00 03 0A 01 \\r\\n// comando para Contact on ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 4C 2E 03 00 02 11 36 00 08 1B 00 00 4E 00 00 00 14 00 00 00 03 0A 01\\r\\n// comando para contact off ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 C2 8C 04 00 02 11 36 00 08 1B 00 00 46 00 00 00 14 00 00 00 03 0A 01\\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\n// To store the quantity of contacts in the whitelist to enable disable the contact menu\\r\\n//var contactos = params.ApprovedContacts && params.ApprovedContacts.Contact;\\r\\nvar numDuplas = Array.isArray(params.ApprovedContacts) ? params.ApprovedContacts.length : 0;\\r\\n// configuration command (0X02) , lenght and key\\r\\nvar messageBody = '021136';\\r\\n// step count/heart value display\\r\\n// Watch setting related FACE ID\\r\\nmessageBody += '00'; // Default FACE ID 0 \\r\\n// Future\\r\\n//if (params.WatchFace.SetWatchFace) {\\r\\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \\r\\n//} else {\\r\\n// messageBody += '00'; // Analog Face Default FACE ID 0 \\r\\n//}\\r\\n// Watch Display setting related to Step and heart rate settings\\r\\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '081B0000'; //both displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += (numDuplas > 0) ? 'E' : '6';\\r\\n //messageBody += '6'; //menu 1 and 2 \\r\\n //messageBody += 'E'; //menu 1 and 2 and contact (menu 3) \\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '080B0000'; // step display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '4'; //menu 2 \\r\\n //messageBody += 'C'; // menu 2 and contact (menu 3) \\r\\n messageBody += (numDuplas > 0) ? 'C' : '4';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '08130000'; // heart display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '2'; //menu 1 no contact (menu 3) \\r\\n //messageBody += 'A'; //menu 1 and contact (menu 3) \\r\\n messageBody += (numDuplas > 0) ? 'A' : '2';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '08030000'; // no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '0000000'; // no menu , //08 only contact\\r\\n //messageBody += '8'; // //08 only contact\\r\\n messageBody += (numDuplas > 0) ? '8' : '0';\\r\\n messageBody += '000000'; // other settings\\r\\n} else {\\r\\n messageBody += '08030000'; //no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '0000000'; // no menu..\\r\\n}\\r\\n//menu items for the future\\r\\n/*if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '06000000'; //menu 1 and 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '04000000'; //menu 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '02000000'; //menu 1\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '00000000'; // no menu\\r\\n} else {\\r\\n messageBody += '00000000'; // no menu\\r\\n}*/\\r\\n// from autohome page to the end\\r\\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\\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\\n//AddValueSMS('dataSMS', dataSMS);\\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// functions\\r\\nfunction AddValue(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n var arr1 = [];\\r\\n for (var n = 0, l = str.length; n < l; n++) {\\r\\n var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n arr1.push(hex);\\r\\n }\\r\\n return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n var crc = 0x0000;\\r\\n var j, i;\\r\\n for (i = 0; i < s.length; i++) {\\r\\n c = s[i];\\r\\n if (c > 255) {\\r\\n throw new RangeError();\\r\\n }\\r\\n j = (c ^ (crc >> 8)) & 0xFF;\\r\\n crc = crcTable[j] ^ (crc << 8);\\r\\n }\\r\\n return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n var splitStr = []\\r\\n var j = 0\\r\\n for (let i = 0; i < str.length; i += 2) {\\r\\n splitStr[j] = str.substring(i, i + 2)\\r\\n j++\\r\\n }\\r\\n var bytes = []\\r\\n var bytePos = 0\\r\\n for (let i = 0; i < splitStr.length; i++) {\\r\\n var byteStr = splitStr[i]\\r\\n var b = parseInt(byteStr, 16)\\r\\n if (b < 256) {\\r\\n bytes[bytePos] = b\\r\\n bytePos++\\r\\n }\\r\\n }\\r\\n return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n hexString = str.toString(16);\\r\\n return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n let bin = 0;\\r\\n let rem, i = 1,\\r\\n step = 1;\\r\\n while (x != 0) {\\r\\n rem = x % 2;\\r\\n x = parseInt(x / 2);\\r\\n bin = bin + rem * i;\\r\\n i = i * 10;\\r\\n }\\r\\n return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n var hexa = parseInt(x, 2).toString(16);\\r\\n return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n const result = [];\\r\\n let len = string.length - 2;\\r\\n while (len >= 0) {\\r\\n result.push(string.substr(len, 2));\\r\\n len -= 2;\\r\\n }\\r\\n return result.join('');\\r\\n}\",\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":true,\"SendAttempts\":4,\"Order\":null},\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1764838456},{"Type":1,"NewValue":"{\"Id\":12337,\"Group\":{\"Id\":7390,\"Name\":\"Approved Contacts\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":2,\"listSize\":8,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":true,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Contact\",\"Json\":\"{\\\"name\\\":\\\"Contact\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Contact\\\",\\\"type\\\":\\\"phone\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Phone number of the contact\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1765219387},{"Type":0,"NewValue":"{\"Id\":12337,\"Group\":{\"Id\":7390,\"Name\":\"Approved Contacts\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":2,\"listSize\":8,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":true,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Contact\",\"Json\":\"{\\\"name\\\":\\\"Contact\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Contact\\\",\\\"type\\\":\\\"phone\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Phone number of the contact\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"\",\"Command\":{\"Id\":5819,\"Protocol\":{\"Id\":297,\"Code\":\"Access TEC Care Watch\",\"Version\":\"1.6\",\"FirmwareVersion\":\"V06.8601.2501\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"setAuthorisedNumbersAndWatchSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"// Combinated version setAuthorisedNumber with Watch Settings for EV06\\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// AB 10 22 00 32 FA 00 00 02 11 36 00 00 00 00 00 00 00 00 00 14 00 00 00 00 0A 00 0E 34 80 09 31 32 33 34 35 36 37 38 39 00 00\\r\\n// [Length]:11 [Key]:36 [Value]:00 00 00 00 00 00 00 00 00 14 00 00 00 00 0A 00\\r\\n//{\\\"watch\\\":{\\\"status18\\\":0,\\\"status17\\\":0,\\\"status19\\\":0,\\\"status10\\\":0,\\\"flagValue\\\":0,\\\"status12\\\":0,\\\"faceId\\\":0,\\\"status11\\\":0,\\\"status14\\\":0,\\\"status13\\\":0,\\\"status16\\\":0,\\\"status15\\\":0,\\\"status0\\\":0,\\\"status1\\\":0,\\\"menu8\\\":0,\\\"menu7\\\":0,\\\"menu6\\\":0,\\\"menu5\\\":0,\\\"menu4\\\":0,\\\"menu3\\\":0,\\\"menu2\\\":0,\\\"menu1\\\":0,\\\"autoTime\\\":20,\\\"brightNess\\\":0,\\\"logoIndex\\\":0,\\\"status20\\\":0,\\\"status8\\\":0,\\\"status9\\\":0,\\\"status2\\\":0,\\\"status3\\\":0,\\\"brightTime\\\":10}}\\r\\n//[Length]:0E [Key]:34 [Value]:80 09 31 32 33 34 35 36 37 38 39 00 00\\r\\n//{\\\"numberNamePhoto\\\":{\\\"call\\\":0,\\\"noCard\\\":0,\\\"number\\\":\\\"123456789\\\",\\\"enable\\\":1,\\\"sms\\\":0,\\\"name\\\":\\\"\\\",\\\"headURL\\\":\\\"\\\",\\\"index\\\":0}}\\r\\n// para pruebas en local Contact':\\r\\n//AB 10 12 00 94 ED 00 00 02 10 34 E0 09 31 32 33 34 35 36 37 38 39 02 79 6F 00\\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 phoneNumber = '';\\r\\nvar numberLength = '00';\\r\\nvar numberHex = '';\\r\\nvar nameLength = '00';\\r\\nvar nameHex = '';\\r\\nvar value = '02';\\r\\nvar keyLength = '00';\\r\\nvar confTel = '';\\r\\nvar count = 1; // approved contact will be from A2 to A9 - index 1 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 += \\\"0534\\\" + 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 phoneNumber = params.ApprovedContacts[contact].Contact;\\r\\n if (phoneNumber.startsWith(\\\"+\\\")) {\\r\\n phoneNumber = \\\"00\\\" + phoneNumber.substring(1);\\r\\n }\\r\\n numberHex = ascii_to_hexa(phoneNumber).toUpperCase();\\r\\n numberLength = ('00' + decimalToHex(phoneNumber.length)).slice(-2).toUpperCase();\\r\\n nameHex = ascii_to_hexa(params.ApprovedContacts[contact].Name).toUpperCase();\\r\\n nameLength = ('00' + decimalToHex(params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n keyLength = ('00' + decimalToHex(5 + phoneNumber.length + params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n value += keyLength + \\\"34\\\" + confTel + numberLength + numberHex + nameLength + nameHex + '00'; //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 phoneNumber = params.ApprovedContacts[contact].Contact;\\r\\n if (phoneNumber.startsWith(\\\"+\\\")) {\\r\\n phoneNumber = \\\"00\\\" + phoneNumber.substring(1);\\r\\n }\\r\\n numberHex = ascii_to_hexa(phoneNumber).toUpperCase();\\r\\n numberLength = ('00' + decimalToHex(phoneNumber.length)).slice(-2).toUpperCase();\\r\\n nameHex = ascii_to_hexa(params.ApprovedContacts[contact].Name).toUpperCase();\\r\\n nameLength = ('00' + decimalToHex(params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n keyLength = ('00' + decimalToHex(5 + phoneNumber.length + params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n value += keyLength + \\\"34\\\" + confTel + numberLength + numberHex + nameLength + nameHex + '00'; //no photo\\r\\n //value += keyLength + \\\"30\\\" + confTel + numberHex; //no photo \\r\\n }\\r\\n count++;\\r\\n}\\r\\ncounter = count; // to check how many contacts are in the lists\\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 += \\\"0534\\\" + confTel + '000000'; //no number, no name, no photo\\r\\n}\\r\\n// watch settings section\\r\\n// lenght and key\\r\\nvar messageBody = '1136';\\r\\n// step count/heart value display\\r\\n// Watch setting related FACE ID\\r\\nmessageBody += '00'; // Default FACE ID 0 \\r\\n// Future\\r\\n//if (params.WatchFace.SetWatchFace) {\\r\\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \\r\\n//} else {\\r\\n// messageBody += '00'; // Analog Face Default FACE ID 0 \\r\\n//}\\r\\n// Watch Display setting related to Step and heart rate settings\\r\\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '081B0000'; //both displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += (counter > 1) ? 'E' : '6';\\r\\n //messageBody += '6'; //menu 1 and 2 \\r\\n //messageBody += 'E'; //menu 1 and 2 and contact (menu 3) \\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '080B0000'; // step display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '4'; //menu 2 \\r\\n //messageBody += 'C'; // menu 2 and contact (menu 3) \\r\\n messageBody += (counter > 1) ? 'C' : '4';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '08130000'; // heart display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '2'; //menu 1 no contact (menu 3) \\r\\n //messageBody += 'A'; //menu 1 and contact (menu 3) \\r\\n messageBody += (counter > 1) ? 'A' : '2';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '08030000'; // no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '0000000'; // no menu , //08 only contact\\r\\n //messageBody += '8'; // //08 only contact\\r\\n messageBody += (counter > 1) ? '8' : '0';\\r\\n messageBody += '000000'; // other settings\\r\\n} else {\\r\\n messageBody += '08030000'; //no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '0000000'; // no menu..\\r\\n}\\r\\n// from autohome page to the end\\r\\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\\r\\nvalue += messageBody; //add watchsetting hex to contact hex in value var \\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}\",\"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":1765219390},{"Type":2,"NewValue":"{\"Id\":12337,\"Group\":{\"Id\":7390,\"Name\":\"Approved Contacts\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":2,\"listSize\":8,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":true,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Contact\",\"Json\":\"{\\\"name\\\":\\\"Contact\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Contact\\\",\\\"type\\\":\\\"phone\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Phone number of the contact\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"\",\"Command\":{\"Id\":5786,\"Protocol\":{\"Id\":297,\"Code\":\"Access TEC Care Watch\",\"Version\":\"1.6\",\"FirmwareVersion\":\"V06.8601.2501\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"setAuthorisedNumbers\",\"TemplateSMS\":\"\",\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"//updated v 3 for EV06\\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//[Length]:10 [Key]:34 [Value]:E0 09 31 32 33 34 35 36 37 38 39 02 79 6F 00\\r\\n//{\\\"numberNamePhoto\\\":{\\\"call\\\":1,\\\"noCard\\\":0,\\\"number\\\":\\\"123456789\\\",\\\"enable\\\":1,\\\"sms\\\":1,\\\"name\\\":\\\"yo\\\",\\\"headURL\\\":\\\"\\\",\\\"index\\\":0}}\\r\\n// para pruebas en local Contact':\\r\\n//AB 10 12 00 94 ED 00 00 02 10 34 E0 09 31 32 33 34 35 36 37 38 39 02 79 6F 00\\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 phoneNumber = '';\\r\\nvar numberLength = '00';\\r\\nvar numberHex = '';\\r\\nvar nameLength = '00';\\r\\nvar nameHex = '';\\r\\nvar value = '02';\\r\\nvar keyLength = '00';\\r\\nvar confTel = '';\\r\\nvar count = 1; // approved contact will be from A2 to A9 - index 1 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 += \\\"0534\\\" + 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 phoneNumber = params.ApprovedContacts[contact].Contact;\\r\\n if (phoneNumber.startsWith(\\\"+\\\")) {\\r\\n phoneNumber = \\\"00\\\" + phoneNumber.substring(1);\\r\\n }\\r\\n numberHex = ascii_to_hexa(phoneNumber).toUpperCase();\\r\\n numberLength = ('00' + decimalToHex(phoneNumber.length)).slice(-2).toUpperCase();\\r\\n nameHex = ascii_to_hexa(params.ApprovedContacts[contact].Name).toUpperCase();\\r\\n nameLength = ('00' + decimalToHex(params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n keyLength = ('00' + decimalToHex(5 + phoneNumber.length + params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n value += keyLength + \\\"34\\\" + confTel + numberLength + numberHex + nameLength + nameHex + '00'; //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 phoneNumber = params.ApprovedContacts[contact].Contact;\\r\\n if (phoneNumber.startsWith(\\\"+\\\")) {\\r\\n phoneNumber = \\\"00\\\" + phoneNumber.substring(1);\\r\\n }\\r\\n numberHex = ascii_to_hexa(phoneNumber).toUpperCase();\\r\\n numberLength = ('00' + decimalToHex(phoneNumber.length)).slice(-2).toUpperCase();\\r\\n nameHex = ascii_to_hexa(params.ApprovedContacts[contact].Name).toUpperCase();\\r\\n nameLength = ('00' + decimalToHex(params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n keyLength = ('00' + decimalToHex(5 + phoneNumber.length + params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n value += keyLength + \\\"34\\\" + confTel + numberLength + numberHex + nameLength + nameHex + '00'; //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 += \\\"0534\\\" + 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}\",\"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":1765219392}],"LanguageId":null,"Tags":[]},{"Id":12340,"Group":{"Id":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7376,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7369,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7368,"Name":"Controls","Json":{"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":7374,"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":7375,"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":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":"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":[{"Type":1,"NewValue":"{\"Id\":12340,\"Group\":{\"Id\":7391,\"Name\":\"Non Movement Settings\",\"Json\":{\"description\":null,\"columns\":1,\"order\":3,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"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\\\":true,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"The time the VIP has to be still before the non-movement alarm is raised\\\",\\\"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\":[]}","Timestamp":1750696539},{"Type":2,"NewValue":"{\"Id\":12340,\"Group\":{\"Id\":7391,\"Name\":\"Non Movement Settings\",\"Json\":{\"description\":null,\"columns\":1,\"order\":3,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"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\\\":true,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"The time the VIP has to be still before the non-movement alarm is raised\\\",\\\"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\":[]}","Timestamp":1751039803}],"LanguageId":null,"Tags":[]},{"Id":12341,"Group":{"Id":7391,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7376,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7369,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7366,"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":7367,"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":7370,"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":7371,"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":7372,"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":7373,"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":7378,"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":7387,"Name":"Read Fall Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7388,"Name":"Read Non Movement Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7380,"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":7368,"Name":"Controls","Json":{"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":7374,"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":7375,"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":7377,"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":7389,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7401,"Name":"office","Json":{"description":null,"columns":1,"order":3,"listSize":20,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":7390,"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":7394,"Name":"Eulalia","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7398,"Name":"juan","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7399,"Name":"ana","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7402,"Name":"Teams Luton","Json":{"description":"","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":7379,"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":7384,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7385,"Name":"No Activity","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":"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":[{"Type":1,"NewValue":"{\"Id\":12341,\"Group\":{\"Id\":7391,\"Name\":\"Non Movement Settings\",\"Json\":{\"description\":null,\"columns\":1,\"order\":3,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Enable Disable Non Movement Settings\",\"Json\":\"{\\\"name\\\":\\\"Enable Disable Non Movement Settings\\\",\\\"default\\\":\\\"false\\\",\\\"description\\\":\\\"Toggle Non-movement alert\\\",\\\"type\\\":\\\"enable\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":true,\\\"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\":\"true\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1750696525},{"Type":2,"NewValue":"{\"Id\":12341,\"Group\":{\"Id\":7391,\"Name\":\"Non Movement Settings\",\"Json\":{\"description\":null,\"columns\":1,\"order\":3,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Enable Disable Non Movement Settings\",\"Json\":\"{\\\"name\\\":\\\"Enable Disable Non Movement Settings\\\",\\\"default\\\":\\\"false\\\",\\\"description\\\":\\\"Toggle Non-movement alert\\\",\\\"type\\\":\\\"enable\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":true,\\\"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\":\"true\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751039756}],"LanguageId":null,"Tags":[]},{"Id":12351,"Group":{"Id":7412,"Name":"Read TeleHealth Settings","Json":{"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":"Enable Disable Steps","Json":"{\"name\":\"Enable Disable Steps\",\"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":[{"Type":0,"NewValue":"{\"Id\":12351,\"Group\":{\"Id\":7412,\"Name\":\"Read TeleHealth Settings\",\"Json\":{\"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\":\"Enable Disable Steps\",\"Json\":\"{\\\"name\\\":\\\"Enable Disable Steps\\\",\\\"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\":[]}","Timestamp":1748624079},{"Type":2,"NewValue":"{\"Id\":12351,\"Group\":{\"Id\":7412,\"Name\":\"Read TeleHealth Settings\",\"Json\":{\"description\":\"Read TeleHealth Settings\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Enable Disable Steps\",\"Json\":\"{\\\"name\\\":\\\"Enable Disable Steps\\\",\\\"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\":[]}","Timestamp":1749655895}],"LanguageId":null,"Tags":[]},{"Id":12352,"Group":{"Id":7412,"Name":"Read TeleHealth Settings","Json":{"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":"Reporting Frequency","Json":"{\"name\":\"Reporting Frequency\",\"default\":\"\",\"description\":null,\"type\":\"radioGroup\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Current reporting frequency for Steps\",\"options\":[{\"label\":\"12 hours\",\"value\":\"12\"},{\"label\":\"6 hours\",\"value\":\"6\"},{\"label\":\"1 hour\",\"value\":\"1\"},{\"label\":\"30 mins\",\"value\":\"30\"}],\"toTranslate\":[\"name\",\"description\",\"helpText\",\"label\"]}","Default":"","Command":null,"ProtocolActionObjects":[{"Type":0,"NewValue":"{\"Id\":12352,\"Group\":{\"Id\":7412,\"Name\":\"Read TeleHealth Settings\",\"Json\":{\"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\":\"Reporting Frequency\",\"Json\":\"{\\\"name\\\":\\\"Reporting Frequency\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":null,\\\"type\\\":\\\"radioGroup\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Current reporting frequency for Steps\\\",\\\"options\\\":[{\\\"label\\\":\\\"12 hours\\\",\\\"value\\\":\\\"12\\\"},{\\\"label\\\":\\\"6 hours\\\",\\\"value\\\":\\\"6\\\"},{\\\"label\\\":\\\"1 hour\\\",\\\"value\\\":\\\"1\\\"},{\\\"label\\\":\\\"30 mins\\\",\\\"value\\\":\\\"30\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1748624251},{"Type":2,"NewValue":"{\"Id\":12352,\"Group\":{\"Id\":7412,\"Name\":\"Read TeleHealth Settings\",\"Json\":{\"description\":\"Read TeleHealth Settings\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Reporting Frequency\",\"Json\":\"{\\\"name\\\":\\\"Reporting Frequency\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":null,\\\"type\\\":\\\"radioGroup\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Current reporting frequency for Steps\\\",\\\"options\\\":[{\\\"label\\\":\\\"12 hours\\\",\\\"value\\\":\\\"12\\\"},{\\\"label\\\":\\\"6 hours\\\",\\\"value\\\":\\\"6\\\"},{\\\"label\\\":\\\"1 hour\\\",\\\"value\\\":\\\"1\\\"},{\\\"label\\\":\\\"30 mins\\\",\\\"value\\\":\\\"30\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1749655876}],"LanguageId":null,"Tags":[]},{"Id":12353,"Group":{"Id":7411,"Name":"TeleHealth Settings","Json":{"description":"A group for telehealth metrics such as steps and SPO2","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Enable Disable Steps","Json":"{\"name\":\"Enable Disable Steps\",\"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":[{"Type":0,"NewValue":"{\"Id\":12353,\"Group\":{\"Id\":7411,\"Name\":\"TeleHealth Settings\",\"Json\":{\"description\":\"A group for telehealth metrics such as steps and SPO2\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Enable Disable Steps\",\"Json\":\"{\\\"name\\\":\\\"Enable Disable Steps\\\",\\\"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\":[]}","Timestamp":1748624878},{"Type":2,"NewValue":"{\"Id\":12353,\"Group\":{\"Id\":7411,\"Name\":\"TeleHealth Settings\",\"Json\":{\"description\":\"A group for telehealth metrics such as steps and SPO2\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Enable Disable Steps\",\"Json\":\"{\\\"name\\\":\\\"Enable Disable Steps\\\",\\\"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\":[]}","Timestamp":1749656285}],"LanguageId":null,"Tags":[]},{"Id":12354,"Group":{"Id":7413,"Name":"Read Steps Settings","Json":{"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":"Enable Disable Read Steps Settings","Json":"{\"name\":\"Enable Disable Read Steps 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":[{"Type":0,"NewValue":"{\"Id\":12354,\"Group\":{\"Id\":7413,\"Name\":\"Read Steps Settings\",\"Json\":{\"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\":\"Enable Disable Read Steps Settings\",\"Json\":\"{\\\"name\\\":\\\"Enable Disable Read Steps 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\":[]}","Timestamp":1748625076}],"LanguageId":null,"Tags":[]},{"Id":12355,"Group":{"Id":7413,"Name":"Read Steps Settings","Json":{"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":"Reporting Frequency","Json":"{\"name\":\"Reporting Frequency\",\"default\":\"\",\"description\":null,\"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\":\"12 hours\",\"value\":\"12\"},{\"label\":\"6 hours\",\"value\":\"6\"},{\"label\":\"1 hour\",\"value\":\"1\"},{\"label\":\"30 mins\",\"value\":\"30\"}],\"toTranslate\":[\"name\",\"description\",\"helpText\",\"label\"]}","Default":"","Command":null,"ProtocolActionObjects":[{"Type":0,"NewValue":"{\"Id\":12355,\"Group\":{\"Id\":7413,\"Name\":\"Read Steps Settings\",\"Json\":{\"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\":\"Reporting Frequency\",\"Json\":\"{\\\"name\\\":\\\"Reporting Frequency\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":null,\\\"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\\\":\\\"12 hours\\\",\\\"value\\\":\\\"12\\\"},{\\\"label\\\":\\\"6 hours\\\",\\\"value\\\":\\\"6\\\"},{\\\"label\\\":\\\"1 hour\\\",\\\"value\\\":\\\"1\\\"},{\\\"label\\\":\\\"30 mins\\\",\\\"value\\\":\\\"30\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1748625468},{"Type":1,"NewValue":"{\"Id\":12355,\"Group\":{\"Id\":7413,\"Name\":\"Read Steps Settings\",\"Json\":{\"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\":\"Reporting Frequency\",\"Json\":\"{\\\"name\\\":\\\"Reporting Frequency\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":null,\\\"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\\\":\\\"12 hours\\\",\\\"value\\\":\\\"720\\\"},{\\\"label\\\":\\\"6 hours\\\",\\\"value\\\":\\\"360\\\"},{\\\"label\\\":\\\"1 hour\\\",\\\"value\\\":\\\"60\\\"},{\\\"label\\\":\\\"30 min\\\",\\\"value\\\":\\\"30\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1748971997},{"Type":1,"NewValue":"{\"Id\":12355,\"Group\":{\"Id\":7413,\"Name\":\"Read Steps Settings\",\"Json\":{\"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\":\"Reporting Frequency\",\"Json\":\"{\\\"name\\\":\\\"Reporting Frequency\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":null,\\\"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\\\":\\\"720\\\",\\\"label\\\":\\\"12 hours\\\"},{\\\"value\\\":\\\"360\\\",\\\"label\\\":\\\"6 hours\\\"},{\\\"value\\\":\\\"60\\\",\\\"label\\\":\\\"1 hour\\\"},{\\\"value\\\":\\\"30\\\",\\\"label\\\":\\\"30 min\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1749052743}],"LanguageId":null,"Tags":[]},{"Id":12356,"Group":{"Id":7414,"Name":"Read Heartrate Settings","Json":{"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":"Enable Disable Read Heartrate Settings","Json":"{\"name\":\"Enable Disable Read Heartrate 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":[{"Type":0,"NewValue":"{\"Id\":12356,\"Group\":{\"Id\":7414,\"Name\":\"Read Heartrate Settings\",\"Json\":{\"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\":\"Enable Disable Read Heartrate Settings\",\"Json\":\"{\\\"name\\\":\\\"Enable Disable Read Heartrate 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\":[]}","Timestamp":1748625605}],"LanguageId":null,"Tags":[]},{"Id":12357,"Group":{"Id":7414,"Name":"Read Heartrate Settings","Json":{"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":"Reporting Frequency","Json":"{\"name\":\"Reporting Frequency\",\"default\":\"\",\"description\":null,\"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\":\"12 hours\",\"value\":\"12\"},{\"label\":\"6 hours\",\"value\":\"6\"},{\"label\":\"1 hour\",\"value\":\"1\"},{\"label\":\"30 mins\",\"value\":\"30\"}],\"toTranslate\":[\"name\",\"description\",\"helpText\",\"label\"]}","Default":"","Command":null,"ProtocolActionObjects":[{"Type":0,"NewValue":"{\"Id\":12357,\"Group\":{\"Id\":7414,\"Name\":\"Read Heartrate Settings\",\"Json\":{\"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\":\"Reporting Frequency\",\"Json\":\"{\\\"name\\\":\\\"Reporting Frequency\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":null,\\\"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\\\":\\\"12 hours\\\",\\\"value\\\":\\\"12\\\"},{\\\"label\\\":\\\"6 hours\\\",\\\"value\\\":\\\"6\\\"},{\\\"label\\\":\\\"1 hour\\\",\\\"value\\\":\\\"1\\\"},{\\\"label\\\":\\\"30 mins\\\",\\\"value\\\":\\\"30\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1748625683},{"Type":1,"NewValue":"{\"Id\":12357,\"Group\":{\"Id\":7414,\"Name\":\"Read Heartrate Settings\",\"Json\":{\"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\":\"Reporting Frequency\",\"Json\":\"{\\\"name\\\":\\\"Reporting Frequency\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":null,\\\"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\\\":\\\"12 hours\\\",\\\"value\\\":\\\"720\\\"},{\\\"label\\\":\\\"6 hours\\\",\\\"value\\\":\\\"360\\\"},{\\\"label\\\":\\\"1 hour\\\",\\\"value\\\":\\\"60\\\"},{\\\"label\\\":\\\"30 min\\\",\\\"value\\\":\\\"30\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1748971849}],"LanguageId":null,"Tags":[]},{"Id":12358,"Group":{"Id":7411,"Name":"TeleHealth Settings","Json":{"description":"A group for telehealth metrics such as steps and SPO2","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Reporting Frequency","Json":"{\"name\":\"Reporting Frequency\",\"default\":\"\",\"description\":null,\"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\":[{\"label\":\"12 hours\",\"value\":\"12\"},{\"label\":\"6 hours\",\"value\":\"6\"},{\"label\":\"1 hour\",\"value\":\"1\"},{\"label\":\"30 mins\",\"value\":\"30\"}],\"toTranslate\":[\"name\",\"description\",\"helpText\",\"label\"]}","Default":"","Command":null,"ProtocolActionObjects":[{"Type":0,"NewValue":"{\"Id\":12358,\"Group\":{\"Id\":7411,\"Name\":\"TeleHealth Settings\",\"Json\":{\"description\":\"A group for telehealth metrics such as steps and SPO2\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Reporting Frequency\",\"Json\":\"{\\\"name\\\":\\\"Reporting Frequency\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":null,\\\"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\\\":[{\\\"label\\\":\\\"12 hours\\\",\\\"value\\\":\\\"12\\\"},{\\\"label\\\":\\\"6 hours\\\",\\\"value\\\":\\\"6\\\"},{\\\"label\\\":\\\"1 hour\\\",\\\"value\\\":\\\"1\\\"},{\\\"label\\\":\\\"30 mins\\\",\\\"value\\\":\\\"30\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1748625885},{"Type":2,"NewValue":"{\"Id\":12358,\"Group\":{\"Id\":7411,\"Name\":\"TeleHealth Settings\",\"Json\":{\"description\":\"A group for telehealth metrics such as steps and SPO2\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Reporting Frequency\",\"Json\":\"{\\\"name\\\":\\\"Reporting Frequency\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":null,\\\"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\\\":[{\\\"label\\\":\\\"12 hours\\\",\\\"value\\\":\\\"12\\\"},{\\\"label\\\":\\\"6 hours\\\",\\\"value\\\":\\\"6\\\"},{\\\"label\\\":\\\"1 hour\\\",\\\"value\\\":\\\"1\\\"},{\\\"label\\\":\\\"30 mins\\\",\\\"value\\\":\\\"30\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1749656300}],"LanguageId":null,"Tags":[]},{"Id":12359,"Group":{"Id":7415,"Name":"Steps Settings","Json":{"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":"Enable Disable Steps Settings","Json":"{\"name\":\"Enable Disable Steps 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":[{"Type":0,"NewValue":"{\"Id\":12359,\"Group\":{\"Id\":7415,\"Name\":\"Steps Settings\",\"Json\":{\"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\":\"Enable Disable Steps Settings\",\"Json\":\"{\\\"name\\\":\\\"Enable Disable Steps 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\":[]}","Timestamp":1748626017},{"Type":1,"NewValue":"{\"Id\":12359,\"Group\":{\"Id\":7415,\"Name\":\"Steps Settings\",\"Json\":{\"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\":\"Enable Disable Steps Settings\",\"Json\":\"{\\\"name\\\":\\\"Enable Disable Steps Settings\\\",\\\"default\\\":\\\"false\\\",\\\"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\":[]}","Timestamp":1748972551},{"Type":0,"NewValue":"{\"Id\":12359,\"Group\":{\"Id\":7415,\"Name\":\"Steps Settings\",\"Json\":{\"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\":\"Enable Disable Steps Settings\",\"Json\":\"{\\\"name\\\":\\\"Enable Disable Steps Settings\\\",\\\"default\\\":\\\"false\\\",\\\"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\":{\"Id\":5739,\"Protocol\":{\"Id\":297,\"Code\":\"Access TEC Care Watch\",\"Version\":\"0.2\",\"FirmwareVersion\":\"\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"setStepCollectSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"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.StepsSettings.ReportingFrequency) {\\n var heartBeat = parseInt(params.StepsSettings.ReportingFrequency);\\n heartBeat = decimalToHex(heartBeat);\\n heartBeat = ('000000' + heartBeat).slice(-6).toUpperCase();\\n if (params.StepsSettings.EnableDisableStepsSettings == '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 = '58020000';\\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}\",\"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":1748972555},{"Type":1,"NewValue":"{\"Id\":12359,\"Group\":{\"Id\":7415,\"Name\":\"Steps Settings\",\"Json\":{\"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\":\"Enable Disable Steps Settings\",\"Json\":\"{\\\"name\\\":\\\"Enable Disable Steps Settings\\\",\\\"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\":[]}","Timestamp":1749574292},{"Type":0,"NewValue":"{\"Id\":12359,\"Group\":{\"Id\":7415,\"Name\":\"Steps Settings\",\"Json\":{\"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\":\"Enable Disable Steps Settings\",\"Json\":\"{\\\"name\\\":\\\"Enable Disable Steps Settings\\\",\\\"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\":{\"Id\":5807,\"Protocol\":{\"Id\":297,\"Code\":\"Access TEC Care Watch\",\"Version\":\"0.3\",\"FirmwareVersion\":\"V06.8601.2501\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"setEnableStep\",\"TemplateSMS\":null,\"Template\":\"<>\",\"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 true\\nvalue += '1';\\n// Voice true\\nvalue += '1';\\n// Vibration true\\nvalue += '1';\\n// Cell Tower True\\nvalue += '1';\\n// Wifi true\\nvalue += '1';\\n// SOS speaker true\\nvalue += '1';\\n// Side call Speaker true\\nvalue += '1';\\n// BLE stay connected true\\nvalue += '1';\\n// BLE locating true\\nvalue += '1';\\n// SOS Call Voice true\\nvalue += '1';\\n// BLE always on true\\nvalue += '1';\\n// GPS location true\\nvalue += '1';\\n// TCP fast true\\nvalue += '1';\\n// Rotate screen to iluminate true\\nvalue += '1'; //watch only girar muñeca para iluminar pantalla\\n// Beacon true\\nvalue += '1';\\n// activity fuction true\\nvalue += '1'; // activity fuction, \\n//step counting, \\nif (params.StepsSettings.EnableDisableStepsSettings == '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';\\n// stop call sequence true\\nvalue += '1';\\n// other no use\\nvalue += '00000000';\\n// auto update false\\nvalue += '0';\\n// AGPS true\\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":1749574296},{"Type":2,"NewValue":"{\"Id\":12359,\"Group\":{\"Id\":7415,\"Name\":\"Steps Settings\",\"Json\":{\"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\":\"Enable Disable Steps Settings\",\"Json\":\"{\\\"name\\\":\\\"Enable Disable Steps Settings\\\",\\\"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\":{\"Id\":5739,\"Protocol\":{\"Id\":297,\"Code\":\"Access TEC Care Watch\",\"Version\":\"0.3\",\"FirmwareVersion\":\"V06.8601.2501\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"setStepCollectSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"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.StepsSettings.ReportingFrequency) {\\n var heartBeat = parseInt(params.StepsSettings.ReportingFrequency) * 60; //in seconds\\n heartBeat = decimalToHex(heartBeat);\\n heartBeat = ('000000' + heartBeat).slice(-6).toUpperCase();\\n if (params.StepsSettings.EnableDisableStepsSettings == '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 = '58020000';\\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}\",\"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":1749574299},{"Type":1,"NewValue":"{\"Id\":12359,\"Group\":{\"Id\":7415,\"Name\":\"Steps Settings\",\"Json\":{\"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\":\"Enable Disable Steps Settings\",\"Json\":\"{\\\"name\\\":\\\"Enable Disable Steps Settings\\\",\\\"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\":[]}","Timestamp":1749574476},{"Type":0,"NewValue":"{\"Id\":12359,\"Group\":{\"Id\":7415,\"Name\":\"Steps Settings\",\"Json\":{\"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\":\"Enable Disable Steps Settings\",\"Json\":\"{\\\"name\\\":\\\"Enable Disable Steps Settings\\\",\\\"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\":{\"Id\":5806,\"Protocol\":{\"Id\":297,\"Code\":\"Access TEC Care Watch\",\"Version\":\"0.3\",\"FirmwareVersion\":\"V06.8601.2501\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"setWatchSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"// Watch Settings\\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 Watch Settings' Only enable y disable:\\r\\n// params.StepCounting.EnableDisableStepCounting == 'true'\\r\\n// params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true'\\r\\n//var params = {StepCounting:{'EnableDisableStepCounting':'true'},HeartRateMonitor:{'EnableDisableHeartRateMonitor':'true'}, DeviceVersion:{'DeviceVersion':2}}\\r\\n// Test enabled both\\r\\n// AB 10 13 00 40 6F 00 00 02 11 36 00 08 1A 00 00 3E 00 00 00 14 00 00 00 00 00 00\\r\\n// test step on HRT off\\r\\n// 02 11 36 00 08 0A 00 00 3C 00 00 00 14 00 00 00 00 00 00\\r\\n// test step off HRT on\\r\\n// 02 11 36 00 08 12 00 00 3A 00 00 00 14 00 00 00 00 00 00\\r\\n// test both off \\r\\n// 02 11 36 00 08 02 00 00 38 00 00 00 14 00 00 00 00 00 00 \\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\n// configuration command (0X02) , lenght and key\\r\\nvar messageBody = '021136';\\r\\n// step count/heart value display\\r\\n// Watch setting related FACE ID\\r\\nmessageBody += '00'; // Default FACE ID 0 \\r\\n// Future\\r\\n//if (params.WatchFace.SetWatchFace) {\\r\\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \\r\\n//} else {\\r\\n// messageBody += '00'; // Analog Face Default FACE ID 0 \\r\\n//}\\r\\n// Watch Display setting related to Step and heart rate settings\\r\\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true')) {\\r\\n messageBody += '081A0000'; //both displays\\r\\n messageBody += '06000000'; //menu 1 and 2\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'false')) {\\r\\n messageBody += '080A0000'; // step display\\r\\n messageBody += '04000000'; //menu 2\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true')) {\\r\\n messageBody += '08120000'; // heart display\\r\\n messageBody += '02000000'; //menu 1\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'false')) {\\r\\n messageBody += '08020000'; // no displays\\r\\n messageBody += '00000000'; // no menu\\r\\n} else {\\r\\n messageBody += '08020000'; //no displays\\r\\n messageBody += '00000000'; // no menu\\r\\n}\\r\\n//menu items for the future\\r\\n/*if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '06000000'; //menu 1 and 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '04000000'; //menu 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '02000000'; //menu 1\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '00000000'; // no menu\\r\\n} else {\\r\\n messageBody += '00000000'; // no menu\\r\\n}*/\\r\\n// from autohome page to the end\\r\\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\\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\":0,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":true,\"SendAttempts\":4,\"Order\":null},\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1749574479},{"Type":1,"NewValue":"{\"Id\":12359,\"Group\":{\"Id\":7415,\"Name\":\"Steps Settings\",\"Json\":{\"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\":\"Enable Disable Steps Settings\",\"Json\":\"{\\\"name\\\":\\\"Enable Disable Steps Settings\\\",\\\"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\":[]}","Timestamp":1765220760},{"Type":0,"NewValue":"{\"Id\":12359,\"Group\":{\"Id\":7415,\"Name\":\"Steps Settings\",\"Json\":{\"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\":\"Enable Disable Steps Settings\",\"Json\":\"{\\\"name\\\":\\\"Enable Disable Steps Settings\\\",\\\"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\":{\"Id\":5819,\"Protocol\":{\"Id\":297,\"Code\":\"Access TEC Care Watch\",\"Version\":\"1.6\",\"FirmwareVersion\":\"V06.8601.2501\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"setAuthorisedNumbersAndWatchSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"// Combinated version setAuthorisedNumber with Watch Settings for EV06\\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// AB 10 22 00 32 FA 00 00 02 11 36 00 00 00 00 00 00 00 00 00 14 00 00 00 00 0A 00 0E 34 80 09 31 32 33 34 35 36 37 38 39 00 00\\r\\n// [Length]:11 [Key]:36 [Value]:00 00 00 00 00 00 00 00 00 14 00 00 00 00 0A 00\\r\\n//{\\\"watch\\\":{\\\"status18\\\":0,\\\"status17\\\":0,\\\"status19\\\":0,\\\"status10\\\":0,\\\"flagValue\\\":0,\\\"status12\\\":0,\\\"faceId\\\":0,\\\"status11\\\":0,\\\"status14\\\":0,\\\"status13\\\":0,\\\"status16\\\":0,\\\"status15\\\":0,\\\"status0\\\":0,\\\"status1\\\":0,\\\"menu8\\\":0,\\\"menu7\\\":0,\\\"menu6\\\":0,\\\"menu5\\\":0,\\\"menu4\\\":0,\\\"menu3\\\":0,\\\"menu2\\\":0,\\\"menu1\\\":0,\\\"autoTime\\\":20,\\\"brightNess\\\":0,\\\"logoIndex\\\":0,\\\"status20\\\":0,\\\"status8\\\":0,\\\"status9\\\":0,\\\"status2\\\":0,\\\"status3\\\":0,\\\"brightTime\\\":10}}\\r\\n//[Length]:0E [Key]:34 [Value]:80 09 31 32 33 34 35 36 37 38 39 00 00\\r\\n//{\\\"numberNamePhoto\\\":{\\\"call\\\":0,\\\"noCard\\\":0,\\\"number\\\":\\\"123456789\\\",\\\"enable\\\":1,\\\"sms\\\":0,\\\"name\\\":\\\"\\\",\\\"headURL\\\":\\\"\\\",\\\"index\\\":0}}\\r\\n// para pruebas en local Contact':\\r\\n//AB 10 12 00 94 ED 00 00 02 10 34 E0 09 31 32 33 34 35 36 37 38 39 02 79 6F 00\\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 phoneNumber = '';\\r\\nvar numberLength = '00';\\r\\nvar numberHex = '';\\r\\nvar nameLength = '00';\\r\\nvar nameHex = '';\\r\\nvar value = '02';\\r\\nvar keyLength = '00';\\r\\nvar confTel = '';\\r\\nvar count = 1; // approved contact will be from A2 to A9 - index 1 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\\ncounter = 0; // to check how many contacts are in the lists\\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 += \\\"0534\\\" + 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 phoneNumber = params.ApprovedContacts[contact].Contact;\\r\\n if (phoneNumber.startsWith(\\\"+\\\")) {\\r\\n phoneNumber = \\\"00\\\" + phoneNumber.substring(1);\\r\\n }\\r\\n numberHex = ascii_to_hexa(phoneNumber).toUpperCase();\\r\\n numberLength = ('00' + decimalToHex(phoneNumber.length)).slice(-2).toUpperCase();\\r\\n nameHex = ascii_to_hexa(params.ApprovedContacts[contact].Name).toUpperCase();\\r\\n nameLength = ('00' + decimalToHex(params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n keyLength = ('00' + decimalToHex(5 + phoneNumber.length + params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n value += keyLength + \\\"34\\\" + confTel + numberLength + numberHex + nameLength + nameHex + '00'; //no photo\\r\\n //value += keyLength + \\\"30\\\" + confTel + numberHex; //no photo \\r\\n counter++;\\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 phoneNumber = params.ApprovedContacts[contact].Contact;\\r\\n if (phoneNumber.startsWith(\\\"+\\\")) {\\r\\n phoneNumber = \\\"00\\\" + phoneNumber.substring(1);\\r\\n }\\r\\n numberHex = ascii_to_hexa(phoneNumber).toUpperCase();\\r\\n numberLength = ('00' + decimalToHex(phoneNumber.length)).slice(-2).toUpperCase();\\r\\n nameHex = ascii_to_hexa(params.ApprovedContacts[contact].Name).toUpperCase();\\r\\n nameLength = ('00' + decimalToHex(params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n keyLength = ('00' + decimalToHex(5 + phoneNumber.length + params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n value += keyLength + \\\"34\\\" + confTel + numberLength + numberHex + nameLength + nameHex + '00'; //no photo\\r\\n //value += keyLength + \\\"30\\\" + confTel + numberHex; //no photo \\r\\n counter++;\\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 += \\\"0534\\\" + confTel + '000000'; //no number, no name, no photo\\r\\n}\\r\\n// watch settings section\\r\\n// lenght and key\\r\\nvar messageBody = '1136';\\r\\n// step count/heart value display\\r\\n// Watch setting related FACE ID\\r\\nmessageBody += '00'; // Default FACE ID 0 \\r\\n// Future\\r\\n//if (params.WatchFace.SetWatchFace) {\\r\\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \\r\\n//} else {\\r\\n// messageBody += '00'; // Analog Face Default FACE ID 0 \\r\\n//}\\r\\n// Watch Display setting related to Step and heart rate settings\\r\\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '081B0000'; //both displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += (counter > 0) ? 'E' : '6';\\r\\n //messageBody += '6'; //menu 1 and 2 \\r\\n //messageBody += 'E'; //menu 1 and 2 and contact (menu 3) \\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '080B0000'; // step display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '4'; //menu 2 \\r\\n //messageBody += 'C'; // menu 2 and contact (menu 3) \\r\\n messageBody += (counter > 0) ? 'C' : '4';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '08130000'; // heart display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '2'; //menu 1 no contact (menu 3) \\r\\n //messageBody += 'A'; //menu 1 and contact (menu 3) \\r\\n messageBody += (counter > 0) ? 'A' : '2';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '08030000'; // no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '0000000'; // no menu , //08 only contact\\r\\n //messageBody += '8'; // //08 only contact\\r\\n messageBody += (counter > 0) ? '8' : '0';\\r\\n messageBody += '000000'; // other settings\\r\\n} else {\\r\\n messageBody += '08030000'; //no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '0000000'; // no menu..\\r\\n}\\r\\n// from autohome page to the end\\r\\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\\r\\nvalue += messageBody; //add watchsetting hex to contact hex in value var \\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}\",\"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":1765220764},{"Type":2,"NewValue":"{\"Id\":12359,\"Group\":{\"Id\":7415,\"Name\":\"Steps Settings\",\"Json\":{\"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\":\"Enable Disable Steps Settings\",\"Json\":\"{\\\"name\\\":\\\"Enable Disable Steps Settings\\\",\\\"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\":{\"Id\":5806,\"Protocol\":{\"Id\":297,\"Code\":\"Access TEC Care Watch\",\"Version\":\"1.6\",\"FirmwareVersion\":\"V06.8601.2501\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"setWatchSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"// Watch Settings\\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 Watch Settings' Only enable y disable:\\r\\n// params.StepCounting.EnableDisableStepCounting == 'true'\\r\\n// params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true'\\r\\n//var params = {StepCounting:{'EnableDisableStepCounting':'true'},HeartRateMonitor:{'EnableDisableHeartRateMonitor':'true'}, DeviceVersion:{'DeviceVersion':2}}\\r\\n// Test enabled both\\r\\n// AB 10 13 00 99 6A 0A 00 02 11 36 00 08 1B 00 00 0E 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step on HRT off\\r\\n// AB 10 13 00 DD 0C 0B 00 02 11 36 00 08 0B 00 00 0C 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step off HRT on\\r\\n// AB 10 13 00 B5 D0 09 00 02 11 36 00 08 13 00 00 0A 00 00 00 14 00 00 00 03 0A 01\\r\\n// test both off \\r\\n// AB 10 13 00 F1 B6 0C 00 02 11 36 00 08 03 00 00 08 00 00 00 14 00 00 00 03 0A 01 \\r\\n// comando para Contact on ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 4C 2E 03 00 02 11 36 00 08 1B 00 00 4E 00 00 00 14 00 00 00 03 0A 01\\r\\n// comando para contact off ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 C2 8C 04 00 02 11 36 00 08 1B 00 00 46 00 00 00 14 00 00 00 03 0A 01\\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\n// To store the quantity of contacts in the whitelist to enable disable the contact menu\\r\\n//var contactos = params.ApprovedContacts && params.ApprovedContacts.Contact;\\r\\n//var numDuplas = Array.isArray(params.ApprovedContacts) ? params.ApprovedContacts.length : 0;\\r\\n//var numDuplas = params.ApprovedContacts;\\r\\nlet numDuplas = 2;\\r\\n//for (const key in params.ApprovedContacts) {\\r\\n// if (params.ApprovedContacts[key] && params.ApprovedContacts[key].Contact && params.ApprovedContacts[key].Contact !== \\\"\\\") {\\r\\n// numDuplas++;\\r\\n// }\\r\\n//}\\r\\n//for (const key in params.ApprovedContacts) {\\r\\n// if (params.ApprovedContacts[key] && params.ApprovedContacts[key].Contact && params.ApprovedContacts[key].Contact !== \\\"\\\") {\\r\\n// numDuplas++;\\r\\n// }\\r\\n//}\\r\\n// configuration command (0X02) , lenght and key\\r\\nvar messageBody = '021136';\\r\\n// step count/heart value display\\r\\n// Watch setting related FACE ID\\r\\nmessageBody += '00'; // Default FACE ID 0 \\r\\n// Future\\r\\n//if (params.WatchFace.SetWatchFace) {\\r\\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \\r\\n//} else {\\r\\n// messageBody += '00'; // Analog Face Default FACE ID 0 \\r\\n//}\\r\\n// Watch Display setting related to Step and heart rate settings\\r\\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '081B0000'; //both displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += (numDuplas > 0) ? 'E' : '6';\\r\\n //messageBody += '6'; //menu 1 and 2 \\r\\n //messageBody += 'E'; //menu 1 and 2 and contact (menu 3) \\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '080B0000'; // step display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '4'; //menu 2 \\r\\n //messageBody += 'C'; // menu 2 and contact (menu 3) \\r\\n messageBody += (numDuplas > 0) ? 'C' : '4';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '08130000'; // heart display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '2'; //menu 1 no contact (menu 3) \\r\\n //messageBody += 'A'; //menu 1 and contact (menu 3) \\r\\n messageBody += (numDuplas > 0) ? 'A' : '2';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '08030000'; // no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '0000000'; // no menu , //08 only contact\\r\\n //messageBody += '8'; // //08 only contact\\r\\n messageBody += (numDuplas > 0) ? '8' : '0';\\r\\n messageBody += '000000'; // other settings\\r\\n} else {\\r\\n messageBody += '08030000'; //no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '0000000'; // no menu..\\r\\n}\\r\\n//menu items for the future\\r\\n/*if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '06000000'; //menu 1 and 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '04000000'; //menu 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '02000000'; //menu 1\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '00000000'; // no menu\\r\\n} else {\\r\\n messageBody += '00000000'; // no menu\\r\\n}*/\\r\\n// from autohome page to the end\\r\\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\\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\\n//AddValueSMS('dataSMS', dataSMS);\\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// functions\\r\\nfunction AddValue(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n var arr1 = [];\\r\\n for (var n = 0, l = str.length; n < l; n++) {\\r\\n var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n arr1.push(hex);\\r\\n }\\r\\n return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n var crc = 0x0000;\\r\\n var j, i;\\r\\n for (i = 0; i < s.length; i++) {\\r\\n c = s[i];\\r\\n if (c > 255) {\\r\\n throw new RangeError();\\r\\n }\\r\\n j = (c ^ (crc >> 8)) & 0xFF;\\r\\n crc = crcTable[j] ^ (crc << 8);\\r\\n }\\r\\n return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n var splitStr = []\\r\\n var j = 0\\r\\n for (let i = 0; i < str.length; i += 2) {\\r\\n splitStr[j] = str.substring(i, i + 2)\\r\\n j++\\r\\n }\\r\\n var bytes = []\\r\\n var bytePos = 0\\r\\n for (let i = 0; i < splitStr.length; i++) {\\r\\n var byteStr = splitStr[i]\\r\\n var b = parseInt(byteStr, 16)\\r\\n if (b < 256) {\\r\\n bytes[bytePos] = b\\r\\n bytePos++\\r\\n }\\r\\n }\\r\\n return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n hexString = str.toString(16);\\r\\n return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n let bin = 0;\\r\\n let rem, i = 1,\\r\\n step = 1;\\r\\n while (x != 0) {\\r\\n rem = x % 2;\\r\\n x = parseInt(x / 2);\\r\\n bin = bin + rem * i;\\r\\n i = i * 10;\\r\\n }\\r\\n return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n var hexa = parseInt(x, 2).toString(16);\\r\\n return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n const result = [];\\r\\n let len = string.length - 2;\\r\\n while (len >= 0) {\\r\\n result.push(string.substr(len, 2));\\r\\n len -= 2;\\r\\n }\\r\\n return result.join('');\\r\\n}\",\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":true,\"SendAttempts\":4,\"Order\":null},\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1765220766}],"LanguageId":null,"Tags":[]},{"Id":12360,"Group":{"Id":7415,"Name":"Steps Settings","Json":{"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":"Reporting Frequency","Json":"{\"name\":\"Reporting Frequency\",\"default\":\"\",\"description\":null,\"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\":[{\"label\":\"12 hours\",\"value\":\"12\"},{\"label\":\"6 hours\",\"value\":\"6\"},{\"label\":\"1 hour\",\"value\":\"1\"},{\"label\":\"30 mins\",\"value\":\"30\"}],\"toTranslate\":[\"name\",\"description\",\"helpText\",\"label\"]}","Default":"","Command":null,"ProtocolActionObjects":[{"Type":0,"NewValue":"{\"Id\":12360,\"Group\":{\"Id\":7415,\"Name\":\"Steps Settings\",\"Json\":{\"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\":\"Reporting Frequency\",\"Json\":\"{\\\"name\\\":\\\"Reporting Frequency\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":null,\\\"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\\\":[{\\\"label\\\":\\\"12 hours\\\",\\\"value\\\":\\\"12\\\"},{\\\"label\\\":\\\"6 hours\\\",\\\"value\\\":\\\"6\\\"},{\\\"label\\\":\\\"1 hour\\\",\\\"value\\\":\\\"1\\\"},{\\\"label\\\":\\\"30 mins\\\",\\\"value\\\":\\\"30\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1748626066},{"Type":1,"NewValue":"{\"Id\":12360,\"Group\":{\"Id\":7415,\"Name\":\"Steps Settings\",\"Json\":{\"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\":\"Reporting Frequency\",\"Json\":\"{\\\"name\\\":\\\"Reporting Frequency\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":null,\\\"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\\\":[{\\\"label\\\":\\\"12 hours\\\",\\\"value\\\":\\\"720\\\"},{\\\"label\\\":\\\"6 hours\\\",\\\"value\\\":\\\"360\\\"},{\\\"label\\\":\\\"1 hour\\\",\\\"value\\\":\\\"60\\\"},{\\\"label\\\":\\\"30 min\\\",\\\"value\\\":\\\"30\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1748972076},{"Type":1,"NewValue":"{\"Id\":12360,\"Group\":{\"Id\":7415,\"Name\":\"Steps Settings\",\"Json\":{\"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\":\"Reporting Frequency\",\"Json\":\"{\\\"name\\\":\\\"Reporting Frequency\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":null,\\\"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\\\":\\\"720\\\",\\\"label\\\":\\\"12 hours\\\"},{\\\"value\\\":\\\"360\\\",\\\"label\\\":\\\"6 hours\\\"},{\\\"value\\\":\\\"60\\\",\\\"label\\\":\\\"1 hour\\\"},{\\\"value\\\":\\\"30\\\",\\\"label\\\":\\\"30 min\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1748972586},{"Type":0,"NewValue":"{\"Id\":12360,\"Group\":{\"Id\":7415,\"Name\":\"Steps Settings\",\"Json\":{\"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\":\"Reporting Frequency\",\"Json\":\"{\\\"name\\\":\\\"Reporting Frequency\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":null,\\\"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\\\":\\\"720\\\",\\\"label\\\":\\\"12 hours\\\"},{\\\"value\\\":\\\"360\\\",\\\"label\\\":\\\"6 hours\\\"},{\\\"value\\\":\\\"60\\\",\\\"label\\\":\\\"1 hour\\\"},{\\\"value\\\":\\\"30\\\",\\\"label\\\":\\\"30 min\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"]}\",\"Default\":\"\",\"Command\":{\"Id\":5739,\"Protocol\":{\"Id\":297,\"Code\":\"Access TEC Care Watch\",\"Version\":\"0.2\",\"FirmwareVersion\":\"\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"setStepCollectSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"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.StepsSettings.ReportingFrequency) {\\n var heartBeat = parseInt(params.StepsSettings.ReportingFrequency);\\n heartBeat = decimalToHex(heartBeat);\\n heartBeat = ('000000' + heartBeat).slice(-6).toUpperCase();\\n if (params.StepsSettings.EnableDisableStepsSettings == '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 = '58020000';\\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}\",\"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":1748972589},{"Type":1,"NewValue":"{\"Id\":12360,\"Group\":{\"Id\":7415,\"Name\":\"Steps Settings\",\"Json\":{\"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\":\"Reporting Frequency\",\"Json\":\"{\\\"name\\\":\\\"Reporting Frequency\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":null,\\\"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\\\":\\\"720\\\",\\\"label\\\":\\\"12 hours\\\"},{\\\"value\\\":\\\"360\\\",\\\"label\\\":\\\"6 hours\\\"},{\\\"value\\\":\\\"60\\\",\\\"label\\\":\\\"1 hour\\\"},{\\\"value\\\":\\\"30\\\",\\\"label\\\":\\\"30 min\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1749052795},{"Type":2,"NewValue":"{\"Id\":12360,\"Group\":{\"Id\":7415,\"Name\":\"Steps Settings\",\"Json\":{\"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\":\"Reporting Frequency\",\"Json\":\"{\\\"name\\\":\\\"Reporting Frequency\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":null,\\\"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\\\":\\\"720\\\",\\\"label\\\":\\\"12 hours\\\"},{\\\"value\\\":\\\"360\\\",\\\"label\\\":\\\"6 hours\\\"},{\\\"value\\\":\\\"60\\\",\\\"label\\\":\\\"1 hour\\\"},{\\\"value\\\":\\\"30\\\",\\\"label\\\":\\\"30 min\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"]}\",\"Default\":\"\",\"Command\":{\"Id\":5739,\"Protocol\":{\"Id\":297,\"Code\":\"Access TEC Care Watch\",\"Version\":\"0.3\",\"FirmwareVersion\":\"\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"setStepCollectSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"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.StepsSettings.ReportingFrequency) {\\n var heartBeat = parseInt(params.StepsSettings.ReportingFrequency);\\n heartBeat = decimalToHex(heartBeat);\\n heartBeat = ('000000' + heartBeat).slice(-6).toUpperCase();\\n if (params.StepsSettings.EnableDisableStepsSettings == '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 = '58020000';\\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}\",\"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":1749052799}],"LanguageId":null,"Tags":[]},{"Id":12361,"Group":{"Id":7416,"Name":"Heartrate Settings","Json":{"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":"Enable Disable Heartrate Settings","Json":"{\"name\":\"Enable Disable Heartrate 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":[{"Type":0,"NewValue":"{\"Id\":12361,\"Group\":{\"Id\":7416,\"Name\":\"Heartrate Settings\",\"Json\":{\"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\":\"Enable Disable Heartrate Settings\",\"Json\":\"{\\\"name\\\":\\\"Enable Disable Heartrate 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\":[]}","Timestamp":1748626090},{"Type":1,"NewValue":"{\"Id\":12361,\"Group\":{\"Id\":7416,\"Name\":\"Heartrate Settings\",\"Json\":{\"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\":\"Enable Disable Heartrate Settings\",\"Json\":\"{\\\"name\\\":\\\"Enable Disable Heartrate Settings\\\",\\\"default\\\":\\\"false\\\",\\\"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\":[]}","Timestamp":1748971292},{"Type":0,"NewValue":"{\"Id\":12361,\"Group\":{\"Id\":7416,\"Name\":\"Heartrate Settings\",\"Json\":{\"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\":\"Enable Disable Heartrate Settings\",\"Json\":\"{\\\"name\\\":\\\"Enable Disable Heartrate Settings\\\",\\\"default\\\":\\\"false\\\",\\\"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\":{\"Id\":5726,\"Protocol\":{\"Id\":297,\"Code\":\"Access TEC Care Watch\",\"Version\":\"0.2\",\"FirmwareVersion\":\"\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"setHeartRateDetectingInterval\",\"TemplateSMS\":null,\"Template\":\"<>\",\"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.HeartrateSettings.ReportingFrequency) {\\n var heartBeat = parseInt(params.HeartrateSettings.ReportingFrequency);\\n heartBeat = decimalToHex(heartBeat);\\n heartBeat = ('000000' + heartBeat).slice(-6).toUpperCase();\\n if (params.HeartrateSettings.EnableDisableHeartrateSettings == '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 = '58020000'\\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}\",\"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":1748971295},{"Type":1,"NewValue":"{\"Id\":12361,\"Group\":{\"Id\":7416,\"Name\":\"Heartrate Settings\",\"Json\":{\"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\":\"Enable Disable Heartrate Settings\",\"Json\":\"{\\\"name\\\":\\\"Enable Disable Heartrate Settings\\\",\\\"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\":[]}","Timestamp":1749574458},{"Type":0,"NewValue":"{\"Id\":12361,\"Group\":{\"Id\":7416,\"Name\":\"Heartrate Settings\",\"Json\":{\"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\":\"Enable Disable Heartrate Settings\",\"Json\":\"{\\\"name\\\":\\\"Enable Disable Heartrate Settings\\\",\\\"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\":{\"Id\":5806,\"Protocol\":{\"Id\":297,\"Code\":\"Access TEC Care Watch\",\"Version\":\"0.3\",\"FirmwareVersion\":\"V06.8601.2501\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"setWatchSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"// Watch Settings\\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 Watch Settings' Only enable y disable:\\r\\n// params.StepCounting.EnableDisableStepCounting == 'true'\\r\\n// params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true'\\r\\n//var params = {StepCounting:{'EnableDisableStepCounting':'true'},HeartRateMonitor:{'EnableDisableHeartRateMonitor':'true'}, DeviceVersion:{'DeviceVersion':2}}\\r\\n// Test enabled both\\r\\n// AB 10 13 00 40 6F 00 00 02 11 36 00 08 1A 00 00 3E 00 00 00 14 00 00 00 00 00 00\\r\\n// test step on HRT off\\r\\n// 02 11 36 00 08 0A 00 00 3C 00 00 00 14 00 00 00 00 00 00\\r\\n// test step off HRT on\\r\\n// 02 11 36 00 08 12 00 00 3A 00 00 00 14 00 00 00 00 00 00\\r\\n// test both off \\r\\n// 02 11 36 00 08 02 00 00 38 00 00 00 14 00 00 00 00 00 00 \\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\n// configuration command (0X02) , lenght and key\\r\\nvar messageBody = '021136';\\r\\n// step count/heart value display\\r\\n// Watch setting related FACE ID\\r\\nmessageBody += '00'; // Default FACE ID 0 \\r\\n// Future\\r\\n//if (params.WatchFace.SetWatchFace) {\\r\\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \\r\\n//} else {\\r\\n// messageBody += '00'; // Analog Face Default FACE ID 0 \\r\\n//}\\r\\n// Watch Display setting related to Step and heart rate settings\\r\\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true')) {\\r\\n messageBody += '081A0000'; //both displays\\r\\n messageBody += '06000000'; //menu 1 and 2\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'false')) {\\r\\n messageBody += '080A0000'; // step display\\r\\n messageBody += '04000000'; //menu 2\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true')) {\\r\\n messageBody += '08120000'; // heart display\\r\\n messageBody += '02000000'; //menu 1\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'false')) {\\r\\n messageBody += '08020000'; // no displays\\r\\n messageBody += '00000000'; // no menu\\r\\n} else {\\r\\n messageBody += '08020000'; //no displays\\r\\n messageBody += '00000000'; // no menu\\r\\n}\\r\\n//menu items for the future\\r\\n/*if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '06000000'; //menu 1 and 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '04000000'; //menu 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '02000000'; //menu 1\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '00000000'; // no menu\\r\\n} else {\\r\\n messageBody += '00000000'; // no menu\\r\\n}*/\\r\\n// from autohome page to the end\\r\\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\\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\":0,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":true,\"SendAttempts\":4,\"Order\":null},\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1749574461},{"Type":1,"NewValue":"{\"Id\":12361,\"Group\":{\"Id\":7416,\"Name\":\"Heartrate Settings\",\"Json\":{\"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\":\"Enable Disable Heartrate Settings\",\"Json\":\"{\\\"name\\\":\\\"Enable Disable Heartrate Settings\\\",\\\"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\":[]}","Timestamp":1765220584},{"Type":0,"NewValue":"{\"Id\":12361,\"Group\":{\"Id\":7416,\"Name\":\"Heartrate Settings\",\"Json\":{\"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\":\"Enable Disable Heartrate Settings\",\"Json\":\"{\\\"name\\\":\\\"Enable Disable Heartrate Settings\\\",\\\"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\":{\"Id\":5819,\"Protocol\":{\"Id\":297,\"Code\":\"Access TEC Care Watch\",\"Version\":\"1.6\",\"FirmwareVersion\":\"V06.8601.2501\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"setAuthorisedNumbersAndWatchSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"// Combinated version setAuthorisedNumber with Watch Settings for EV06\\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// AB 10 22 00 32 FA 00 00 02 11 36 00 00 00 00 00 00 00 00 00 14 00 00 00 00 0A 00 0E 34 80 09 31 32 33 34 35 36 37 38 39 00 00\\r\\n// [Length]:11 [Key]:36 [Value]:00 00 00 00 00 00 00 00 00 14 00 00 00 00 0A 00\\r\\n//{\\\"watch\\\":{\\\"status18\\\":0,\\\"status17\\\":0,\\\"status19\\\":0,\\\"status10\\\":0,\\\"flagValue\\\":0,\\\"status12\\\":0,\\\"faceId\\\":0,\\\"status11\\\":0,\\\"status14\\\":0,\\\"status13\\\":0,\\\"status16\\\":0,\\\"status15\\\":0,\\\"status0\\\":0,\\\"status1\\\":0,\\\"menu8\\\":0,\\\"menu7\\\":0,\\\"menu6\\\":0,\\\"menu5\\\":0,\\\"menu4\\\":0,\\\"menu3\\\":0,\\\"menu2\\\":0,\\\"menu1\\\":0,\\\"autoTime\\\":20,\\\"brightNess\\\":0,\\\"logoIndex\\\":0,\\\"status20\\\":0,\\\"status8\\\":0,\\\"status9\\\":0,\\\"status2\\\":0,\\\"status3\\\":0,\\\"brightTime\\\":10}}\\r\\n//[Length]:0E [Key]:34 [Value]:80 09 31 32 33 34 35 36 37 38 39 00 00\\r\\n//{\\\"numberNamePhoto\\\":{\\\"call\\\":0,\\\"noCard\\\":0,\\\"number\\\":\\\"123456789\\\",\\\"enable\\\":1,\\\"sms\\\":0,\\\"name\\\":\\\"\\\",\\\"headURL\\\":\\\"\\\",\\\"index\\\":0}}\\r\\n// para pruebas en local Contact':\\r\\n//AB 10 12 00 94 ED 00 00 02 10 34 E0 09 31 32 33 34 35 36 37 38 39 02 79 6F 00\\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 phoneNumber = '';\\r\\nvar numberLength = '00';\\r\\nvar numberHex = '';\\r\\nvar nameLength = '00';\\r\\nvar nameHex = '';\\r\\nvar value = '02';\\r\\nvar keyLength = '00';\\r\\nvar confTel = '';\\r\\nvar count = 1; // approved contact will be from A2 to A9 - index 1 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\\ncounter = 0; // to check how many contacts are in the lists\\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 += \\\"0534\\\" + 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 phoneNumber = params.ApprovedContacts[contact].Contact;\\r\\n if (phoneNumber.startsWith(\\\"+\\\")) {\\r\\n phoneNumber = \\\"00\\\" + phoneNumber.substring(1);\\r\\n }\\r\\n numberHex = ascii_to_hexa(phoneNumber).toUpperCase();\\r\\n numberLength = ('00' + decimalToHex(phoneNumber.length)).slice(-2).toUpperCase();\\r\\n nameHex = ascii_to_hexa(params.ApprovedContacts[contact].Name).toUpperCase();\\r\\n nameLength = ('00' + decimalToHex(params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n keyLength = ('00' + decimalToHex(5 + phoneNumber.length + params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n value += keyLength + \\\"34\\\" + confTel + numberLength + numberHex + nameLength + nameHex + '00'; //no photo\\r\\n //value += keyLength + \\\"30\\\" + confTel + numberHex; //no photo \\r\\n counter++;\\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 phoneNumber = params.ApprovedContacts[contact].Contact;\\r\\n if (phoneNumber.startsWith(\\\"+\\\")) {\\r\\n phoneNumber = \\\"00\\\" + phoneNumber.substring(1);\\r\\n }\\r\\n numberHex = ascii_to_hexa(phoneNumber).toUpperCase();\\r\\n numberLength = ('00' + decimalToHex(phoneNumber.length)).slice(-2).toUpperCase();\\r\\n nameHex = ascii_to_hexa(params.ApprovedContacts[contact].Name).toUpperCase();\\r\\n nameLength = ('00' + decimalToHex(params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n keyLength = ('00' + decimalToHex(5 + phoneNumber.length + params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n value += keyLength + \\\"34\\\" + confTel + numberLength + numberHex + nameLength + nameHex + '00'; //no photo\\r\\n //value += keyLength + \\\"30\\\" + confTel + numberHex; //no photo \\r\\n counter++;\\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 += \\\"0534\\\" + confTel + '000000'; //no number, no name, no photo\\r\\n}\\r\\n// watch settings section\\r\\n// lenght and key\\r\\nvar messageBody = '1136';\\r\\n// step count/heart value display\\r\\n// Watch setting related FACE ID\\r\\nmessageBody += '00'; // Default FACE ID 0 \\r\\n// Future\\r\\n//if (params.WatchFace.SetWatchFace) {\\r\\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \\r\\n//} else {\\r\\n// messageBody += '00'; // Analog Face Default FACE ID 0 \\r\\n//}\\r\\n// Watch Display setting related to Step and heart rate settings\\r\\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '081B0000'; //both displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += (counter > 0) ? 'E' : '6';\\r\\n //messageBody += '6'; //menu 1 and 2 \\r\\n //messageBody += 'E'; //menu 1 and 2 and contact (menu 3) \\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '080B0000'; // step display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '4'; //menu 2 \\r\\n //messageBody += 'C'; // menu 2 and contact (menu 3) \\r\\n messageBody += (counter > 0) ? 'C' : '4';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '08130000'; // heart display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '2'; //menu 1 no contact (menu 3) \\r\\n //messageBody += 'A'; //menu 1 and contact (menu 3) \\r\\n messageBody += (counter > 0) ? 'A' : '2';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '08030000'; // no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '0000000'; // no menu , //08 only contact\\r\\n //messageBody += '8'; // //08 only contact\\r\\n messageBody += (counter > 0) ? '8' : '0';\\r\\n messageBody += '000000'; // other settings\\r\\n} else {\\r\\n messageBody += '08030000'; //no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '0000000'; // no menu..\\r\\n}\\r\\n// from autohome page to the end\\r\\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\\r\\nvalue += messageBody; //add watchsetting hex to contact hex in value var \\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}\",\"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":1765220587},{"Type":2,"NewValue":"{\"Id\":12361,\"Group\":{\"Id\":7416,\"Name\":\"Heartrate Settings\",\"Json\":{\"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\":\"Enable Disable Heartrate Settings\",\"Json\":\"{\\\"name\\\":\\\"Enable Disable Heartrate Settings\\\",\\\"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\":{\"Id\":5806,\"Protocol\":{\"Id\":297,\"Code\":\"Access TEC Care Watch\",\"Version\":\"1.6\",\"FirmwareVersion\":\"V06.8601.2501\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"setWatchSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"// Watch Settings\\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 Watch Settings' Only enable y disable:\\r\\n// params.StepCounting.EnableDisableStepCounting == 'true'\\r\\n// params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true'\\r\\n//var params = {StepCounting:{'EnableDisableStepCounting':'true'},HeartRateMonitor:{'EnableDisableHeartRateMonitor':'true'}, DeviceVersion:{'DeviceVersion':2}}\\r\\n// Test enabled both\\r\\n// AB 10 13 00 99 6A 0A 00 02 11 36 00 08 1B 00 00 0E 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step on HRT off\\r\\n// AB 10 13 00 DD 0C 0B 00 02 11 36 00 08 0B 00 00 0C 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step off HRT on\\r\\n// AB 10 13 00 B5 D0 09 00 02 11 36 00 08 13 00 00 0A 00 00 00 14 00 00 00 03 0A 01\\r\\n// test both off \\r\\n// AB 10 13 00 F1 B6 0C 00 02 11 36 00 08 03 00 00 08 00 00 00 14 00 00 00 03 0A 01 \\r\\n// comando para Contact on ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 4C 2E 03 00 02 11 36 00 08 1B 00 00 4E 00 00 00 14 00 00 00 03 0A 01\\r\\n// comando para contact off ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 C2 8C 04 00 02 11 36 00 08 1B 00 00 46 00 00 00 14 00 00 00 03 0A 01\\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\n// To store the quantity of contacts in the whitelist to enable disable the contact menu\\r\\n//var contactos = params.ApprovedContacts && params.ApprovedContacts.Contact;\\r\\n//var numDuplas = Array.isArray(params.ApprovedContacts) ? params.ApprovedContacts.length : 0;\\r\\n//var numDuplas = params.ApprovedContacts;\\r\\nlet numDuplas = 2;\\r\\n//for (const key in params.ApprovedContacts) {\\r\\n// if (params.ApprovedContacts[key] && params.ApprovedContacts[key].Contact && params.ApprovedContacts[key].Contact !== \\\"\\\") {\\r\\n// numDuplas++;\\r\\n// }\\r\\n//}\\r\\n//for (const key in params.ApprovedContacts) {\\r\\n// if (params.ApprovedContacts[key] && params.ApprovedContacts[key].Contact && params.ApprovedContacts[key].Contact !== \\\"\\\") {\\r\\n// numDuplas++;\\r\\n// }\\r\\n//}\\r\\n// configuration command (0X02) , lenght and key\\r\\nvar messageBody = '021136';\\r\\n// step count/heart value display\\r\\n// Watch setting related FACE ID\\r\\nmessageBody += '00'; // Default FACE ID 0 \\r\\n// Future\\r\\n//if (params.WatchFace.SetWatchFace) {\\r\\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \\r\\n//} else {\\r\\n// messageBody += '00'; // Analog Face Default FACE ID 0 \\r\\n//}\\r\\n// Watch Display setting related to Step and heart rate settings\\r\\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '081B0000'; //both displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += (numDuplas > 0) ? 'E' : '6';\\r\\n //messageBody += '6'; //menu 1 and 2 \\r\\n //messageBody += 'E'; //menu 1 and 2 and contact (menu 3) \\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '080B0000'; // step display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '4'; //menu 2 \\r\\n //messageBody += 'C'; // menu 2 and contact (menu 3) \\r\\n messageBody += (numDuplas > 0) ? 'C' : '4';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '08130000'; // heart display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '2'; //menu 1 no contact (menu 3) \\r\\n //messageBody += 'A'; //menu 1 and contact (menu 3) \\r\\n messageBody += (numDuplas > 0) ? 'A' : '2';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '08030000'; // no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '0000000'; // no menu , //08 only contact\\r\\n //messageBody += '8'; // //08 only contact\\r\\n messageBody += (numDuplas > 0) ? '8' : '0';\\r\\n messageBody += '000000'; // other settings\\r\\n} else {\\r\\n messageBody += '08030000'; //no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '0000000'; // no menu..\\r\\n}\\r\\n//menu items for the future\\r\\n/*if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '06000000'; //menu 1 and 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '04000000'; //menu 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '02000000'; //menu 1\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '00000000'; // no menu\\r\\n} else {\\r\\n messageBody += '00000000'; // no menu\\r\\n}*/\\r\\n// from autohome page to the end\\r\\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\\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\\n//AddValueSMS('dataSMS', dataSMS);\\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// functions\\r\\nfunction AddValue(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n var arr1 = [];\\r\\n for (var n = 0, l = str.length; n < l; n++) {\\r\\n var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n arr1.push(hex);\\r\\n }\\r\\n return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n var crc = 0x0000;\\r\\n var j, i;\\r\\n for (i = 0; i < s.length; i++) {\\r\\n c = s[i];\\r\\n if (c > 255) {\\r\\n throw new RangeError();\\r\\n }\\r\\n j = (c ^ (crc >> 8)) & 0xFF;\\r\\n crc = crcTable[j] ^ (crc << 8);\\r\\n }\\r\\n return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n var splitStr = []\\r\\n var j = 0\\r\\n for (let i = 0; i < str.length; i += 2) {\\r\\n splitStr[j] = str.substring(i, i + 2)\\r\\n j++\\r\\n }\\r\\n var bytes = []\\r\\n var bytePos = 0\\r\\n for (let i = 0; i < splitStr.length; i++) {\\r\\n var byteStr = splitStr[i]\\r\\n var b = parseInt(byteStr, 16)\\r\\n if (b < 256) {\\r\\n bytes[bytePos] = b\\r\\n bytePos++\\r\\n }\\r\\n }\\r\\n return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n hexString = str.toString(16);\\r\\n return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n let bin = 0;\\r\\n let rem, i = 1,\\r\\n step = 1;\\r\\n while (x != 0) {\\r\\n rem = x % 2;\\r\\n x = parseInt(x / 2);\\r\\n bin = bin + rem * i;\\r\\n i = i * 10;\\r\\n }\\r\\n return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n var hexa = parseInt(x, 2).toString(16);\\r\\n return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n const result = [];\\r\\n let len = string.length - 2;\\r\\n while (len >= 0) {\\r\\n result.push(string.substr(len, 2));\\r\\n len -= 2;\\r\\n }\\r\\n return result.join('');\\r\\n}\",\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":true,\"SendAttempts\":4,\"Order\":null},\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1765220589}],"LanguageId":null,"Tags":[]},{"Id":12362,"Group":{"Id":7416,"Name":"Heartrate Settings","Json":{"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":"Reporting Frequency","Json":"{\"name\":\"Reporting Frequency\",\"default\":\"\",\"description\":null,\"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\":[{\"label\":\"12 hours\",\"value\":\"12\"},{\"label\":\"6 hours\",\"value\":\"6\"},{\"label\":\"1 hour\",\"value\":\"1\"},{\"label\":\"30 mins\",\"value\":\"30\"}],\"toTranslate\":[\"name\",\"description\",\"helpText\",\"label\"]}","Default":"","Command":null,"ProtocolActionObjects":[{"Type":0,"NewValue":"{\"Id\":12362,\"Group\":{\"Id\":7416,\"Name\":\"Heartrate Settings\",\"Json\":{\"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\":\"Reporting Frequency\",\"Json\":\"{\\\"name\\\":\\\"Reporting Frequency\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":null,\\\"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\\\":[{\\\"label\\\":\\\"12 hours\\\",\\\"value\\\":\\\"12\\\"},{\\\"label\\\":\\\"6 hours\\\",\\\"value\\\":\\\"6\\\"},{\\\"label\\\":\\\"1 hour\\\",\\\"value\\\":\\\"1\\\"},{\\\"label\\\":\\\"30 mins\\\",\\\"value\\\":\\\"30\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1748626142},{"Type":1,"NewValue":"{\"Id\":12362,\"Group\":{\"Id\":7416,\"Name\":\"Heartrate Settings\",\"Json\":{\"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\":\"Reporting Frequency\",\"Json\":\"{\\\"name\\\":\\\"Reporting Frequency\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":null,\\\"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\\\":[{\\\"label\\\":\\\"12 hours\\\",\\\"value\\\":\\\"720\\\"},{\\\"label\\\":\\\"6 hours\\\",\\\"value\\\":\\\"360\\\"},{\\\"label\\\":\\\"1 hours\\\",\\\"value\\\":\\\"60\\\"},{\\\"label\\\":\\\"30 min\\\",\\\"value\\\":\\\"30\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1748971385},{"Type":0,"NewValue":"{\"Id\":12362,\"Group\":{\"Id\":7416,\"Name\":\"Heartrate Settings\",\"Json\":{\"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\":\"Reporting Frequency\",\"Json\":\"{\\\"name\\\":\\\"Reporting Frequency\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":null,\\\"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\\\":[{\\\"label\\\":\\\"12 hours\\\",\\\"value\\\":\\\"720\\\"},{\\\"label\\\":\\\"6 hours\\\",\\\"value\\\":\\\"360\\\"},{\\\"label\\\":\\\"1 hours\\\",\\\"value\\\":\\\"60\\\"},{\\\"label\\\":\\\"30 min\\\",\\\"value\\\":\\\"30\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"]}\",\"Default\":\"\",\"Command\":{\"Id\":5726,\"Protocol\":{\"Id\":297,\"Code\":\"Access TEC Care Watch\",\"Version\":\"0.2\",\"FirmwareVersion\":\"\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"setHeartRateDetectingInterval\",\"TemplateSMS\":null,\"Template\":\"<>\",\"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.HeartrateSettings.ReportingFrequency) {\\n var heartBeat = parseInt(params.HeartrateSettings.ReportingFrequency);\\n heartBeat = decimalToHex(heartBeat);\\n heartBeat = ('000000' + heartBeat).slice(-6).toUpperCase();\\n if (params.HeartrateSettings.EnableDisableHeartrateSettings == '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 = '58020000'\\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}\",\"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":1748971389},{"Type":1,"NewValue":"{\"Id\":12362,\"Group\":{\"Id\":7416,\"Name\":\"Heartrate Settings\",\"Json\":{\"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\":\"Reporting Frequency\",\"Json\":\"{\\\"name\\\":\\\"Reporting Frequency\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":null,\\\"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\\\":\\\"720\\\",\\\"label\\\":\\\"12 hours\\\"},{\\\"value\\\":\\\"360\\\",\\\"label\\\":\\\"6 hours\\\"},{\\\"label\\\":\\\"1 hour\\\",\\\"value\\\":\\\"60\\\"},{\\\"label\\\":\\\"30\\\",\\\"value\\\":\\\"min\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1748974585},{"Type":1,"NewValue":"{\"Id\":12362,\"Group\":{\"Id\":7416,\"Name\":\"Heartrate Settings\",\"Json\":{\"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\":\"Reporting Frequency\",\"Json\":\"{\\\"name\\\":\\\"Reporting Frequency\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":null,\\\"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\\\":\\\"720\\\",\\\"label\\\":\\\"12 hours\\\"},{\\\"value\\\":\\\"360\\\",\\\"label\\\":\\\"6 hours\\\"},{\\\"value\\\":\\\"60\\\",\\\"label\\\":\\\"1 hour\\\"},{\\\"label\\\":\\\"30 min\\\",\\\"value\\\":\\\"30\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1749057954},{"Type":1,"NewValue":"{\"Id\":12362,\"Group\":{\"Id\":7416,\"Name\":\"Heartrate Settings\",\"Json\":{\"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\":\"Reporting Frequency\",\"Json\":\"{\\\"name\\\":\\\"Reporting Frequency\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":null,\\\"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\\\":\\\"720\\\",\\\"label\\\":\\\"12 hours\\\"},{\\\"value\\\":\\\"360\\\",\\\"label\\\":\\\"6 hours\\\"},{\\\"value\\\":\\\"60\\\",\\\"label\\\":\\\"1 hour\\\"},{\\\"value\\\":\\\"30\\\",\\\"label\\\":\\\"30 min\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1764839130},{"Type":0,"NewValue":"{\"Id\":12362,\"Group\":{\"Id\":7416,\"Name\":\"Heartrate Settings\",\"Json\":{\"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\":\"Reporting Frequency\",\"Json\":\"{\\\"name\\\":\\\"Reporting Frequency\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":null,\\\"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\\\":\\\"720\\\",\\\"label\\\":\\\"12 hours\\\"},{\\\"value\\\":\\\"360\\\",\\\"label\\\":\\\"6 hours\\\"},{\\\"value\\\":\\\"60\\\",\\\"label\\\":\\\"1 hour\\\"},{\\\"value\\\":\\\"30\\\",\\\"label\\\":\\\"30 min\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"]}\",\"Default\":\"\",\"Command\":{\"Id\":5806,\"Protocol\":{\"Id\":297,\"Code\":\"Access TEC Care Watch\",\"Version\":\"1.6\",\"FirmwareVersion\":\"V06.8601.2501\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"setWatchSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"// Watch Settings\\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 Watch Settings' Only enable y disable:\\r\\n// params.StepCounting.EnableDisableStepCounting == 'true'\\r\\n// params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true'\\r\\n//var params = {StepCounting:{'EnableDisableStepCounting':'true'},HeartRateMonitor:{'EnableDisableHeartRateMonitor':'true'}, DeviceVersion:{'DeviceVersion':2}}\\r\\n// Test enabled both\\r\\n// AB 10 13 00 99 6A 0A 00 02 11 36 00 08 1B 00 00 0E 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step on HRT off\\r\\n// AB 10 13 00 DD 0C 0B 00 02 11 36 00 08 0B 00 00 0C 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step off HRT on\\r\\n// AB 10 13 00 B5 D0 09 00 02 11 36 00 08 13 00 00 0A 00 00 00 14 00 00 00 03 0A 01\\r\\n// test both off \\r\\n// AB 10 13 00 F1 B6 0C 00 02 11 36 00 08 03 00 00 08 00 00 00 14 00 00 00 03 0A 01 \\r\\n// comando para Contact on ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 4C 2E 03 00 02 11 36 00 08 1B 00 00 4E 00 00 00 14 00 00 00 03 0A 01\\r\\n// comando para contact off ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 C2 8C 04 00 02 11 36 00 08 1B 00 00 46 00 00 00 14 00 00 00 03 0A 01\\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\n// To store the quantity of contacts in the whitelist to enable disable the contact menu\\r\\n//var contactos = params.ApprovedContacts && params.ApprovedContacts.Contact;\\r\\nvar numDuplas = Array.isArray(params.ApprovedContacts) ? params.ApprovedContacts.length : 0;\\r\\n// configuration command (0X02) , lenght and key\\r\\nvar messageBody = '021136';\\r\\n// step count/heart value display\\r\\n// Watch setting related FACE ID\\r\\nmessageBody += '00'; // Default FACE ID 0 \\r\\n// Future\\r\\n//if (params.WatchFace.SetWatchFace) {\\r\\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \\r\\n//} else {\\r\\n// messageBody += '00'; // Analog Face Default FACE ID 0 \\r\\n//}\\r\\n// Watch Display setting related to Step and heart rate settings\\r\\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '081B0000'; //both displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += (numDuplas > 0) ? 'E' : '6';\\r\\n //messageBody += '6'; //menu 1 and 2 \\r\\n //messageBody += 'E'; //menu 1 and 2 and contact (menu 3) \\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '080B0000'; // step display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '4'; //menu 2 \\r\\n //messageBody += 'C'; // menu 2 and contact (menu 3) \\r\\n messageBody += (numDuplas > 0) ? 'C' : '4';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '08130000'; // heart display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '2'; //menu 1 no contact (menu 3) \\r\\n //messageBody += 'A'; //menu 1 and contact (menu 3) \\r\\n messageBody += (numDuplas > 0) ? 'A' : '2';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '08030000'; // no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '0000000'; // no menu , //08 only contact\\r\\n //messageBody += '8'; // //08 only contact\\r\\n messageBody += (numDuplas > 0) ? '8' : '0';\\r\\n messageBody += '000000'; // other settings\\r\\n} else {\\r\\n messageBody += '08030000'; //no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '0000000'; // no menu..\\r\\n}\\r\\n//menu items for the future\\r\\n/*if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '06000000'; //menu 1 and 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '04000000'; //menu 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '02000000'; //menu 1\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '00000000'; // no menu\\r\\n} else {\\r\\n messageBody += '00000000'; // no menu\\r\\n}*/\\r\\n// from autohome page to the end\\r\\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\\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\\n//AddValueSMS('dataSMS', dataSMS);\\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// functions\\r\\nfunction AddValue(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n var arr1 = [];\\r\\n for (var n = 0, l = str.length; n < l; n++) {\\r\\n var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n arr1.push(hex);\\r\\n }\\r\\n return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n var crc = 0x0000;\\r\\n var j, i;\\r\\n for (i = 0; i < s.length; i++) {\\r\\n c = s[i];\\r\\n if (c > 255) {\\r\\n throw new RangeError();\\r\\n }\\r\\n j = (c ^ (crc >> 8)) & 0xFF;\\r\\n crc = crcTable[j] ^ (crc << 8);\\r\\n }\\r\\n return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n var splitStr = []\\r\\n var j = 0\\r\\n for (let i = 0; i < str.length; i += 2) {\\r\\n splitStr[j] = str.substring(i, i + 2)\\r\\n j++\\r\\n }\\r\\n var bytes = []\\r\\n var bytePos = 0\\r\\n for (let i = 0; i < splitStr.length; i++) {\\r\\n var byteStr = splitStr[i]\\r\\n var b = parseInt(byteStr, 16)\\r\\n if (b < 256) {\\r\\n bytes[bytePos] = b\\r\\n bytePos++\\r\\n }\\r\\n }\\r\\n return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n hexString = str.toString(16);\\r\\n return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n let bin = 0;\\r\\n let rem, i = 1,\\r\\n step = 1;\\r\\n while (x != 0) {\\r\\n rem = x % 2;\\r\\n x = parseInt(x / 2);\\r\\n bin = bin + rem * i;\\r\\n i = i * 10;\\r\\n }\\r\\n return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n var hexa = parseInt(x, 2).toString(16);\\r\\n return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n const result = [];\\r\\n let len = string.length - 2;\\r\\n while (len >= 0) {\\r\\n result.push(string.substr(len, 2));\\r\\n len -= 2;\\r\\n }\\r\\n return result.join('');\\r\\n}\",\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":true,\"SendAttempts\":4,\"Order\":null},\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1764839134},{"Type":1,"NewValue":"{\"Id\":12362,\"Group\":{\"Id\":7416,\"Name\":\"Heartrate Settings\",\"Json\":{\"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\":\"Reporting Frequency\",\"Json\":\"{\\\"name\\\":\\\"Reporting Frequency\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":null,\\\"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\\\":\\\"720\\\",\\\"label\\\":\\\"12 hours\\\"},{\\\"value\\\":\\\"360\\\",\\\"label\\\":\\\"6 hours\\\"},{\\\"value\\\":\\\"60\\\",\\\"label\\\":\\\"1 hour\\\"},{\\\"value\\\":\\\"30\\\",\\\"label\\\":\\\"30 min\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1765220655},{"Type":0,"NewValue":"{\"Id\":12362,\"Group\":{\"Id\":7416,\"Name\":\"Heartrate Settings\",\"Json\":{\"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\":\"Reporting Frequency\",\"Json\":\"{\\\"name\\\":\\\"Reporting Frequency\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":null,\\\"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\\\":\\\"720\\\",\\\"label\\\":\\\"12 hours\\\"},{\\\"value\\\":\\\"360\\\",\\\"label\\\":\\\"6 hours\\\"},{\\\"value\\\":\\\"60\\\",\\\"label\\\":\\\"1 hour\\\"},{\\\"value\\\":\\\"30\\\",\\\"label\\\":\\\"30 min\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"]}\",\"Default\":\"\",\"Command\":{\"Id\":5819,\"Protocol\":{\"Id\":297,\"Code\":\"Access TEC Care Watch\",\"Version\":\"1.6\",\"FirmwareVersion\":\"V06.8601.2501\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"setAuthorisedNumbersAndWatchSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"// Combinated version setAuthorisedNumber with Watch Settings for EV06\\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// AB 10 22 00 32 FA 00 00 02 11 36 00 00 00 00 00 00 00 00 00 14 00 00 00 00 0A 00 0E 34 80 09 31 32 33 34 35 36 37 38 39 00 00\\r\\n// [Length]:11 [Key]:36 [Value]:00 00 00 00 00 00 00 00 00 14 00 00 00 00 0A 00\\r\\n//{\\\"watch\\\":{\\\"status18\\\":0,\\\"status17\\\":0,\\\"status19\\\":0,\\\"status10\\\":0,\\\"flagValue\\\":0,\\\"status12\\\":0,\\\"faceId\\\":0,\\\"status11\\\":0,\\\"status14\\\":0,\\\"status13\\\":0,\\\"status16\\\":0,\\\"status15\\\":0,\\\"status0\\\":0,\\\"status1\\\":0,\\\"menu8\\\":0,\\\"menu7\\\":0,\\\"menu6\\\":0,\\\"menu5\\\":0,\\\"menu4\\\":0,\\\"menu3\\\":0,\\\"menu2\\\":0,\\\"menu1\\\":0,\\\"autoTime\\\":20,\\\"brightNess\\\":0,\\\"logoIndex\\\":0,\\\"status20\\\":0,\\\"status8\\\":0,\\\"status9\\\":0,\\\"status2\\\":0,\\\"status3\\\":0,\\\"brightTime\\\":10}}\\r\\n//[Length]:0E [Key]:34 [Value]:80 09 31 32 33 34 35 36 37 38 39 00 00\\r\\n//{\\\"numberNamePhoto\\\":{\\\"call\\\":0,\\\"noCard\\\":0,\\\"number\\\":\\\"123456789\\\",\\\"enable\\\":1,\\\"sms\\\":0,\\\"name\\\":\\\"\\\",\\\"headURL\\\":\\\"\\\",\\\"index\\\":0}}\\r\\n// para pruebas en local Contact':\\r\\n//AB 10 12 00 94 ED 00 00 02 10 34 E0 09 31 32 33 34 35 36 37 38 39 02 79 6F 00\\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 phoneNumber = '';\\r\\nvar numberLength = '00';\\r\\nvar numberHex = '';\\r\\nvar nameLength = '00';\\r\\nvar nameHex = '';\\r\\nvar value = '02';\\r\\nvar keyLength = '00';\\r\\nvar confTel = '';\\r\\nvar count = 1; // approved contact will be from A2 to A9 - index 1 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\\ncounter = 0; // to check how many contacts are in the lists\\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 += \\\"0534\\\" + 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 phoneNumber = params.ApprovedContacts[contact].Contact;\\r\\n if (phoneNumber.startsWith(\\\"+\\\")) {\\r\\n phoneNumber = \\\"00\\\" + phoneNumber.substring(1);\\r\\n }\\r\\n numberHex = ascii_to_hexa(phoneNumber).toUpperCase();\\r\\n numberLength = ('00' + decimalToHex(phoneNumber.length)).slice(-2).toUpperCase();\\r\\n nameHex = ascii_to_hexa(params.ApprovedContacts[contact].Name).toUpperCase();\\r\\n nameLength = ('00' + decimalToHex(params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n keyLength = ('00' + decimalToHex(5 + phoneNumber.length + params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n value += keyLength + \\\"34\\\" + confTel + numberLength + numberHex + nameLength + nameHex + '00'; //no photo\\r\\n //value += keyLength + \\\"30\\\" + confTel + numberHex; //no photo \\r\\n counter++;\\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 phoneNumber = params.ApprovedContacts[contact].Contact;\\r\\n if (phoneNumber.startsWith(\\\"+\\\")) {\\r\\n phoneNumber = \\\"00\\\" + phoneNumber.substring(1);\\r\\n }\\r\\n numberHex = ascii_to_hexa(phoneNumber).toUpperCase();\\r\\n numberLength = ('00' + decimalToHex(phoneNumber.length)).slice(-2).toUpperCase();\\r\\n nameHex = ascii_to_hexa(params.ApprovedContacts[contact].Name).toUpperCase();\\r\\n nameLength = ('00' + decimalToHex(params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n keyLength = ('00' + decimalToHex(5 + phoneNumber.length + params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n value += keyLength + \\\"34\\\" + confTel + numberLength + numberHex + nameLength + nameHex + '00'; //no photo\\r\\n //value += keyLength + \\\"30\\\" + confTel + numberHex; //no photo \\r\\n counter++;\\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 += \\\"0534\\\" + confTel + '000000'; //no number, no name, no photo\\r\\n}\\r\\n// watch settings section\\r\\n// lenght and key\\r\\nvar messageBody = '1136';\\r\\n// step count/heart value display\\r\\n// Watch setting related FACE ID\\r\\nmessageBody += '00'; // Default FACE ID 0 \\r\\n// Future\\r\\n//if (params.WatchFace.SetWatchFace) {\\r\\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \\r\\n//} else {\\r\\n// messageBody += '00'; // Analog Face Default FACE ID 0 \\r\\n//}\\r\\n// Watch Display setting related to Step and heart rate settings\\r\\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '081B0000'; //both displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += (counter > 0) ? 'E' : '6';\\r\\n //messageBody += '6'; //menu 1 and 2 \\r\\n //messageBody += 'E'; //menu 1 and 2 and contact (menu 3) \\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '080B0000'; // step display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '4'; //menu 2 \\r\\n //messageBody += 'C'; // menu 2 and contact (menu 3) \\r\\n messageBody += (counter > 0) ? 'C' : '4';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '08130000'; // heart display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '2'; //menu 1 no contact (menu 3) \\r\\n //messageBody += 'A'; //menu 1 and contact (menu 3) \\r\\n messageBody += (counter > 0) ? 'A' : '2';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '08030000'; // no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '0000000'; // no menu , //08 only contact\\r\\n //messageBody += '8'; // //08 only contact\\r\\n messageBody += (counter > 0) ? '8' : '0';\\r\\n messageBody += '000000'; // other settings\\r\\n} else {\\r\\n messageBody += '08030000'; //no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '0000000'; // no menu..\\r\\n}\\r\\n// from autohome page to the end\\r\\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\\r\\nvalue += messageBody; //add watchsetting hex to contact hex in value var \\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}\",\"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":1765220658},{"Type":2,"NewValue":"{\"Id\":12362,\"Group\":{\"Id\":7416,\"Name\":\"Heartrate Settings\",\"Json\":{\"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\":\"Reporting Frequency\",\"Json\":\"{\\\"name\\\":\\\"Reporting Frequency\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":null,\\\"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\\\":\\\"720\\\",\\\"label\\\":\\\"12 hours\\\"},{\\\"value\\\":\\\"360\\\",\\\"label\\\":\\\"6 hours\\\"},{\\\"value\\\":\\\"60\\\",\\\"label\\\":\\\"1 hour\\\"},{\\\"value\\\":\\\"30\\\",\\\"label\\\":\\\"30 min\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"]}\",\"Default\":\"\",\"Command\":{\"Id\":5806,\"Protocol\":{\"Id\":297,\"Code\":\"Access TEC Care Watch\",\"Version\":\"1.6\",\"FirmwareVersion\":\"V06.8601.2501\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"setWatchSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"// Watch Settings\\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 Watch Settings' Only enable y disable:\\r\\n// params.StepCounting.EnableDisableStepCounting == 'true'\\r\\n// params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true'\\r\\n//var params = {StepCounting:{'EnableDisableStepCounting':'true'},HeartRateMonitor:{'EnableDisableHeartRateMonitor':'true'}, DeviceVersion:{'DeviceVersion':2}}\\r\\n// Test enabled both\\r\\n// AB 10 13 00 99 6A 0A 00 02 11 36 00 08 1B 00 00 0E 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step on HRT off\\r\\n// AB 10 13 00 DD 0C 0B 00 02 11 36 00 08 0B 00 00 0C 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step off HRT on\\r\\n// AB 10 13 00 B5 D0 09 00 02 11 36 00 08 13 00 00 0A 00 00 00 14 00 00 00 03 0A 01\\r\\n// test both off \\r\\n// AB 10 13 00 F1 B6 0C 00 02 11 36 00 08 03 00 00 08 00 00 00 14 00 00 00 03 0A 01 \\r\\n// comando para Contact on ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 4C 2E 03 00 02 11 36 00 08 1B 00 00 4E 00 00 00 14 00 00 00 03 0A 01\\r\\n// comando para contact off ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 C2 8C 04 00 02 11 36 00 08 1B 00 00 46 00 00 00 14 00 00 00 03 0A 01\\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\n// To store the quantity of contacts in the whitelist to enable disable the contact menu\\r\\n//var contactos = params.ApprovedContacts && params.ApprovedContacts.Contact;\\r\\n//var numDuplas = Array.isArray(params.ApprovedContacts) ? params.ApprovedContacts.length : 0;\\r\\n//var numDuplas = params.ApprovedContacts;\\r\\nlet numDuplas = 2;\\r\\n//for (const key in params.ApprovedContacts) {\\r\\n// if (params.ApprovedContacts[key] && params.ApprovedContacts[key].Contact && params.ApprovedContacts[key].Contact !== \\\"\\\") {\\r\\n// numDuplas++;\\r\\n// }\\r\\n//}\\r\\n//for (const key in params.ApprovedContacts) {\\r\\n// if (params.ApprovedContacts[key] && params.ApprovedContacts[key].Contact && params.ApprovedContacts[key].Contact !== \\\"\\\") {\\r\\n// numDuplas++;\\r\\n// }\\r\\n//}\\r\\n// configuration command (0X02) , lenght and key\\r\\nvar messageBody = '021136';\\r\\n// step count/heart value display\\r\\n// Watch setting related FACE ID\\r\\nmessageBody += '00'; // Default FACE ID 0 \\r\\n// Future\\r\\n//if (params.WatchFace.SetWatchFace) {\\r\\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \\r\\n//} else {\\r\\n// messageBody += '00'; // Analog Face Default FACE ID 0 \\r\\n//}\\r\\n// Watch Display setting related to Step and heart rate settings\\r\\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '081B0000'; //both displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += (numDuplas > 0) ? 'E' : '6';\\r\\n //messageBody += '6'; //menu 1 and 2 \\r\\n //messageBody += 'E'; //menu 1 and 2 and contact (menu 3) \\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '080B0000'; // step display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '4'; //menu 2 \\r\\n //messageBody += 'C'; // menu 2 and contact (menu 3) \\r\\n messageBody += (numDuplas > 0) ? 'C' : '4';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '08130000'; // heart display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '2'; //menu 1 no contact (menu 3) \\r\\n //messageBody += 'A'; //menu 1 and contact (menu 3) \\r\\n messageBody += (numDuplas > 0) ? 'A' : '2';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '08030000'; // no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '0000000'; // no menu , //08 only contact\\r\\n //messageBody += '8'; // //08 only contact\\r\\n messageBody += (numDuplas > 0) ? '8' : '0';\\r\\n messageBody += '000000'; // other settings\\r\\n} else {\\r\\n messageBody += '08030000'; //no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '0000000'; // no menu..\\r\\n}\\r\\n//menu items for the future\\r\\n/*if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '06000000'; //menu 1 and 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '04000000'; //menu 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '02000000'; //menu 1\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '00000000'; // no menu\\r\\n} else {\\r\\n messageBody += '00000000'; // no menu\\r\\n}*/\\r\\n// from autohome page to the end\\r\\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\\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\\n//AddValueSMS('dataSMS', dataSMS);\\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// functions\\r\\nfunction AddValue(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n var arr1 = [];\\r\\n for (var n = 0, l = str.length; n < l; n++) {\\r\\n var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n arr1.push(hex);\\r\\n }\\r\\n return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n var crc = 0x0000;\\r\\n var j, i;\\r\\n for (i = 0; i < s.length; i++) {\\r\\n c = s[i];\\r\\n if (c > 255) {\\r\\n throw new RangeError();\\r\\n }\\r\\n j = (c ^ (crc >> 8)) & 0xFF;\\r\\n crc = crcTable[j] ^ (crc << 8);\\r\\n }\\r\\n return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n var splitStr = []\\r\\n var j = 0\\r\\n for (let i = 0; i < str.length; i += 2) {\\r\\n splitStr[j] = str.substring(i, i + 2)\\r\\n j++\\r\\n }\\r\\n var bytes = []\\r\\n var bytePos = 0\\r\\n for (let i = 0; i < splitStr.length; i++) {\\r\\n var byteStr = splitStr[i]\\r\\n var b = parseInt(byteStr, 16)\\r\\n if (b < 256) {\\r\\n bytes[bytePos] = b\\r\\n bytePos++\\r\\n }\\r\\n }\\r\\n return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n hexString = str.toString(16);\\r\\n return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n let bin = 0;\\r\\n let rem, i = 1,\\r\\n step = 1;\\r\\n while (x != 0) {\\r\\n rem = x % 2;\\r\\n x = parseInt(x / 2);\\r\\n bin = bin + rem * i;\\r\\n i = i * 10;\\r\\n }\\r\\n return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n var hexa = parseInt(x, 2).toString(16);\\r\\n return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n const result = [];\\r\\n let len = string.length - 2;\\r\\n while (len >= 0) {\\r\\n result.push(string.substr(len, 2));\\r\\n len -= 2;\\r\\n }\\r\\n return result.join('');\\r\\n}\",\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":true,\"SendAttempts\":4,\"Order\":null},\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1765220661}],"LanguageId":null,"Tags":[]},{"Id":12361,"Group":{"Id":7416,"Name":"Heartrate Settings","Json":{"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":"Enable Disable Heartrate Settings","Json":"{\"name\":\"Enable Disable Heartrate Settings\",\"default\":\"false\",\"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":{"Id":5726,"Protocol":{"Id":297,"Code":"Access TEC Care Watch","Version":"0.2","FirmwareVersion":"","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":true},"Name":"setHeartRateDetectingInterval","TemplateSMS":null,"Template":"<>","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.HeartrateSettings.ReportingFrequency) {\n var heartBeat = parseInt(params.HeartrateSettings.ReportingFrequency);\n heartBeat = decimalToHex(heartBeat);\n heartBeat = ('000000' + heartBeat).slice(-6).toUpperCase();\n if (params.HeartrateSettings.EnableDisableHeartrateSettings == '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 = '58020000'\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}","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":12362,"Group":{"Id":7416,"Name":"Heartrate Settings","Json":{"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":"Reporting Frequency","Json":"{\"name\":\"Reporting Frequency\",\"default\":\"\",\"description\":null,\"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\":[{\"label\":\"12 hours\",\"value\":\"720\"},{\"label\":\"6 hours\",\"value\":\"360\"},{\"label\":\"1 hours\",\"value\":\"60\"},{\"label\":\"30 min\",\"value\":\"30\"}],\"toTranslate\":[\"name\",\"description\",\"helpText\",\"label\"]}","Default":"","Command":{"Id":5726,"Protocol":{"Id":297,"Code":"Access TEC Care Watch","Version":"0.2","FirmwareVersion":"","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":true},"Name":"setHeartRateDetectingInterval","TemplateSMS":null,"Template":"<>","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.HeartrateSettings.ReportingFrequency) {\n var heartBeat = parseInt(params.HeartrateSettings.ReportingFrequency);\n heartBeat = decimalToHex(heartBeat);\n heartBeat = ('000000' + heartBeat).slice(-6).toUpperCase();\n if (params.HeartrateSettings.EnableDisableHeartrateSettings == '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 = '58020000'\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}","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":12359,"Group":{"Id":7415,"Name":"Steps Settings","Json":{"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":"Enable Disable Steps Settings","Json":"{\"name\":\"Enable Disable Steps Settings\",\"default\":\"false\",\"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":{"Id":5739,"Protocol":{"Id":297,"Code":"Access TEC Care Watch","Version":"0.2","FirmwareVersion":"","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":true},"Name":"setStepCollectSettings","TemplateSMS":null,"Template":"<>","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.StepsSettings.ReportingFrequency) {\n var heartBeat = parseInt(params.StepsSettings.ReportingFrequency);\n heartBeat = decimalToHex(heartBeat);\n heartBeat = ('000000' + heartBeat).slice(-6).toUpperCase();\n if (params.StepsSettings.EnableDisableStepsSettings == '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 = '58020000';\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}","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":12360,"Group":{"Id":7415,"Name":"Steps Settings","Json":{"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":"Reporting Frequency","Json":"{\"name\":\"Reporting Frequency\",\"default\":\"\",\"description\":null,\"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\":\"720\",\"label\":\"12 hours\"},{\"value\":\"360\",\"label\":\"6 hours\"},{\"value\":\"60\",\"label\":\"1 hour\"},{\"value\":\"30\",\"label\":\"30 min\"}],\"toTranslate\":[\"name\",\"description\",\"helpText\",\"label\"]}","Default":"","Command":{"Id":5739,"Protocol":{"Id":297,"Code":"Access TEC Care Watch","Version":"0.2","FirmwareVersion":"","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":true},"Name":"setStepCollectSettings","TemplateSMS":null,"Template":"<>","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.StepsSettings.ReportingFrequency) {\n var heartBeat = parseInt(params.StepsSettings.ReportingFrequency);\n heartBeat = decimalToHex(heartBeat);\n heartBeat = ('000000' + heartBeat).slice(-6).toUpperCase();\n if (params.StepsSettings.EnableDisableStepsSettings == '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 = '58020000';\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}","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":12359,"Group":{"Id":7415,"Name":"Steps Settings","Json":{"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":"Enable Disable Steps Settings","Json":"{\"name\":\"Enable Disable Steps Settings\",\"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":{"Id":5807,"Protocol":{"Id":297,"Code":"Access TEC Care Watch","Version":"0.3","FirmwareVersion":"V06.8601.2501","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":true},"Name":"setEnableStep","TemplateSMS":null,"Template":"<>","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 true\nvalue += '1';\n// Voice true\nvalue += '1';\n// Vibration true\nvalue += '1';\n// Cell Tower True\nvalue += '1';\n// Wifi true\nvalue += '1';\n// SOS speaker true\nvalue += '1';\n// Side call Speaker true\nvalue += '1';\n// BLE stay connected true\nvalue += '1';\n// BLE locating true\nvalue += '1';\n// SOS Call Voice true\nvalue += '1';\n// BLE always on true\nvalue += '1';\n// GPS location true\nvalue += '1';\n// TCP fast true\nvalue += '1';\n// Rotate screen to iluminate true\nvalue += '1'; //watch only girar muñeca para iluminar pantalla\n// Beacon true\nvalue += '1';\n// activity fuction true\nvalue += '1'; // activity fuction, \n//step counting, \nif (params.StepsSettings.EnableDisableStepsSettings == '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';\n// stop call sequence true\nvalue += '1';\n// other no use\nvalue += '00000000';\n// auto update false\nvalue += '0';\n// AGPS true\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":12361,"Group":{"Id":7416,"Name":"Heartrate Settings","Json":{"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":"Enable Disable Heartrate Settings","Json":"{\"name\":\"Enable Disable Heartrate Settings\",\"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":{"Id":5806,"Protocol":{"Id":297,"Code":"Access TEC Care Watch","Version":"0.3","FirmwareVersion":"V06.8601.2501","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":true},"Name":"setWatchSettings","TemplateSMS":null,"Template":"<>","AckTemplate":null,"Operation":"// Watch Settings\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 Watch Settings' Only enable y disable:\r\n// params.StepCounting.EnableDisableStepCounting == 'true'\r\n// params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true'\r\n//var params = {StepCounting:{'EnableDisableStepCounting':'true'},HeartRateMonitor:{'EnableDisableHeartRateMonitor':'true'}, DeviceVersion:{'DeviceVersion':2}}\r\n// Test enabled both\r\n// AB 10 13 00 40 6F 00 00 02 11 36 00 08 1A 00 00 3E 00 00 00 14 00 00 00 00 00 00\r\n// test step on HRT off\r\n// 02 11 36 00 08 0A 00 00 3C 00 00 00 14 00 00 00 00 00 00\r\n// test step off HRT on\r\n// 02 11 36 00 08 12 00 00 3A 00 00 00 14 00 00 00 00 00 00\r\n// test both off \r\n// 02 11 36 00 08 02 00 00 38 00 00 00 14 00 00 00 00 00 00 \r\nvar msg = [];\r\nvar configs = [];\r\n// configuration command (0X02) , lenght and key\r\nvar messageBody = '021136';\r\n// step count/heart value display\r\n// Watch setting related FACE ID\r\nmessageBody += '00'; // Default FACE ID 0 \r\n// Future\r\n//if (params.WatchFace.SetWatchFace) {\r\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \r\n//} else {\r\n// messageBody += '00'; // Analog Face Default FACE ID 0 \r\n//}\r\n// Watch Display setting related to Step and heart rate settings\r\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true')) {\r\n messageBody += '081A0000'; //both displays\r\n messageBody += '06000000'; //menu 1 and 2\r\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'false')) {\r\n messageBody += '080A0000'; // step display\r\n messageBody += '04000000'; //menu 2\r\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true')) {\r\n messageBody += '08120000'; // heart display\r\n messageBody += '02000000'; //menu 1\r\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'false')) {\r\n messageBody += '08020000'; // no displays\r\n messageBody += '00000000'; // no menu\r\n} else {\r\n messageBody += '08020000'; //no displays\r\n messageBody += '00000000'; // no menu\r\n}\r\n//menu items for the future\r\n/*if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'true')) {\r\n messageBody += '06000000'; //menu 1 and 2\r\n} else if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'false')) {\r\n messageBody += '04000000'; //menu 2\r\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'true')) {\r\n messageBody += '02000000'; //menu 1\r\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'false')) {\r\n messageBody += '00000000'; // no menu\r\n} else {\r\n messageBody += '00000000'; // no menu\r\n}*/\r\n// from autohome page to the end\r\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\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":0,"CommandToUpdateId":null,"ParentId":null,"Parent":null,"HasAck":true,"HexString":true,"SendAttempts":4,"Order":null},"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":12359,"Group":{"Id":7415,"Name":"Steps Settings","Json":{"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":"Enable Disable Steps Settings","Json":"{\"name\":\"Enable Disable Steps Settings\",\"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":{"Id":5806,"Protocol":{"Id":297,"Code":"Access TEC Care Watch","Version":"0.3","FirmwareVersion":"V06.8601.2501","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":true},"Name":"setWatchSettings","TemplateSMS":null,"Template":"<>","AckTemplate":null,"Operation":"// Watch Settings\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 Watch Settings' Only enable y disable:\r\n// params.StepCounting.EnableDisableStepCounting == 'true'\r\n// params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true'\r\n//var params = {StepCounting:{'EnableDisableStepCounting':'true'},HeartRateMonitor:{'EnableDisableHeartRateMonitor':'true'}, DeviceVersion:{'DeviceVersion':2}}\r\n// Test enabled both\r\n// AB 10 13 00 40 6F 00 00 02 11 36 00 08 1A 00 00 3E 00 00 00 14 00 00 00 00 00 00\r\n// test step on HRT off\r\n// 02 11 36 00 08 0A 00 00 3C 00 00 00 14 00 00 00 00 00 00\r\n// test step off HRT on\r\n// 02 11 36 00 08 12 00 00 3A 00 00 00 14 00 00 00 00 00 00\r\n// test both off \r\n// 02 11 36 00 08 02 00 00 38 00 00 00 14 00 00 00 00 00 00 \r\nvar msg = [];\r\nvar configs = [];\r\n// configuration command (0X02) , lenght and key\r\nvar messageBody = '021136';\r\n// step count/heart value display\r\n// Watch setting related FACE ID\r\nmessageBody += '00'; // Default FACE ID 0 \r\n// Future\r\n//if (params.WatchFace.SetWatchFace) {\r\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \r\n//} else {\r\n// messageBody += '00'; // Analog Face Default FACE ID 0 \r\n//}\r\n// Watch Display setting related to Step and heart rate settings\r\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true')) {\r\n messageBody += '081A0000'; //both displays\r\n messageBody += '06000000'; //menu 1 and 2\r\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'false')) {\r\n messageBody += '080A0000'; // step display\r\n messageBody += '04000000'; //menu 2\r\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true')) {\r\n messageBody += '08120000'; // heart display\r\n messageBody += '02000000'; //menu 1\r\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'false')) {\r\n messageBody += '08020000'; // no displays\r\n messageBody += '00000000'; // no menu\r\n} else {\r\n messageBody += '08020000'; //no displays\r\n messageBody += '00000000'; // no menu\r\n}\r\n//menu items for the future\r\n/*if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'true')) {\r\n messageBody += '06000000'; //menu 1 and 2\r\n} else if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'false')) {\r\n messageBody += '04000000'; //menu 2\r\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'true')) {\r\n messageBody += '02000000'; //menu 1\r\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'false')) {\r\n messageBody += '00000000'; // no menu\r\n} else {\r\n messageBody += '00000000'; // no menu\r\n}*/\r\n// from autohome page to the end\r\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\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":0,"CommandToUpdateId":null,"ParentId":null,"Parent":null,"HasAck":true,"HexString":true,"SendAttempts":4,"Order":null},"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":12387,"Group":{"Id":7454,"Name":"SPO2 Settings","Json":{"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":"Enable Disable SPO2 Settings","Json":"{\"name\":\"Enable Disable SPO2 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":[{"Type":0,"NewValue":"{\"Id\":12387,\"Group\":{\"Id\":7454,\"Name\":\"SPO2 Settings\",\"Json\":{\"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\":\"Enable Disable SPO2 Settings\",\"Json\":\"{\\\"name\\\":\\\"Enable Disable SPO2 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\":[]}","Timestamp":1762892924},{"Type":0,"NewValue":"{\"Id\":12387,\"Group\":{\"Id\":7454,\"Name\":\"SPO2 Settings\",\"Json\":{\"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\":\"Enable Disable SPO2 Settings\",\"Json\":\"{\\\"name\\\":\\\"Enable Disable SPO2 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\":{\"Id\":5818,\"Protocol\":{\"Id\":297,\"Code\":\"Access TEC Care Watch\",\"Version\":\"1.4\",\"FirmwareVersion\":\"V06.8601.2501\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"setSPOInterval\",\"TemplateSMS\":null,\"Template\":\"<>\",\"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.HeartrateSettings.ReportingFrequency) {\\n var heartBeat = parseInt(params.HeartrateSettings.ReportingFrequency) * 60; //in seconds\\n heartBeat = decimalToHex(heartBeat);\\n heartBeat = ('000000' + heartBeat).slice(-6).toUpperCase();\\n if (params.HeartrateSettings.EnableDisableHeartrateSettings == '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 = '58020000'\\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}\",\"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":1762892927},{"Type":0,"NewValue":"{\"Id\":12387,\"Group\":{\"Id\":7454,\"Name\":\"SPO2 Settings\",\"Json\":{\"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\":\"Enable Disable SPO2 Settings\",\"Json\":\"{\\\"name\\\":\\\"Enable Disable SPO2 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\":{\"Id\":5806,\"Protocol\":{\"Id\":297,\"Code\":\"Access TEC Care Watch\",\"Version\":\"1.4\",\"FirmwareVersion\":\"V06.8601.2501\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"setWatchSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"// Watch Settings\\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 Watch Settings' Only enable y disable:\\r\\n// params.StepCounting.EnableDisableStepCounting == 'true'\\r\\n// params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true'\\r\\n//var params = {StepCounting:{'EnableDisableStepCounting':'true'},HeartRateMonitor:{'EnableDisableHeartRateMonitor':'true'}, DeviceVersion:{'DeviceVersion':2}}\\r\\n// Test enabled both\\r\\n// AB 10 13 00 99 6A 0A 00 02 11 36 00 08 1B 00 00 0E 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step on HRT off\\r\\n// AB 10 13 00 DD 0C 0B 00 02 11 36 00 08 0B 00 00 0C 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step off HRT on\\r\\n// AB 10 13 00 B5 D0 09 00 02 11 36 00 08 13 00 00 0A 00 00 00 14 00 00 00 03 0A 01\\r\\n// test both off \\r\\n// AB 10 13 00 F1 B6 0C 00 02 11 36 00 08 03 00 00 08 00 00 00 14 00 00 00 03 0A 01 \\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\n// configuration command (0X02) , lenght and key\\r\\nvar messageBody = '021136';\\r\\n// step count/heart value display\\r\\n// Watch setting related FACE ID\\r\\nmessageBody += '00'; // Default FACE ID 0 \\r\\n// Future\\r\\n//if (params.WatchFace.SetWatchFace) {\\r\\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \\r\\n//} else {\\r\\n// messageBody += '00'; // Analog Face Default FACE ID 0 \\r\\n//}\\r\\n// Watch Display setting related to Step and heart rate settings\\r\\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '081B0000'; //both displays\\r\\n messageBody += '06000000'; //menu 1 and 2 no contact (menu 3) // 0E with contact menu\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '080B0000'; // step display\\r\\n messageBody += '04000000'; //menu 2 no contact (menu 3) //0C with contact menu\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '08130000'; // heart display\\r\\n messageBody += '02000000'; //menu 1 no contact (menu 3) // 0A with contact menu\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '08030000'; // no displays\\r\\n messageBody += '00000000'; // no menu , //08 only contact\\r\\n} else {\\r\\n messageBody += '08030000'; //no displays\\r\\n messageBody += '00000000'; // no menu.. only contact\\r\\n}\\r\\n//menu items for the future\\r\\n/*if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '06000000'; //menu 1 and 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '04000000'; //menu 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '02000000'; //menu 1\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '00000000'; // no menu\\r\\n} else {\\r\\n messageBody += '00000000'; // no menu\\r\\n}*/\\r\\n// from autohome page to the end\\r\\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\\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\\n//AddValueSMS('dataSMS', dataSMS);\\r\\nvar commandConfigs = {\\r\\n template: \\\"main\\\",\\r\\n configs: configs //,\\r\\n //configsSMS: configsSMS\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n// functions\\r\\nfunction AddValue(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n var arr1 = [];\\r\\n for (var n = 0, l = str.length; n < l; n++) {\\r\\n var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n arr1.push(hex);\\r\\n }\\r\\n return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n var crc = 0x0000;\\r\\n var j, i;\\r\\n for (i = 0; i < s.length; i++) {\\r\\n c = s[i];\\r\\n if (c > 255) {\\r\\n throw new RangeError();\\r\\n }\\r\\n j = (c ^ (crc >> 8)) & 0xFF;\\r\\n crc = crcTable[j] ^ (crc << 8);\\r\\n }\\r\\n return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n var splitStr = []\\r\\n var j = 0\\r\\n for (let i = 0; i < str.length; i += 2) {\\r\\n splitStr[j] = str.substring(i, i + 2)\\r\\n j++\\r\\n }\\r\\n var bytes = []\\r\\n var bytePos = 0\\r\\n for (let i = 0; i < splitStr.length; i++) {\\r\\n var byteStr = splitStr[i]\\r\\n var b = parseInt(byteStr, 16)\\r\\n if (b < 256) {\\r\\n bytes[bytePos] = b\\r\\n bytePos++\\r\\n }\\r\\n }\\r\\n return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n hexString = str.toString(16);\\r\\n return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n let bin = 0;\\r\\n let rem, i = 1,\\r\\n step = 1;\\r\\n while (x != 0) {\\r\\n rem = x % 2;\\r\\n x = parseInt(x / 2);\\r\\n bin = bin + rem * i;\\r\\n i = i * 10;\\r\\n }\\r\\n return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n var hexa = parseInt(x, 2).toString(16);\\r\\n return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n const result = [];\\r\\n let len = string.length - 2;\\r\\n while (len >= 0) {\\r\\n result.push(string.substr(len, 2));\\r\\n len -= 2;\\r\\n }\\r\\n return result.join('');\\r\\n}\",\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":true,\"SendAttempts\":4,\"Order\":null},\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1762892929},{"Type":1,"NewValue":"{\"Id\":12387,\"Group\":{\"Id\":7454,\"Name\":\"SPO2 Settings\",\"Json\":{\"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\":\"Enable Disable SPO2 Settings\",\"Json\":\"{\\\"name\\\":\\\"Enable Disable SPO2 Settings\\\",\\\"default\\\":\\\"false\\\",\\\"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\":[]}","Timestamp":1765220695},{"Type":0,"NewValue":"{\"Id\":12387,\"Group\":{\"Id\":7454,\"Name\":\"SPO2 Settings\",\"Json\":{\"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\":\"Enable Disable SPO2 Settings\",\"Json\":\"{\\\"name\\\":\\\"Enable Disable SPO2 Settings\\\",\\\"default\\\":\\\"false\\\",\\\"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\":{\"Id\":5819,\"Protocol\":{\"Id\":297,\"Code\":\"Access TEC Care Watch\",\"Version\":\"1.6\",\"FirmwareVersion\":\"V06.8601.2501\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"setAuthorisedNumbersAndWatchSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"// Combinated version setAuthorisedNumber with Watch Settings for EV06\\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// AB 10 22 00 32 FA 00 00 02 11 36 00 00 00 00 00 00 00 00 00 14 00 00 00 00 0A 00 0E 34 80 09 31 32 33 34 35 36 37 38 39 00 00\\r\\n// [Length]:11 [Key]:36 [Value]:00 00 00 00 00 00 00 00 00 14 00 00 00 00 0A 00\\r\\n//{\\\"watch\\\":{\\\"status18\\\":0,\\\"status17\\\":0,\\\"status19\\\":0,\\\"status10\\\":0,\\\"flagValue\\\":0,\\\"status12\\\":0,\\\"faceId\\\":0,\\\"status11\\\":0,\\\"status14\\\":0,\\\"status13\\\":0,\\\"status16\\\":0,\\\"status15\\\":0,\\\"status0\\\":0,\\\"status1\\\":0,\\\"menu8\\\":0,\\\"menu7\\\":0,\\\"menu6\\\":0,\\\"menu5\\\":0,\\\"menu4\\\":0,\\\"menu3\\\":0,\\\"menu2\\\":0,\\\"menu1\\\":0,\\\"autoTime\\\":20,\\\"brightNess\\\":0,\\\"logoIndex\\\":0,\\\"status20\\\":0,\\\"status8\\\":0,\\\"status9\\\":0,\\\"status2\\\":0,\\\"status3\\\":0,\\\"brightTime\\\":10}}\\r\\n//[Length]:0E [Key]:34 [Value]:80 09 31 32 33 34 35 36 37 38 39 00 00\\r\\n//{\\\"numberNamePhoto\\\":{\\\"call\\\":0,\\\"noCard\\\":0,\\\"number\\\":\\\"123456789\\\",\\\"enable\\\":1,\\\"sms\\\":0,\\\"name\\\":\\\"\\\",\\\"headURL\\\":\\\"\\\",\\\"index\\\":0}}\\r\\n// para pruebas en local Contact':\\r\\n//AB 10 12 00 94 ED 00 00 02 10 34 E0 09 31 32 33 34 35 36 37 38 39 02 79 6F 00\\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 phoneNumber = '';\\r\\nvar numberLength = '00';\\r\\nvar numberHex = '';\\r\\nvar nameLength = '00';\\r\\nvar nameHex = '';\\r\\nvar value = '02';\\r\\nvar keyLength = '00';\\r\\nvar confTel = '';\\r\\nvar count = 1; // approved contact will be from A2 to A9 - index 1 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\\ncounter = 0; // to check how many contacts are in the lists\\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 += \\\"0534\\\" + 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 phoneNumber = params.ApprovedContacts[contact].Contact;\\r\\n if (phoneNumber.startsWith(\\\"+\\\")) {\\r\\n phoneNumber = \\\"00\\\" + phoneNumber.substring(1);\\r\\n }\\r\\n numberHex = ascii_to_hexa(phoneNumber).toUpperCase();\\r\\n numberLength = ('00' + decimalToHex(phoneNumber.length)).slice(-2).toUpperCase();\\r\\n nameHex = ascii_to_hexa(params.ApprovedContacts[contact].Name).toUpperCase();\\r\\n nameLength = ('00' + decimalToHex(params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n keyLength = ('00' + decimalToHex(5 + phoneNumber.length + params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n value += keyLength + \\\"34\\\" + confTel + numberLength + numberHex + nameLength + nameHex + '00'; //no photo\\r\\n //value += keyLength + \\\"30\\\" + confTel + numberHex; //no photo \\r\\n counter++;\\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 phoneNumber = params.ApprovedContacts[contact].Contact;\\r\\n if (phoneNumber.startsWith(\\\"+\\\")) {\\r\\n phoneNumber = \\\"00\\\" + phoneNumber.substring(1);\\r\\n }\\r\\n numberHex = ascii_to_hexa(phoneNumber).toUpperCase();\\r\\n numberLength = ('00' + decimalToHex(phoneNumber.length)).slice(-2).toUpperCase();\\r\\n nameHex = ascii_to_hexa(params.ApprovedContacts[contact].Name).toUpperCase();\\r\\n nameLength = ('00' + decimalToHex(params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n keyLength = ('00' + decimalToHex(5 + phoneNumber.length + params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n value += keyLength + \\\"34\\\" + confTel + numberLength + numberHex + nameLength + nameHex + '00'; //no photo\\r\\n //value += keyLength + \\\"30\\\" + confTel + numberHex; //no photo \\r\\n counter++;\\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 += \\\"0534\\\" + confTel + '000000'; //no number, no name, no photo\\r\\n}\\r\\n// watch settings section\\r\\n// lenght and key\\r\\nvar messageBody = '1136';\\r\\n// step count/heart value display\\r\\n// Watch setting related FACE ID\\r\\nmessageBody += '00'; // Default FACE ID 0 \\r\\n// Future\\r\\n//if (params.WatchFace.SetWatchFace) {\\r\\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \\r\\n//} else {\\r\\n// messageBody += '00'; // Analog Face Default FACE ID 0 \\r\\n//}\\r\\n// Watch Display setting related to Step and heart rate settings\\r\\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '081B0000'; //both displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += (counter > 0) ? 'E' : '6';\\r\\n //messageBody += '6'; //menu 1 and 2 \\r\\n //messageBody += 'E'; //menu 1 and 2 and contact (menu 3) \\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '080B0000'; // step display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '4'; //menu 2 \\r\\n //messageBody += 'C'; // menu 2 and contact (menu 3) \\r\\n messageBody += (counter > 0) ? 'C' : '4';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '08130000'; // heart display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '2'; //menu 1 no contact (menu 3) \\r\\n //messageBody += 'A'; //menu 1 and contact (menu 3) \\r\\n messageBody += (counter > 0) ? 'A' : '2';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '08030000'; // no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '0000000'; // no menu , //08 only contact\\r\\n //messageBody += '8'; // //08 only contact\\r\\n messageBody += (counter > 0) ? '8' : '0';\\r\\n messageBody += '000000'; // other settings\\r\\n} else {\\r\\n messageBody += '08030000'; //no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '0000000'; // no menu..\\r\\n}\\r\\n// from autohome page to the end\\r\\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\\r\\nvalue += messageBody; //add watchsetting hex to contact hex in value var \\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}\",\"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":1765220698},{"Type":2,"NewValue":"{\"Id\":12387,\"Group\":{\"Id\":7454,\"Name\":\"SPO2 Settings\",\"Json\":{\"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\":\"Enable Disable SPO2 Settings\",\"Json\":\"{\\\"name\\\":\\\"Enable Disable SPO2 Settings\\\",\\\"default\\\":\\\"false\\\",\\\"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\":{\"Id\":5806,\"Protocol\":{\"Id\":297,\"Code\":\"Access TEC Care Watch\",\"Version\":\"1.6\",\"FirmwareVersion\":\"V06.8601.2501\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"setWatchSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"// Watch Settings\\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 Watch Settings' Only enable y disable:\\r\\n// params.StepCounting.EnableDisableStepCounting == 'true'\\r\\n// params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true'\\r\\n//var params = {StepCounting:{'EnableDisableStepCounting':'true'},HeartRateMonitor:{'EnableDisableHeartRateMonitor':'true'}, DeviceVersion:{'DeviceVersion':2}}\\r\\n// Test enabled both\\r\\n// AB 10 13 00 99 6A 0A 00 02 11 36 00 08 1B 00 00 0E 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step on HRT off\\r\\n// AB 10 13 00 DD 0C 0B 00 02 11 36 00 08 0B 00 00 0C 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step off HRT on\\r\\n// AB 10 13 00 B5 D0 09 00 02 11 36 00 08 13 00 00 0A 00 00 00 14 00 00 00 03 0A 01\\r\\n// test both off \\r\\n// AB 10 13 00 F1 B6 0C 00 02 11 36 00 08 03 00 00 08 00 00 00 14 00 00 00 03 0A 01 \\r\\n// comando para Contact on ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 4C 2E 03 00 02 11 36 00 08 1B 00 00 4E 00 00 00 14 00 00 00 03 0A 01\\r\\n// comando para contact off ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 C2 8C 04 00 02 11 36 00 08 1B 00 00 46 00 00 00 14 00 00 00 03 0A 01\\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\n// To store the quantity of contacts in the whitelist to enable disable the contact menu\\r\\n//var contactos = params.ApprovedContacts && params.ApprovedContacts.Contact;\\r\\n//var numDuplas = Array.isArray(params.ApprovedContacts) ? params.ApprovedContacts.length : 0;\\r\\n//var numDuplas = params.ApprovedContacts;\\r\\nlet numDuplas = 2;\\r\\n//for (const key in params.ApprovedContacts) {\\r\\n// if (params.ApprovedContacts[key] && params.ApprovedContacts[key].Contact && params.ApprovedContacts[key].Contact !== \\\"\\\") {\\r\\n// numDuplas++;\\r\\n// }\\r\\n//}\\r\\n//for (const key in params.ApprovedContacts) {\\r\\n// if (params.ApprovedContacts[key] && params.ApprovedContacts[key].Contact && params.ApprovedContacts[key].Contact !== \\\"\\\") {\\r\\n// numDuplas++;\\r\\n// }\\r\\n//}\\r\\n// configuration command (0X02) , lenght and key\\r\\nvar messageBody = '021136';\\r\\n// step count/heart value display\\r\\n// Watch setting related FACE ID\\r\\nmessageBody += '00'; // Default FACE ID 0 \\r\\n// Future\\r\\n//if (params.WatchFace.SetWatchFace) {\\r\\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \\r\\n//} else {\\r\\n// messageBody += '00'; // Analog Face Default FACE ID 0 \\r\\n//}\\r\\n// Watch Display setting related to Step and heart rate settings\\r\\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '081B0000'; //both displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += (numDuplas > 0) ? 'E' : '6';\\r\\n //messageBody += '6'; //menu 1 and 2 \\r\\n //messageBody += 'E'; //menu 1 and 2 and contact (menu 3) \\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '080B0000'; // step display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '4'; //menu 2 \\r\\n //messageBody += 'C'; // menu 2 and contact (menu 3) \\r\\n messageBody += (numDuplas > 0) ? 'C' : '4';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '08130000'; // heart display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '2'; //menu 1 no contact (menu 3) \\r\\n //messageBody += 'A'; //menu 1 and contact (menu 3) \\r\\n messageBody += (numDuplas > 0) ? 'A' : '2';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '08030000'; // no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '0000000'; // no menu , //08 only contact\\r\\n //messageBody += '8'; // //08 only contact\\r\\n messageBody += (numDuplas > 0) ? '8' : '0';\\r\\n messageBody += '000000'; // other settings\\r\\n} else {\\r\\n messageBody += '08030000'; //no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '0000000'; // no menu..\\r\\n}\\r\\n//menu items for the future\\r\\n/*if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '06000000'; //menu 1 and 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '04000000'; //menu 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '02000000'; //menu 1\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '00000000'; // no menu\\r\\n} else {\\r\\n messageBody += '00000000'; // no menu\\r\\n}*/\\r\\n// from autohome page to the end\\r\\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\\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\\n//AddValueSMS('dataSMS', dataSMS);\\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// functions\\r\\nfunction AddValue(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n var arr1 = [];\\r\\n for (var n = 0, l = str.length; n < l; n++) {\\r\\n var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n arr1.push(hex);\\r\\n }\\r\\n return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n var crc = 0x0000;\\r\\n var j, i;\\r\\n for (i = 0; i < s.length; i++) {\\r\\n c = s[i];\\r\\n if (c > 255) {\\r\\n throw new RangeError();\\r\\n }\\r\\n j = (c ^ (crc >> 8)) & 0xFF;\\r\\n crc = crcTable[j] ^ (crc << 8);\\r\\n }\\r\\n return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n var splitStr = []\\r\\n var j = 0\\r\\n for (let i = 0; i < str.length; i += 2) {\\r\\n splitStr[j] = str.substring(i, i + 2)\\r\\n j++\\r\\n }\\r\\n var bytes = []\\r\\n var bytePos = 0\\r\\n for (let i = 0; i < splitStr.length; i++) {\\r\\n var byteStr = splitStr[i]\\r\\n var b = parseInt(byteStr, 16)\\r\\n if (b < 256) {\\r\\n bytes[bytePos] = b\\r\\n bytePos++\\r\\n }\\r\\n }\\r\\n return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n hexString = str.toString(16);\\r\\n return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n let bin = 0;\\r\\n let rem, i = 1,\\r\\n step = 1;\\r\\n while (x != 0) {\\r\\n rem = x % 2;\\r\\n x = parseInt(x / 2);\\r\\n bin = bin + rem * i;\\r\\n i = i * 10;\\r\\n }\\r\\n return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n var hexa = parseInt(x, 2).toString(16);\\r\\n return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n const result = [];\\r\\n let len = string.length - 2;\\r\\n while (len >= 0) {\\r\\n result.push(string.substr(len, 2));\\r\\n len -= 2;\\r\\n }\\r\\n return result.join('');\\r\\n}\",\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":true,\"SendAttempts\":4,\"Order\":null},\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1765220701}],"LanguageId":null,"Tags":[]},{"Id":12387,"Group":{"Id":7454,"Name":"SPO2 Settings","Json":{"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":"Enable Disable SPO2 Settings","Json":"{\"name\":\"Enable Disable SPO2 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":{"Id":5818,"Protocol":{"Id":297,"Code":"Access TEC Care Watch","Version":"1.4","FirmwareVersion":"V06.8601.2501","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":true},"Name":"setSPOInterval","TemplateSMS":null,"Template":"<>","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.HeartrateSettings.ReportingFrequency) {\n var heartBeat = parseInt(params.HeartrateSettings.ReportingFrequency) * 60; //in seconds\n heartBeat = decimalToHex(heartBeat);\n heartBeat = ('000000' + heartBeat).slice(-6).toUpperCase();\n if (params.HeartrateSettings.EnableDisableHeartrateSettings == '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 = '58020000'\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}","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":12387,"Group":{"Id":7454,"Name":"SPO2 Settings","Json":{"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":"Enable Disable SPO2 Settings","Json":"{\"name\":\"Enable Disable SPO2 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":{"Id":5806,"Protocol":{"Id":297,"Code":"Access TEC Care Watch","Version":"1.4","FirmwareVersion":"V06.8601.2501","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":true},"Name":"setWatchSettings","TemplateSMS":null,"Template":"<>","AckTemplate":null,"Operation":"// Watch Settings\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 Watch Settings' Only enable y disable:\r\n// params.StepCounting.EnableDisableStepCounting == 'true'\r\n// params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true'\r\n//var params = {StepCounting:{'EnableDisableStepCounting':'true'},HeartRateMonitor:{'EnableDisableHeartRateMonitor':'true'}, DeviceVersion:{'DeviceVersion':2}}\r\n// Test enabled both\r\n// AB 10 13 00 99 6A 0A 00 02 11 36 00 08 1B 00 00 0E 00 00 00 14 00 00 00 03 0A 01\r\n// test step on HRT off\r\n// AB 10 13 00 DD 0C 0B 00 02 11 36 00 08 0B 00 00 0C 00 00 00 14 00 00 00 03 0A 01\r\n// test step off HRT on\r\n// AB 10 13 00 B5 D0 09 00 02 11 36 00 08 13 00 00 0A 00 00 00 14 00 00 00 03 0A 01\r\n// test both off \r\n// AB 10 13 00 F1 B6 0C 00 02 11 36 00 08 03 00 00 08 00 00 00 14 00 00 00 03 0A 01 \r\nvar msg = [];\r\nvar configs = [];\r\n// configuration command (0X02) , lenght and key\r\nvar messageBody = '021136';\r\n// step count/heart value display\r\n// Watch setting related FACE ID\r\nmessageBody += '00'; // Default FACE ID 0 \r\n// Future\r\n//if (params.WatchFace.SetWatchFace) {\r\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \r\n//} else {\r\n// messageBody += '00'; // Analog Face Default FACE ID 0 \r\n//}\r\n// Watch Display setting related to Step and heart rate settings\r\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\r\n messageBody += '081B0000'; //both displays\r\n messageBody += '06000000'; //menu 1 and 2 no contact (menu 3) // 0E with contact menu\r\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\r\n messageBody += '080B0000'; // step display\r\n messageBody += '04000000'; //menu 2 no contact (menu 3) //0C with contact menu\r\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\r\n messageBody += '08130000'; // heart display\r\n messageBody += '02000000'; //menu 1 no contact (menu 3) // 0A with contact menu\r\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\r\n messageBody += '08030000'; // no displays\r\n messageBody += '00000000'; // no menu , //08 only contact\r\n} else {\r\n messageBody += '08030000'; //no displays\r\n messageBody += '00000000'; // no menu.. only contact\r\n}\r\n//menu items for the future\r\n/*if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'true')) {\r\n messageBody += '06000000'; //menu 1 and 2\r\n} else if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'false')) {\r\n messageBody += '04000000'; //menu 2\r\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'true')) {\r\n messageBody += '02000000'; //menu 1\r\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'false')) {\r\n messageBody += '00000000'; // no menu\r\n} else {\r\n messageBody += '00000000'; // no menu\r\n}*/\r\n// from autohome page to the end\r\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\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\n//AddValueSMS('dataSMS', dataSMS);\r\nvar commandConfigs = {\r\n template: \"main\",\r\n configs: configs //,\r\n //configsSMS: configsSMS\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n// functions\r\nfunction AddValue(p1, p2) {\r\n var cvpair = {\r\n code: p1,\r\n value: p2\r\n };\r\n configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n var cvpair = {\r\n code: p1,\r\n value: p2\r\n };\r\n configsSMS.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n var arr1 = [];\r\n for (var n = 0, l = str.length; n < l; n++) {\r\n var hex = Number(str.charCodeAt(n)).toString(16);\r\n arr1.push(hex);\r\n }\r\n return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n var crc = 0x0000;\r\n var j, i;\r\n for (i = 0; i < s.length; i++) {\r\n c = s[i];\r\n if (c > 255) {\r\n throw new RangeError();\r\n }\r\n j = (c ^ (crc >> 8)) & 0xFF;\r\n crc = crcTable[j] ^ (crc << 8);\r\n }\r\n return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n var splitStr = []\r\n var j = 0\r\n for (let i = 0; i < str.length; i += 2) {\r\n splitStr[j] = str.substring(i, i + 2)\r\n j++\r\n }\r\n var bytes = []\r\n var bytePos = 0\r\n for (let i = 0; i < splitStr.length; i++) {\r\n var byteStr = splitStr[i]\r\n var b = parseInt(byteStr, 16)\r\n if (b < 256) {\r\n bytes[bytePos] = b\r\n bytePos++\r\n }\r\n }\r\n return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n hexString = str.toString(16);\r\n return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n let bin = 0;\r\n let rem, i = 1,\r\n step = 1;\r\n while (x != 0) {\r\n rem = x % 2;\r\n x = parseInt(x / 2);\r\n bin = bin + rem * i;\r\n i = i * 10;\r\n }\r\n return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n var hexa = parseInt(x, 2).toString(16);\r\n return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n const result = [];\r\n let len = string.length - 2;\r\n while (len >= 0) {\r\n result.push(string.substr(len, 2));\r\n len -= 2;\r\n }\r\n return result.join('');\r\n}","AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"CommandToUpdateId":null,"ParentId":null,"Parent":null,"HasAck":true,"HexString":true,"SendAttempts":4,"Order":null},"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":12388,"Group":{"Id":7454,"Name":"SPO2 Settings","Json":{"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":"Reporting Frequency","Json":"{\"name\":\"Reporting Frequency\",\"default\":\"\",\"description\":null,\"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\":[{\"label\":\"12 hours\",\"value\":\"720\"},{\"label\":\"6 hours\",\"value\":\"360\"},{\"label\":\"1 hour\",\"value\":\"60\"},{\"label\":\"30 min\",\"value\":\"30\"}],\"toTranslate\":[\"name\",\"description\",\"helpText\",\"label\"]}","Default":"","Command":null,"ProtocolActionObjects":[{"Type":0,"NewValue":"{\"Id\":12388,\"Group\":{\"Id\":7454,\"Name\":\"SPO2 Settings\",\"Json\":{\"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\":\"Reporting Frequency\",\"Json\":\"{\\\"name\\\":\\\"Reporting Frequency\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":null,\\\"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\\\":[{\\\"label\\\":\\\"12 hours\\\",\\\"value\\\":\\\"720\\\"},{\\\"label\\\":\\\"6 hours\\\",\\\"value\\\":\\\"360\\\"},{\\\"label\\\":\\\"1 hour\\\",\\\"value\\\":\\\"60\\\"},{\\\"label\\\":\\\"30 min\\\",\\\"value\\\":\\\"30\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1762893055},{"Type":0,"NewValue":"{\"Id\":12388,\"Group\":{\"Id\":7454,\"Name\":\"SPO2 Settings\",\"Json\":{\"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\":\"Reporting Frequency\",\"Json\":\"{\\\"name\\\":\\\"Reporting Frequency\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":null,\\\"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\\\":[{\\\"label\\\":\\\"12 hours\\\",\\\"value\\\":\\\"720\\\"},{\\\"label\\\":\\\"6 hours\\\",\\\"value\\\":\\\"360\\\"},{\\\"label\\\":\\\"1 hour\\\",\\\"value\\\":\\\"60\\\"},{\\\"label\\\":\\\"30 min\\\",\\\"value\\\":\\\"30\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"]}\",\"Default\":\"\",\"Command\":{\"Id\":5818,\"Protocol\":{\"Id\":297,\"Code\":\"Access TEC Care Watch\",\"Version\":\"1.4\",\"FirmwareVersion\":\"V06.8601.2501\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"setSPOInterval\",\"TemplateSMS\":null,\"Template\":\"<>\",\"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.HeartrateSettings.ReportingFrequency) {\\n var heartBeat = parseInt(params.HeartrateSettings.ReportingFrequency) * 60; //in seconds\\n heartBeat = decimalToHex(heartBeat);\\n heartBeat = ('000000' + heartBeat).slice(-6).toUpperCase();\\n if (params.HeartrateSettings.EnableDisableHeartrateSettings == '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 = '58020000'\\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}\",\"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":1762893058},{"Type":1,"NewValue":"{\"Id\":12388,\"Group\":{\"Id\":7454,\"Name\":\"SPO2 Settings\",\"Json\":{\"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\":\"Reporting Frequency\",\"Json\":\"{\\\"name\\\":\\\"Reporting Frequency\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":null,\\\"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\\\":\\\"720\\\",\\\"label\\\":\\\"12 hours\\\"},{\\\"value\\\":\\\"360\\\",\\\"label\\\":\\\"6 hours\\\"},{\\\"value\\\":\\\"60\\\",\\\"label\\\":\\\"1 hour\\\"},{\\\"value\\\":\\\"30\\\",\\\"label\\\":\\\"30 min\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1764839109},{"Type":0,"NewValue":"{\"Id\":12388,\"Group\":{\"Id\":7454,\"Name\":\"SPO2 Settings\",\"Json\":{\"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\":\"Reporting Frequency\",\"Json\":\"{\\\"name\\\":\\\"Reporting Frequency\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":null,\\\"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\\\":\\\"720\\\",\\\"label\\\":\\\"12 hours\\\"},{\\\"value\\\":\\\"360\\\",\\\"label\\\":\\\"6 hours\\\"},{\\\"value\\\":\\\"60\\\",\\\"label\\\":\\\"1 hour\\\"},{\\\"value\\\":\\\"30\\\",\\\"label\\\":\\\"30 min\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"]}\",\"Default\":\"\",\"Command\":{\"Id\":5806,\"Protocol\":{\"Id\":297,\"Code\":\"Access TEC Care Watch\",\"Version\":\"1.6\",\"FirmwareVersion\":\"V06.8601.2501\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"setWatchSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"// Watch Settings\\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 Watch Settings' Only enable y disable:\\r\\n// params.StepCounting.EnableDisableStepCounting == 'true'\\r\\n// params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true'\\r\\n//var params = {StepCounting:{'EnableDisableStepCounting':'true'},HeartRateMonitor:{'EnableDisableHeartRateMonitor':'true'}, DeviceVersion:{'DeviceVersion':2}}\\r\\n// Test enabled both\\r\\n// AB 10 13 00 99 6A 0A 00 02 11 36 00 08 1B 00 00 0E 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step on HRT off\\r\\n// AB 10 13 00 DD 0C 0B 00 02 11 36 00 08 0B 00 00 0C 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step off HRT on\\r\\n// AB 10 13 00 B5 D0 09 00 02 11 36 00 08 13 00 00 0A 00 00 00 14 00 00 00 03 0A 01\\r\\n// test both off \\r\\n// AB 10 13 00 F1 B6 0C 00 02 11 36 00 08 03 00 00 08 00 00 00 14 00 00 00 03 0A 01 \\r\\n// comando para Contact on ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 4C 2E 03 00 02 11 36 00 08 1B 00 00 4E 00 00 00 14 00 00 00 03 0A 01\\r\\n// comando para contact off ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 C2 8C 04 00 02 11 36 00 08 1B 00 00 46 00 00 00 14 00 00 00 03 0A 01\\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\n// To store the quantity of contacts in the whitelist to enable disable the contact menu\\r\\n//var contactos = params.ApprovedContacts && params.ApprovedContacts.Contact;\\r\\nvar numDuplas = Array.isArray(params.ApprovedContacts) ? params.ApprovedContacts.length : 0;\\r\\n// configuration command (0X02) , lenght and key\\r\\nvar messageBody = '021136';\\r\\n// step count/heart value display\\r\\n// Watch setting related FACE ID\\r\\nmessageBody += '00'; // Default FACE ID 0 \\r\\n// Future\\r\\n//if (params.WatchFace.SetWatchFace) {\\r\\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \\r\\n//} else {\\r\\n// messageBody += '00'; // Analog Face Default FACE ID 0 \\r\\n//}\\r\\n// Watch Display setting related to Step and heart rate settings\\r\\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '081B0000'; //both displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += (numDuplas > 0) ? 'E' : '6';\\r\\n //messageBody += '6'; //menu 1 and 2 \\r\\n //messageBody += 'E'; //menu 1 and 2 and contact (menu 3) \\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '080B0000'; // step display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '4'; //menu 2 \\r\\n //messageBody += 'C'; // menu 2 and contact (menu 3) \\r\\n messageBody += (numDuplas > 0) ? 'C' : '4';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '08130000'; // heart display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '2'; //menu 1 no contact (menu 3) \\r\\n //messageBody += 'A'; //menu 1 and contact (menu 3) \\r\\n messageBody += (numDuplas > 0) ? 'A' : '2';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '08030000'; // no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '0000000'; // no menu , //08 only contact\\r\\n //messageBody += '8'; // //08 only contact\\r\\n messageBody += (numDuplas > 0) ? '8' : '0';\\r\\n messageBody += '000000'; // other settings\\r\\n} else {\\r\\n messageBody += '08030000'; //no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '0000000'; // no menu..\\r\\n}\\r\\n//menu items for the future\\r\\n/*if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '06000000'; //menu 1 and 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '04000000'; //menu 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '02000000'; //menu 1\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '00000000'; // no menu\\r\\n} else {\\r\\n messageBody += '00000000'; // no menu\\r\\n}*/\\r\\n// from autohome page to the end\\r\\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\\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\\n//AddValueSMS('dataSMS', dataSMS);\\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// functions\\r\\nfunction AddValue(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n var arr1 = [];\\r\\n for (var n = 0, l = str.length; n < l; n++) {\\r\\n var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n arr1.push(hex);\\r\\n }\\r\\n return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n var crc = 0x0000;\\r\\n var j, i;\\r\\n for (i = 0; i < s.length; i++) {\\r\\n c = s[i];\\r\\n if (c > 255) {\\r\\n throw new RangeError();\\r\\n }\\r\\n j = (c ^ (crc >> 8)) & 0xFF;\\r\\n crc = crcTable[j] ^ (crc << 8);\\r\\n }\\r\\n return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n var splitStr = []\\r\\n var j = 0\\r\\n for (let i = 0; i < str.length; i += 2) {\\r\\n splitStr[j] = str.substring(i, i + 2)\\r\\n j++\\r\\n }\\r\\n var bytes = []\\r\\n var bytePos = 0\\r\\n for (let i = 0; i < splitStr.length; i++) {\\r\\n var byteStr = splitStr[i]\\r\\n var b = parseInt(byteStr, 16)\\r\\n if (b < 256) {\\r\\n bytes[bytePos] = b\\r\\n bytePos++\\r\\n }\\r\\n }\\r\\n return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n hexString = str.toString(16);\\r\\n return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n let bin = 0;\\r\\n let rem, i = 1,\\r\\n step = 1;\\r\\n while (x != 0) {\\r\\n rem = x % 2;\\r\\n x = parseInt(x / 2);\\r\\n bin = bin + rem * i;\\r\\n i = i * 10;\\r\\n }\\r\\n return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n var hexa = parseInt(x, 2).toString(16);\\r\\n return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n const result = [];\\r\\n let len = string.length - 2;\\r\\n while (len >= 0) {\\r\\n result.push(string.substr(len, 2));\\r\\n len -= 2;\\r\\n }\\r\\n return result.join('');\\r\\n}\",\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":true,\"SendAttempts\":4,\"Order\":null},\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1764839113},{"Type":1,"NewValue":"{\"Id\":12388,\"Group\":{\"Id\":7454,\"Name\":\"SPO2 Settings\",\"Json\":{\"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\":\"Reporting Frequency\",\"Json\":\"{\\\"name\\\":\\\"Reporting Frequency\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":null,\\\"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\\\":\\\"720\\\",\\\"label\\\":\\\"12 hours\\\"},{\\\"value\\\":\\\"360\\\",\\\"label\\\":\\\"6 hours\\\"},{\\\"value\\\":\\\"60\\\",\\\"label\\\":\\\"1 hour\\\"},{\\\"value\\\":\\\"30\\\",\\\"label\\\":\\\"30 min\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1765220728},{"Type":0,"NewValue":"{\"Id\":12388,\"Group\":{\"Id\":7454,\"Name\":\"SPO2 Settings\",\"Json\":{\"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\":\"Reporting Frequency\",\"Json\":\"{\\\"name\\\":\\\"Reporting Frequency\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":null,\\\"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\\\":\\\"720\\\",\\\"label\\\":\\\"12 hours\\\"},{\\\"value\\\":\\\"360\\\",\\\"label\\\":\\\"6 hours\\\"},{\\\"value\\\":\\\"60\\\",\\\"label\\\":\\\"1 hour\\\"},{\\\"value\\\":\\\"30\\\",\\\"label\\\":\\\"30 min\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"]}\",\"Default\":\"\",\"Command\":{\"Id\":5819,\"Protocol\":{\"Id\":297,\"Code\":\"Access TEC Care Watch\",\"Version\":\"1.6\",\"FirmwareVersion\":\"V06.8601.2501\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"setAuthorisedNumbersAndWatchSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"// Combinated version setAuthorisedNumber with Watch Settings for EV06\\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// AB 10 22 00 32 FA 00 00 02 11 36 00 00 00 00 00 00 00 00 00 14 00 00 00 00 0A 00 0E 34 80 09 31 32 33 34 35 36 37 38 39 00 00\\r\\n// [Length]:11 [Key]:36 [Value]:00 00 00 00 00 00 00 00 00 14 00 00 00 00 0A 00\\r\\n//{\\\"watch\\\":{\\\"status18\\\":0,\\\"status17\\\":0,\\\"status19\\\":0,\\\"status10\\\":0,\\\"flagValue\\\":0,\\\"status12\\\":0,\\\"faceId\\\":0,\\\"status11\\\":0,\\\"status14\\\":0,\\\"status13\\\":0,\\\"status16\\\":0,\\\"status15\\\":0,\\\"status0\\\":0,\\\"status1\\\":0,\\\"menu8\\\":0,\\\"menu7\\\":0,\\\"menu6\\\":0,\\\"menu5\\\":0,\\\"menu4\\\":0,\\\"menu3\\\":0,\\\"menu2\\\":0,\\\"menu1\\\":0,\\\"autoTime\\\":20,\\\"brightNess\\\":0,\\\"logoIndex\\\":0,\\\"status20\\\":0,\\\"status8\\\":0,\\\"status9\\\":0,\\\"status2\\\":0,\\\"status3\\\":0,\\\"brightTime\\\":10}}\\r\\n//[Length]:0E [Key]:34 [Value]:80 09 31 32 33 34 35 36 37 38 39 00 00\\r\\n//{\\\"numberNamePhoto\\\":{\\\"call\\\":0,\\\"noCard\\\":0,\\\"number\\\":\\\"123456789\\\",\\\"enable\\\":1,\\\"sms\\\":0,\\\"name\\\":\\\"\\\",\\\"headURL\\\":\\\"\\\",\\\"index\\\":0}}\\r\\n// para pruebas en local Contact':\\r\\n//AB 10 12 00 94 ED 00 00 02 10 34 E0 09 31 32 33 34 35 36 37 38 39 02 79 6F 00\\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 phoneNumber = '';\\r\\nvar numberLength = '00';\\r\\nvar numberHex = '';\\r\\nvar nameLength = '00';\\r\\nvar nameHex = '';\\r\\nvar value = '02';\\r\\nvar keyLength = '00';\\r\\nvar confTel = '';\\r\\nvar count = 1; // approved contact will be from A2 to A9 - index 1 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\\ncounter = 0; // to check how many contacts are in the lists\\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 += \\\"0534\\\" + 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 phoneNumber = params.ApprovedContacts[contact].Contact;\\r\\n if (phoneNumber.startsWith(\\\"+\\\")) {\\r\\n phoneNumber = \\\"00\\\" + phoneNumber.substring(1);\\r\\n }\\r\\n numberHex = ascii_to_hexa(phoneNumber).toUpperCase();\\r\\n numberLength = ('00' + decimalToHex(phoneNumber.length)).slice(-2).toUpperCase();\\r\\n nameHex = ascii_to_hexa(params.ApprovedContacts[contact].Name).toUpperCase();\\r\\n nameLength = ('00' + decimalToHex(params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n keyLength = ('00' + decimalToHex(5 + phoneNumber.length + params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n value += keyLength + \\\"34\\\" + confTel + numberLength + numberHex + nameLength + nameHex + '00'; //no photo\\r\\n //value += keyLength + \\\"30\\\" + confTel + numberHex; //no photo \\r\\n counter++;\\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 phoneNumber = params.ApprovedContacts[contact].Contact;\\r\\n if (phoneNumber.startsWith(\\\"+\\\")) {\\r\\n phoneNumber = \\\"00\\\" + phoneNumber.substring(1);\\r\\n }\\r\\n numberHex = ascii_to_hexa(phoneNumber).toUpperCase();\\r\\n numberLength = ('00' + decimalToHex(phoneNumber.length)).slice(-2).toUpperCase();\\r\\n nameHex = ascii_to_hexa(params.ApprovedContacts[contact].Name).toUpperCase();\\r\\n nameLength = ('00' + decimalToHex(params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n keyLength = ('00' + decimalToHex(5 + phoneNumber.length + params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\\r\\n value += keyLength + \\\"34\\\" + confTel + numberLength + numberHex + nameLength + nameHex + '00'; //no photo\\r\\n //value += keyLength + \\\"30\\\" + confTel + numberHex; //no photo \\r\\n counter++;\\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 += \\\"0534\\\" + confTel + '000000'; //no number, no name, no photo\\r\\n}\\r\\n// watch settings section\\r\\n// lenght and key\\r\\nvar messageBody = '1136';\\r\\n// step count/heart value display\\r\\n// Watch setting related FACE ID\\r\\nmessageBody += '00'; // Default FACE ID 0 \\r\\n// Future\\r\\n//if (params.WatchFace.SetWatchFace) {\\r\\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \\r\\n//} else {\\r\\n// messageBody += '00'; // Analog Face Default FACE ID 0 \\r\\n//}\\r\\n// Watch Display setting related to Step and heart rate settings\\r\\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '081B0000'; //both displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += (counter > 0) ? 'E' : '6';\\r\\n //messageBody += '6'; //menu 1 and 2 \\r\\n //messageBody += 'E'; //menu 1 and 2 and contact (menu 3) \\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '080B0000'; // step display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '4'; //menu 2 \\r\\n //messageBody += 'C'; // menu 2 and contact (menu 3) \\r\\n messageBody += (counter > 0) ? 'C' : '4';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '08130000'; // heart display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '2'; //menu 1 no contact (menu 3) \\r\\n //messageBody += 'A'; //menu 1 and contact (menu 3) \\r\\n messageBody += (counter > 0) ? 'A' : '2';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '08030000'; // no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '0000000'; // no menu , //08 only contact\\r\\n //messageBody += '8'; // //08 only contact\\r\\n messageBody += (counter > 0) ? '8' : '0';\\r\\n messageBody += '000000'; // other settings\\r\\n} else {\\r\\n messageBody += '08030000'; //no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '0000000'; // no menu..\\r\\n}\\r\\n// from autohome page to the end\\r\\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\\r\\nvalue += messageBody; //add watchsetting hex to contact hex in value var \\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}\",\"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":1765220731},{"Type":2,"NewValue":"{\"Id\":12388,\"Group\":{\"Id\":7454,\"Name\":\"SPO2 Settings\",\"Json\":{\"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\":\"Reporting Frequency\",\"Json\":\"{\\\"name\\\":\\\"Reporting Frequency\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":null,\\\"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\\\":\\\"720\\\",\\\"label\\\":\\\"12 hours\\\"},{\\\"value\\\":\\\"360\\\",\\\"label\\\":\\\"6 hours\\\"},{\\\"value\\\":\\\"60\\\",\\\"label\\\":\\\"1 hour\\\"},{\\\"value\\\":\\\"30\\\",\\\"label\\\":\\\"30 min\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"]}\",\"Default\":\"\",\"Command\":{\"Id\":5806,\"Protocol\":{\"Id\":297,\"Code\":\"Access TEC Care Watch\",\"Version\":\"1.6\",\"FirmwareVersion\":\"V06.8601.2501\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"setWatchSettings\",\"TemplateSMS\":null,\"Template\":\"<>\",\"AckTemplate\":null,\"Operation\":\"// Watch Settings\\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 Watch Settings' Only enable y disable:\\r\\n// params.StepCounting.EnableDisableStepCounting == 'true'\\r\\n// params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true'\\r\\n//var params = {StepCounting:{'EnableDisableStepCounting':'true'},HeartRateMonitor:{'EnableDisableHeartRateMonitor':'true'}, DeviceVersion:{'DeviceVersion':2}}\\r\\n// Test enabled both\\r\\n// AB 10 13 00 99 6A 0A 00 02 11 36 00 08 1B 00 00 0E 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step on HRT off\\r\\n// AB 10 13 00 DD 0C 0B 00 02 11 36 00 08 0B 00 00 0C 00 00 00 14 00 00 00 03 0A 01\\r\\n// test step off HRT on\\r\\n// AB 10 13 00 B5 D0 09 00 02 11 36 00 08 13 00 00 0A 00 00 00 14 00 00 00 03 0A 01\\r\\n// test both off \\r\\n// AB 10 13 00 F1 B6 0C 00 02 11 36 00 08 03 00 00 08 00 00 00 14 00 00 00 03 0A 01 \\r\\n// comando para Contact on ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 4C 2E 03 00 02 11 36 00 08 1B 00 00 4E 00 00 00 14 00 00 00 03 0A 01\\r\\n// comando para contact off ( on HR, Steps, SPO2)\\r\\n//AB 10 13 00 C2 8C 04 00 02 11 36 00 08 1B 00 00 46 00 00 00 14 00 00 00 03 0A 01\\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\n// To store the quantity of contacts in the whitelist to enable disable the contact menu\\r\\n//var contactos = params.ApprovedContacts && params.ApprovedContacts.Contact;\\r\\n//var numDuplas = Array.isArray(params.ApprovedContacts) ? params.ApprovedContacts.length : 0;\\r\\n//var numDuplas = params.ApprovedContacts;\\r\\nlet numDuplas = 2;\\r\\n//for (const key in params.ApprovedContacts) {\\r\\n// if (params.ApprovedContacts[key] && params.ApprovedContacts[key].Contact && params.ApprovedContacts[key].Contact !== \\\"\\\") {\\r\\n// numDuplas++;\\r\\n// }\\r\\n//}\\r\\n//for (const key in params.ApprovedContacts) {\\r\\n// if (params.ApprovedContacts[key] && params.ApprovedContacts[key].Contact && params.ApprovedContacts[key].Contact !== \\\"\\\") {\\r\\n// numDuplas++;\\r\\n// }\\r\\n//}\\r\\n// configuration command (0X02) , lenght and key\\r\\nvar messageBody = '021136';\\r\\n// step count/heart value display\\r\\n// Watch setting related FACE ID\\r\\nmessageBody += '00'; // Default FACE ID 0 \\r\\n// Future\\r\\n//if (params.WatchFace.SetWatchFace) {\\r\\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \\r\\n//} else {\\r\\n// messageBody += '00'; // Analog Face Default FACE ID 0 \\r\\n//}\\r\\n// Watch Display setting related to Step and heart rate settings\\r\\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '081B0000'; //both displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += (numDuplas > 0) ? 'E' : '6';\\r\\n //messageBody += '6'; //menu 1 and 2 \\r\\n //messageBody += 'E'; //menu 1 and 2 and contact (menu 3) \\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '080B0000'; // step display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '4'; //menu 2 \\r\\n //messageBody += 'C'; // menu 2 and contact (menu 3) \\r\\n messageBody += (numDuplas > 0) ? 'C' : '4';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\\r\\n messageBody += '08130000'; // heart display\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '2'; //menu 1 no contact (menu 3) \\r\\n //messageBody += 'A'; //menu 1 and contact (menu 3) \\r\\n messageBody += (numDuplas > 0) ? 'A' : '2';\\r\\n messageBody += '000000'; // other settings\\r\\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\\r\\n messageBody += '08030000'; // no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n //messageBody += '0000000'; // no menu , //08 only contact\\r\\n //messageBody += '8'; // //08 only contact\\r\\n messageBody += (numDuplas > 0) ? '8' : '0';\\r\\n messageBody += '000000'; // other settings\\r\\n} else {\\r\\n messageBody += '08030000'; //no displays\\r\\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\\r\\n messageBody += '0000000'; // no menu..\\r\\n}\\r\\n//menu items for the future\\r\\n/*if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '06000000'; //menu 1 and 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '04000000'; //menu 2\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'true')) {\\r\\n messageBody += '02000000'; //menu 1\\r\\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'false')) {\\r\\n messageBody += '00000000'; // no menu\\r\\n} else {\\r\\n messageBody += '00000000'; // no menu\\r\\n}*/\\r\\n// from autohome page to the end\\r\\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\\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\\n//AddValueSMS('dataSMS', dataSMS);\\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// functions\\r\\nfunction AddValue(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n var arr1 = [];\\r\\n for (var n = 0, l = str.length; n < l; n++) {\\r\\n var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n arr1.push(hex);\\r\\n }\\r\\n return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n var crc = 0x0000;\\r\\n var j, i;\\r\\n for (i = 0; i < s.length; i++) {\\r\\n c = s[i];\\r\\n if (c > 255) {\\r\\n throw new RangeError();\\r\\n }\\r\\n j = (c ^ (crc >> 8)) & 0xFF;\\r\\n crc = crcTable[j] ^ (crc << 8);\\r\\n }\\r\\n return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n var splitStr = []\\r\\n var j = 0\\r\\n for (let i = 0; i < str.length; i += 2) {\\r\\n splitStr[j] = str.substring(i, i + 2)\\r\\n j++\\r\\n }\\r\\n var bytes = []\\r\\n var bytePos = 0\\r\\n for (let i = 0; i < splitStr.length; i++) {\\r\\n var byteStr = splitStr[i]\\r\\n var b = parseInt(byteStr, 16)\\r\\n if (b < 256) {\\r\\n bytes[bytePos] = b\\r\\n bytePos++\\r\\n }\\r\\n }\\r\\n return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n hexString = str.toString(16);\\r\\n return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n let bin = 0;\\r\\n let rem, i = 1,\\r\\n step = 1;\\r\\n while (x != 0) {\\r\\n rem = x % 2;\\r\\n x = parseInt(x / 2);\\r\\n bin = bin + rem * i;\\r\\n i = i * 10;\\r\\n }\\r\\n return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n var hexa = parseInt(x, 2).toString(16);\\r\\n return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n const result = [];\\r\\n let len = string.length - 2;\\r\\n while (len >= 0) {\\r\\n result.push(string.substr(len, 2));\\r\\n len -= 2;\\r\\n }\\r\\n return result.join('');\\r\\n}\",\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":true,\"SendAttempts\":4,\"Order\":null},\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1765220733}],"LanguageId":null,"Tags":[]},{"Id":12388,"Group":{"Id":7454,"Name":"SPO2 Settings","Json":{"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":"Reporting Frequency","Json":"{\"name\":\"Reporting Frequency\",\"default\":\"\",\"description\":null,\"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\":[{\"label\":\"12 hours\",\"value\":\"720\"},{\"label\":\"6 hours\",\"value\":\"360\"},{\"label\":\"1 hour\",\"value\":\"60\"},{\"label\":\"30 min\",\"value\":\"30\"}],\"toTranslate\":[\"name\",\"description\",\"helpText\",\"label\"]}","Default":"","Command":{"Id":5818,"Protocol":{"Id":297,"Code":"Access TEC Care Watch","Version":"1.4","FirmwareVersion":"V06.8601.2501","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":true},"Name":"setSPOInterval","TemplateSMS":null,"Template":"<>","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.HeartrateSettings.ReportingFrequency) {\n var heartBeat = parseInt(params.HeartrateSettings.ReportingFrequency) * 60; //in seconds\n heartBeat = decimalToHex(heartBeat);\n heartBeat = ('000000' + heartBeat).slice(-6).toUpperCase();\n if (params.HeartrateSettings.EnableDisableHeartrateSettings == '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 = '58020000'\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}","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":12389,"Group":{"Id":7457,"Name":"Read SPO2 Settings","Json":{"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":"Enable Disable Read SPO2 Settings","Json":"{\"name\":\"Enable Disable Read SPO2 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":[{"Type":0,"NewValue":"{\"Id\":12389,\"Group\":{\"Id\":7457,\"Name\":\"Read SPO2 Settings\",\"Json\":{\"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\":\"Enable Disable Read SPO2 Settings\",\"Json\":\"{\\\"name\\\":\\\"Enable Disable Read SPO2 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\":[]}","Timestamp":1763059280}],"LanguageId":null,"Tags":[]},{"Id":12390,"Group":{"Id":7457,"Name":"Read SPO2 Settings","Json":{"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":"Reporting Frequency","Json":"{\"name\":\"Reporting Frequency\",\"default\":\"\",\"description\":null,\"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\":\"12 hours\",\"value\":\"720\"},{\"label\":\"6 hours\",\"value\":\"360\"},{\"label\":\"1 hour\",\"value\":\"60\"},{\"label\":\"30 minutes\",\"value\":\"30\"}],\"toTranslate\":[\"name\",\"description\",\"helpText\",\"label\"]}","Default":"","Command":null,"ProtocolActionObjects":[{"Type":0,"NewValue":"{\"Id\":12390,\"Group\":{\"Id\":7457,\"Name\":\"Read SPO2 Settings\",\"Json\":{\"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\":\"Reporting Frequency\",\"Json\":\"{\\\"name\\\":\\\"Reporting Frequency\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":null,\\\"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\\\":\\\"12 hours\\\",\\\"value\\\":\\\"720\\\"},{\\\"label\\\":\\\"6 hours\\\",\\\"value\\\":\\\"360\\\"},{\\\"label\\\":\\\"1 hour\\\",\\\"value\\\":\\\"60\\\"},{\\\"label\\\":\\\"30 minutes\\\",\\\"value\\\":\\\"30\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1763059374},{"Type":1,"NewValue":"{\"Id\":12390,\"Group\":{\"Id\":7457,\"Name\":\"Read SPO2 Settings\",\"Json\":{\"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\":\"Reporting Frequency\",\"Json\":\"{\\\"name\\\":\\\"Reporting Frequency\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":null,\\\"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\\\":\\\"720\\\",\\\"label\\\":\\\"12 hours\\\"},{\\\"value\\\":\\\"360\\\",\\\"label\\\":\\\"6 hours\\\"},{\\\"value\\\":\\\"60\\\",\\\"label\\\":\\\"1 hour\\\"},{\\\"label\\\":\\\"30 min\\\",\\\"value\\\":\\\"30\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1763059448}],"LanguageId":null,"Tags":[]},{"Id":12337,"Group":{"Id":7390,"Name":"Approved Contacts","Json":{"description":"","columns":1,"order":2,"listSize":8,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Contact","Json":"{\"name\":\"Contact\",\"default\":\"\",\"description\":\"Contact\",\"type\":\"phone\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Phone number of the contact\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":{"Id":5806,"Protocol":{"Id":297,"Code":"Access TEC Care Watch","Version":"1.6","FirmwareVersion":"V06.8601.2501","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":true},"Name":"setWatchSettings","TemplateSMS":null,"Template":"<>","AckTemplate":null,"Operation":"// Watch Settings\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 Watch Settings' Only enable y disable:\r\n// params.StepCounting.EnableDisableStepCounting == 'true'\r\n// params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true'\r\n//var params = {StepCounting:{'EnableDisableStepCounting':'true'},HeartRateMonitor:{'EnableDisableHeartRateMonitor':'true'}, DeviceVersion:{'DeviceVersion':2}}\r\n// Test enabled both\r\n// AB 10 13 00 99 6A 0A 00 02 11 36 00 08 1B 00 00 0E 00 00 00 14 00 00 00 03 0A 01\r\n// test step on HRT off\r\n// AB 10 13 00 DD 0C 0B 00 02 11 36 00 08 0B 00 00 0C 00 00 00 14 00 00 00 03 0A 01\r\n// test step off HRT on\r\n// AB 10 13 00 B5 D0 09 00 02 11 36 00 08 13 00 00 0A 00 00 00 14 00 00 00 03 0A 01\r\n// test both off \r\n// AB 10 13 00 F1 B6 0C 00 02 11 36 00 08 03 00 00 08 00 00 00 14 00 00 00 03 0A 01 \r\n// comando para Contact on ( on HR, Steps, SPO2)\r\n//AB 10 13 00 4C 2E 03 00 02 11 36 00 08 1B 00 00 4E 00 00 00 14 00 00 00 03 0A 01\r\n// comando para contact off ( on HR, Steps, SPO2)\r\n//AB 10 13 00 C2 8C 04 00 02 11 36 00 08 1B 00 00 46 00 00 00 14 00 00 00 03 0A 01\r\nvar msg = [];\r\nvar configs = [];\r\n// To store the quantity of contacts in the whitelist to enable disable the contact menu\r\nvar contactos = params.ApprovedContacts && params.ApprovedContacts.Contact;\r\nvar numDuplas = Array.isArray(contactos) ? contactos.length : 0;\r\n// configuration command (0X02) , lenght and key\r\nvar messageBody = '021136';\r\n// step count/heart value display\r\n// Watch setting related FACE ID\r\nmessageBody += '00'; // Default FACE ID 0 \r\n// Future\r\n//if (params.WatchFace.SetWatchFace) {\r\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \r\n//} else {\r\n// messageBody += '00'; // Analog Face Default FACE ID 0 \r\n//}\r\n// Watch Display setting related to Step and heart rate settings\r\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\r\n messageBody += '081B0000'; //both displays\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n messageBody += (numDuplas > 2) ? 'E' : '6';\r\n //messageBody += '6'; //menu 1 and 2 \r\n //messageBody += 'E'; //menu 1 and 2 and contact (menu 3) \r\n messageBody += '000000'; // other settings\r\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\r\n messageBody += '080B0000'; // step display\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n //messageBody += '4'; //menu 2 \r\n //messageBody += 'C'; // menu 2 and contact (menu 3) \r\n messageBody += (numDuplas > 2) ? 'C' : '4';\r\n messageBody += '000000'; // other settings\r\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\r\n messageBody += '08130000'; // heart display\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n //messageBody += '2'; //menu 1 no contact (menu 3) \r\n //messageBody += 'A'; //menu 1 and contact (menu 3) \r\n messageBody += (numDuplas > 2) ? 'A' : '2';\r\n messageBody += '000000'; // other settings\r\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\r\n messageBody += '08030000'; // no displays\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n //messageBody += '0000000'; // no menu , //08 only contact\r\n //messageBody += '8'; // //08 only contact\r\n messageBody += (numDuplas > 2) ? '8' : '0';\r\n messageBody += '000000'; // other settings\r\n} else {\r\n messageBody += '08030000'; //no displays\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n messageBody += '0000000'; // no menu..\r\n}\r\n//menu items for the future\r\n/*if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'true')) {\r\n messageBody += '06000000'; //menu 1 and 2\r\n} else if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'false')) {\r\n messageBody += '04000000'; //menu 2\r\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'true')) {\r\n messageBody += '02000000'; //menu 1\r\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'false')) {\r\n messageBody += '00000000'; // no menu\r\n} else {\r\n messageBody += '00000000'; // no menu\r\n}*/\r\n// from autohome page to the end\r\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\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\n//AddValueSMS('dataSMS', dataSMS);\r\nvar commandConfigs = {\r\n template: \"main\",\r\n configs: configs //,\r\n //configsSMS: configsSMS\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n// functions\r\nfunction AddValue(p1, p2) {\r\n var cvpair = {\r\n code: p1,\r\n value: p2\r\n };\r\n configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n var cvpair = {\r\n code: p1,\r\n value: p2\r\n };\r\n configsSMS.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n var arr1 = [];\r\n for (var n = 0, l = str.length; n < l; n++) {\r\n var hex = Number(str.charCodeAt(n)).toString(16);\r\n arr1.push(hex);\r\n }\r\n return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n var crc = 0x0000;\r\n var j, i;\r\n for (i = 0; i < s.length; i++) {\r\n c = s[i];\r\n if (c > 255) {\r\n throw new RangeError();\r\n }\r\n j = (c ^ (crc >> 8)) & 0xFF;\r\n crc = crcTable[j] ^ (crc << 8);\r\n }\r\n return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n var splitStr = []\r\n var j = 0\r\n for (let i = 0; i < str.length; i += 2) {\r\n splitStr[j] = str.substring(i, i + 2)\r\n j++\r\n }\r\n var bytes = []\r\n var bytePos = 0\r\n for (let i = 0; i < splitStr.length; i++) {\r\n var byteStr = splitStr[i]\r\n var b = parseInt(byteStr, 16)\r\n if (b < 256) {\r\n bytes[bytePos] = b\r\n bytePos++\r\n }\r\n }\r\n return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n hexString = str.toString(16);\r\n return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n let bin = 0;\r\n let rem, i = 1,\r\n step = 1;\r\n while (x != 0) {\r\n rem = x % 2;\r\n x = parseInt(x / 2);\r\n bin = bin + rem * i;\r\n i = i * 10;\r\n }\r\n return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n var hexa = parseInt(x, 2).toString(16);\r\n return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n const result = [];\r\n let len = string.length - 2;\r\n while (len >= 0) {\r\n result.push(string.substr(len, 2));\r\n len -= 2;\r\n }\r\n return result.join('');\r\n}","AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"CommandToUpdateId":null,"ParentId":null,"Parent":null,"HasAck":true,"HexString":true,"SendAttempts":4,"Order":null},"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":12337,"Group":{"Id":7390,"Name":"Approved Contacts","Json":{"description":"","columns":1,"order":2,"listSize":8,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Contact","Json":"{\"name\":\"Contact\",\"default\":\"\",\"description\":\"Contact\",\"type\":\"phone\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Phone number of the contact\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":{"Id":5806,"Protocol":{"Id":297,"Code":"Access TEC Care Watch","Version":"1.6","FirmwareVersion":"V06.8601.2501","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":true},"Name":"setWatchSettings","TemplateSMS":null,"Template":"<>","AckTemplate":null,"Operation":"// Watch Settings\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 Watch Settings' Only enable y disable:\r\n// params.StepCounting.EnableDisableStepCounting == 'true'\r\n// params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true'\r\n//var params = {StepCounting:{'EnableDisableStepCounting':'true'},HeartRateMonitor:{'EnableDisableHeartRateMonitor':'true'}, DeviceVersion:{'DeviceVersion':2}}\r\n// Test enabled both\r\n// AB 10 13 00 99 6A 0A 00 02 11 36 00 08 1B 00 00 0E 00 00 00 14 00 00 00 03 0A 01\r\n// test step on HRT off\r\n// AB 10 13 00 DD 0C 0B 00 02 11 36 00 08 0B 00 00 0C 00 00 00 14 00 00 00 03 0A 01\r\n// test step off HRT on\r\n// AB 10 13 00 B5 D0 09 00 02 11 36 00 08 13 00 00 0A 00 00 00 14 00 00 00 03 0A 01\r\n// test both off \r\n// AB 10 13 00 F1 B6 0C 00 02 11 36 00 08 03 00 00 08 00 00 00 14 00 00 00 03 0A 01 \r\n// comando para Contact on ( on HR, Steps, SPO2)\r\n//AB 10 13 00 4C 2E 03 00 02 11 36 00 08 1B 00 00 4E 00 00 00 14 00 00 00 03 0A 01\r\n// comando para contact off ( on HR, Steps, SPO2)\r\n//AB 10 13 00 C2 8C 04 00 02 11 36 00 08 1B 00 00 46 00 00 00 14 00 00 00 03 0A 01\r\nvar msg = [];\r\nvar configs = [];\r\n// To store the quantity of contacts in the whitelist to enable disable the contact menu\r\n//var contactos = params.ApprovedContacts && params.ApprovedContacts.Contact;\r\nvar numDuplas = Array.isArray(params.ApprovedContacts) ? params.ApprovedContacts.length : 0;\r\n// configuration command (0X02) , lenght and key\r\nvar messageBody = '021136';\r\n// step count/heart value display\r\n// Watch setting related FACE ID\r\nmessageBody += '00'; // Default FACE ID 0 \r\n// Future\r\n//if (params.WatchFace.SetWatchFace) {\r\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \r\n//} else {\r\n// messageBody += '00'; // Analog Face Default FACE ID 0 \r\n//}\r\n// Watch Display setting related to Step and heart rate settings\r\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\r\n messageBody += '081B0000'; //both displays\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n messageBody += (numDuplas > 0) ? 'E' : '6';\r\n //messageBody += '6'; //menu 1 and 2 \r\n //messageBody += 'E'; //menu 1 and 2 and contact (menu 3) \r\n messageBody += '000000'; // other settings\r\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\r\n messageBody += '080B0000'; // step display\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n //messageBody += '4'; //menu 2 \r\n //messageBody += 'C'; // menu 2 and contact (menu 3) \r\n messageBody += (numDuplas > 0) ? 'C' : '4';\r\n messageBody += '000000'; // other settings\r\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\r\n messageBody += '08130000'; // heart display\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n //messageBody += '2'; //menu 1 no contact (menu 3) \r\n //messageBody += 'A'; //menu 1 and contact (menu 3) \r\n messageBody += (numDuplas > 0) ? 'A' : '2';\r\n messageBody += '000000'; // other settings\r\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\r\n messageBody += '08030000'; // no displays\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n //messageBody += '0000000'; // no menu , //08 only contact\r\n //messageBody += '8'; // //08 only contact\r\n messageBody += (numDuplas > 0) ? '8' : '0';\r\n messageBody += '000000'; // other settings\r\n} else {\r\n messageBody += '08030000'; //no displays\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n messageBody += '0000000'; // no menu..\r\n}\r\n//menu items for the future\r\n/*if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'true')) {\r\n messageBody += '06000000'; //menu 1 and 2\r\n} else if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'false')) {\r\n messageBody += '04000000'; //menu 2\r\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'true')) {\r\n messageBody += '02000000'; //menu 1\r\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'false')) {\r\n messageBody += '00000000'; // no menu\r\n} else {\r\n messageBody += '00000000'; // no menu\r\n}*/\r\n// from autohome page to the end\r\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\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\n//AddValueSMS('dataSMS', dataSMS);\r\nvar commandConfigs = {\r\n template: \"main\",\r\n configs: configs //,\r\n //configsSMS: configsSMS\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n// functions\r\nfunction AddValue(p1, p2) {\r\n var cvpair = {\r\n code: p1,\r\n value: p2\r\n };\r\n configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n var cvpair = {\r\n code: p1,\r\n value: p2\r\n };\r\n configsSMS.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n var arr1 = [];\r\n for (var n = 0, l = str.length; n < l; n++) {\r\n var hex = Number(str.charCodeAt(n)).toString(16);\r\n arr1.push(hex);\r\n }\r\n return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n var crc = 0x0000;\r\n var j, i;\r\n for (i = 0; i < s.length; i++) {\r\n c = s[i];\r\n if (c > 255) {\r\n throw new RangeError();\r\n }\r\n j = (c ^ (crc >> 8)) & 0xFF;\r\n crc = crcTable[j] ^ (crc << 8);\r\n }\r\n return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n var splitStr = []\r\n var j = 0\r\n for (let i = 0; i < str.length; i += 2) {\r\n splitStr[j] = str.substring(i, i + 2)\r\n j++\r\n }\r\n var bytes = []\r\n var bytePos = 0\r\n for (let i = 0; i < splitStr.length; i++) {\r\n var byteStr = splitStr[i]\r\n var b = parseInt(byteStr, 16)\r\n if (b < 256) {\r\n bytes[bytePos] = b\r\n bytePos++\r\n }\r\n }\r\n return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n hexString = str.toString(16);\r\n return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n let bin = 0;\r\n let rem, i = 1,\r\n step = 1;\r\n while (x != 0) {\r\n rem = x % 2;\r\n x = parseInt(x / 2);\r\n bin = bin + rem * i;\r\n i = i * 10;\r\n }\r\n return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n var hexa = parseInt(x, 2).toString(16);\r\n return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n const result = [];\r\n let len = string.length - 2;\r\n while (len >= 0) {\r\n result.push(string.substr(len, 2));\r\n len -= 2;\r\n }\r\n return result.join('');\r\n}","AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"CommandToUpdateId":null,"ParentId":null,"Parent":null,"HasAck":true,"HexString":true,"SendAttempts":4,"Order":null},"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":12388,"Group":{"Id":7454,"Name":"SPO2 Settings","Json":{"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":"Reporting Frequency","Json":"{\"name\":\"Reporting Frequency\",\"default\":\"\",\"description\":null,\"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\":\"720\",\"label\":\"12 hours\"},{\"value\":\"360\",\"label\":\"6 hours\"},{\"value\":\"60\",\"label\":\"1 hour\"},{\"value\":\"30\",\"label\":\"30 min\"}],\"toTranslate\":[\"name\",\"description\",\"helpText\",\"label\"]}","Default":"","Command":{"Id":5806,"Protocol":{"Id":297,"Code":"Access TEC Care Watch","Version":"1.6","FirmwareVersion":"V06.8601.2501","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":true},"Name":"setWatchSettings","TemplateSMS":null,"Template":"<>","AckTemplate":null,"Operation":"// Watch Settings\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 Watch Settings' Only enable y disable:\r\n// params.StepCounting.EnableDisableStepCounting == 'true'\r\n// params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true'\r\n//var params = {StepCounting:{'EnableDisableStepCounting':'true'},HeartRateMonitor:{'EnableDisableHeartRateMonitor':'true'}, DeviceVersion:{'DeviceVersion':2}}\r\n// Test enabled both\r\n// AB 10 13 00 99 6A 0A 00 02 11 36 00 08 1B 00 00 0E 00 00 00 14 00 00 00 03 0A 01\r\n// test step on HRT off\r\n// AB 10 13 00 DD 0C 0B 00 02 11 36 00 08 0B 00 00 0C 00 00 00 14 00 00 00 03 0A 01\r\n// test step off HRT on\r\n// AB 10 13 00 B5 D0 09 00 02 11 36 00 08 13 00 00 0A 00 00 00 14 00 00 00 03 0A 01\r\n// test both off \r\n// AB 10 13 00 F1 B6 0C 00 02 11 36 00 08 03 00 00 08 00 00 00 14 00 00 00 03 0A 01 \r\n// comando para Contact on ( on HR, Steps, SPO2)\r\n//AB 10 13 00 4C 2E 03 00 02 11 36 00 08 1B 00 00 4E 00 00 00 14 00 00 00 03 0A 01\r\n// comando para contact off ( on HR, Steps, SPO2)\r\n//AB 10 13 00 C2 8C 04 00 02 11 36 00 08 1B 00 00 46 00 00 00 14 00 00 00 03 0A 01\r\nvar msg = [];\r\nvar configs = [];\r\n// To store the quantity of contacts in the whitelist to enable disable the contact menu\r\n//var contactos = params.ApprovedContacts && params.ApprovedContacts.Contact;\r\nvar numDuplas = Array.isArray(params.ApprovedContacts) ? params.ApprovedContacts.length : 0;\r\n// configuration command (0X02) , lenght and key\r\nvar messageBody = '021136';\r\n// step count/heart value display\r\n// Watch setting related FACE ID\r\nmessageBody += '00'; // Default FACE ID 0 \r\n// Future\r\n//if (params.WatchFace.SetWatchFace) {\r\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \r\n//} else {\r\n// messageBody += '00'; // Analog Face Default FACE ID 0 \r\n//}\r\n// Watch Display setting related to Step and heart rate settings\r\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\r\n messageBody += '081B0000'; //both displays\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n messageBody += (numDuplas > 0) ? 'E' : '6';\r\n //messageBody += '6'; //menu 1 and 2 \r\n //messageBody += 'E'; //menu 1 and 2 and contact (menu 3) \r\n messageBody += '000000'; // other settings\r\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\r\n messageBody += '080B0000'; // step display\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n //messageBody += '4'; //menu 2 \r\n //messageBody += 'C'; // menu 2 and contact (menu 3) \r\n messageBody += (numDuplas > 0) ? 'C' : '4';\r\n messageBody += '000000'; // other settings\r\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\r\n messageBody += '08130000'; // heart display\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n //messageBody += '2'; //menu 1 no contact (menu 3) \r\n //messageBody += 'A'; //menu 1 and contact (menu 3) \r\n messageBody += (numDuplas > 0) ? 'A' : '2';\r\n messageBody += '000000'; // other settings\r\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\r\n messageBody += '08030000'; // no displays\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n //messageBody += '0000000'; // no menu , //08 only contact\r\n //messageBody += '8'; // //08 only contact\r\n messageBody += (numDuplas > 0) ? '8' : '0';\r\n messageBody += '000000'; // other settings\r\n} else {\r\n messageBody += '08030000'; //no displays\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n messageBody += '0000000'; // no menu..\r\n}\r\n//menu items for the future\r\n/*if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'true')) {\r\n messageBody += '06000000'; //menu 1 and 2\r\n} else if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'false')) {\r\n messageBody += '04000000'; //menu 2\r\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'true')) {\r\n messageBody += '02000000'; //menu 1\r\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'false')) {\r\n messageBody += '00000000'; // no menu\r\n} else {\r\n messageBody += '00000000'; // no menu\r\n}*/\r\n// from autohome page to the end\r\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\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\n//AddValueSMS('dataSMS', dataSMS);\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// functions\r\nfunction AddValue(p1, p2) {\r\n var cvpair = {\r\n code: p1,\r\n value: p2\r\n };\r\n configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n var cvpair = {\r\n code: p1,\r\n value: p2\r\n };\r\n configsSMS.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n var arr1 = [];\r\n for (var n = 0, l = str.length; n < l; n++) {\r\n var hex = Number(str.charCodeAt(n)).toString(16);\r\n arr1.push(hex);\r\n }\r\n return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n var crc = 0x0000;\r\n var j, i;\r\n for (i = 0; i < s.length; i++) {\r\n c = s[i];\r\n if (c > 255) {\r\n throw new RangeError();\r\n }\r\n j = (c ^ (crc >> 8)) & 0xFF;\r\n crc = crcTable[j] ^ (crc << 8);\r\n }\r\n return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n var splitStr = []\r\n var j = 0\r\n for (let i = 0; i < str.length; i += 2) {\r\n splitStr[j] = str.substring(i, i + 2)\r\n j++\r\n }\r\n var bytes = []\r\n var bytePos = 0\r\n for (let i = 0; i < splitStr.length; i++) {\r\n var byteStr = splitStr[i]\r\n var b = parseInt(byteStr, 16)\r\n if (b < 256) {\r\n bytes[bytePos] = b\r\n bytePos++\r\n }\r\n }\r\n return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n hexString = str.toString(16);\r\n return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n let bin = 0;\r\n let rem, i = 1,\r\n step = 1;\r\n while (x != 0) {\r\n rem = x % 2;\r\n x = parseInt(x / 2);\r\n bin = bin + rem * i;\r\n i = i * 10;\r\n }\r\n return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n var hexa = parseInt(x, 2).toString(16);\r\n return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n const result = [];\r\n let len = string.length - 2;\r\n while (len >= 0) {\r\n result.push(string.substr(len, 2));\r\n len -= 2;\r\n }\r\n return result.join('');\r\n}","AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"CommandToUpdateId":null,"ParentId":null,"Parent":null,"HasAck":true,"HexString":true,"SendAttempts":4,"Order":null},"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":12362,"Group":{"Id":7416,"Name":"Heartrate Settings","Json":{"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":"Reporting Frequency","Json":"{\"name\":\"Reporting Frequency\",\"default\":\"\",\"description\":null,\"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\":\"720\",\"label\":\"12 hours\"},{\"value\":\"360\",\"label\":\"6 hours\"},{\"value\":\"60\",\"label\":\"1 hour\"},{\"value\":\"30\",\"label\":\"30 min\"}],\"toTranslate\":[\"name\",\"description\",\"helpText\",\"label\"]}","Default":"","Command":{"Id":5806,"Protocol":{"Id":297,"Code":"Access TEC Care Watch","Version":"1.6","FirmwareVersion":"V06.8601.2501","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":true},"Name":"setWatchSettings","TemplateSMS":null,"Template":"<>","AckTemplate":null,"Operation":"// Watch Settings\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 Watch Settings' Only enable y disable:\r\n// params.StepCounting.EnableDisableStepCounting == 'true'\r\n// params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true'\r\n//var params = {StepCounting:{'EnableDisableStepCounting':'true'},HeartRateMonitor:{'EnableDisableHeartRateMonitor':'true'}, DeviceVersion:{'DeviceVersion':2}}\r\n// Test enabled both\r\n// AB 10 13 00 99 6A 0A 00 02 11 36 00 08 1B 00 00 0E 00 00 00 14 00 00 00 03 0A 01\r\n// test step on HRT off\r\n// AB 10 13 00 DD 0C 0B 00 02 11 36 00 08 0B 00 00 0C 00 00 00 14 00 00 00 03 0A 01\r\n// test step off HRT on\r\n// AB 10 13 00 B5 D0 09 00 02 11 36 00 08 13 00 00 0A 00 00 00 14 00 00 00 03 0A 01\r\n// test both off \r\n// AB 10 13 00 F1 B6 0C 00 02 11 36 00 08 03 00 00 08 00 00 00 14 00 00 00 03 0A 01 \r\n// comando para Contact on ( on HR, Steps, SPO2)\r\n//AB 10 13 00 4C 2E 03 00 02 11 36 00 08 1B 00 00 4E 00 00 00 14 00 00 00 03 0A 01\r\n// comando para contact off ( on HR, Steps, SPO2)\r\n//AB 10 13 00 C2 8C 04 00 02 11 36 00 08 1B 00 00 46 00 00 00 14 00 00 00 03 0A 01\r\nvar msg = [];\r\nvar configs = [];\r\n// To store the quantity of contacts in the whitelist to enable disable the contact menu\r\n//var contactos = params.ApprovedContacts && params.ApprovedContacts.Contact;\r\nvar numDuplas = Array.isArray(params.ApprovedContacts) ? params.ApprovedContacts.length : 0;\r\n// configuration command (0X02) , lenght and key\r\nvar messageBody = '021136';\r\n// step count/heart value display\r\n// Watch setting related FACE ID\r\nmessageBody += '00'; // Default FACE ID 0 \r\n// Future\r\n//if (params.WatchFace.SetWatchFace) {\r\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \r\n//} else {\r\n// messageBody += '00'; // Analog Face Default FACE ID 0 \r\n//}\r\n// Watch Display setting related to Step and heart rate settings\r\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\r\n messageBody += '081B0000'; //both displays\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n messageBody += (numDuplas > 0) ? 'E' : '6';\r\n //messageBody += '6'; //menu 1 and 2 \r\n //messageBody += 'E'; //menu 1 and 2 and contact (menu 3) \r\n messageBody += '000000'; // other settings\r\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\r\n messageBody += '080B0000'; // step display\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n //messageBody += '4'; //menu 2 \r\n //messageBody += 'C'; // menu 2 and contact (menu 3) \r\n messageBody += (numDuplas > 0) ? 'C' : '4';\r\n messageBody += '000000'; // other settings\r\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\r\n messageBody += '08130000'; // heart display\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n //messageBody += '2'; //menu 1 no contact (menu 3) \r\n //messageBody += 'A'; //menu 1 and contact (menu 3) \r\n messageBody += (numDuplas > 0) ? 'A' : '2';\r\n messageBody += '000000'; // other settings\r\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\r\n messageBody += '08030000'; // no displays\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n //messageBody += '0000000'; // no menu , //08 only contact\r\n //messageBody += '8'; // //08 only contact\r\n messageBody += (numDuplas > 0) ? '8' : '0';\r\n messageBody += '000000'; // other settings\r\n} else {\r\n messageBody += '08030000'; //no displays\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n messageBody += '0000000'; // no menu..\r\n}\r\n//menu items for the future\r\n/*if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'true')) {\r\n messageBody += '06000000'; //menu 1 and 2\r\n} else if ((params.WatchFace.StepCountingWatchFace == 'true') && (params.WatchFace.HeartRateWatchFace == 'false')) {\r\n messageBody += '04000000'; //menu 2\r\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'true')) {\r\n messageBody += '02000000'; //menu 1\r\n} else if ((params.WatchFace.StepCountingWatchFace == 'false') && (params.WatchFace.HeartRateWatchFace == 'false')) {\r\n messageBody += '00000000'; // no menu\r\n} else {\r\n messageBody += '00000000'; // no menu\r\n}*/\r\n// from autohome page to the end\r\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\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\n//AddValueSMS('dataSMS', dataSMS);\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// functions\r\nfunction AddValue(p1, p2) {\r\n var cvpair = {\r\n code: p1,\r\n value: p2\r\n };\r\n configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n var cvpair = {\r\n code: p1,\r\n value: p2\r\n };\r\n configsSMS.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n var arr1 = [];\r\n for (var n = 0, l = str.length; n < l; n++) {\r\n var hex = Number(str.charCodeAt(n)).toString(16);\r\n arr1.push(hex);\r\n }\r\n return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n var crc = 0x0000;\r\n var j, i;\r\n for (i = 0; i < s.length; i++) {\r\n c = s[i];\r\n if (c > 255) {\r\n throw new RangeError();\r\n }\r\n j = (c ^ (crc >> 8)) & 0xFF;\r\n crc = crcTable[j] ^ (crc << 8);\r\n }\r\n return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n var splitStr = []\r\n var j = 0\r\n for (let i = 0; i < str.length; i += 2) {\r\n splitStr[j] = str.substring(i, i + 2)\r\n j++\r\n }\r\n var bytes = []\r\n var bytePos = 0\r\n for (let i = 0; i < splitStr.length; i++) {\r\n var byteStr = splitStr[i]\r\n var b = parseInt(byteStr, 16)\r\n if (b < 256) {\r\n bytes[bytePos] = b\r\n bytePos++\r\n }\r\n }\r\n return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n hexString = str.toString(16);\r\n return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n let bin = 0;\r\n let rem, i = 1,\r\n step = 1;\r\n while (x != 0) {\r\n rem = x % 2;\r\n x = parseInt(x / 2);\r\n bin = bin + rem * i;\r\n i = i * 10;\r\n }\r\n return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n var hexa = parseInt(x, 2).toString(16);\r\n return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n const result = [];\r\n let len = string.length - 2;\r\n while (len >= 0) {\r\n result.push(string.substr(len, 2));\r\n len -= 2;\r\n }\r\n return result.join('');\r\n}","AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"CommandToUpdateId":null,"ParentId":null,"Parent":null,"HasAck":true,"HexString":true,"SendAttempts":4,"Order":null},"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":12337,"Group":{"Id":7390,"Name":"Approved Contacts","Json":{"description":"","columns":1,"order":2,"listSize":8,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Contact","Json":"{\"name\":\"Contact\",\"default\":\"\",\"description\":\"Contact\",\"type\":\"phone\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Phone number of the contact\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":{"Id":5819,"Protocol":{"Id":297,"Code":"Access TEC Care Watch","Version":"1.6","FirmwareVersion":"V06.8601.2501","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":true},"Name":"setAuthorisedNumbersAndWatchSettings","TemplateSMS":null,"Template":"<>","AckTemplate":null,"Operation":"// Combinated version setAuthorisedNumber with Watch Settings for EV06\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// AB 10 22 00 32 FA 00 00 02 11 36 00 00 00 00 00 00 00 00 00 14 00 00 00 00 0A 00 0E 34 80 09 31 32 33 34 35 36 37 38 39 00 00\r\n// [Length]:11 [Key]:36 [Value]:00 00 00 00 00 00 00 00 00 14 00 00 00 00 0A 00\r\n//{\"watch\":{\"status18\":0,\"status17\":0,\"status19\":0,\"status10\":0,\"flagValue\":0,\"status12\":0,\"faceId\":0,\"status11\":0,\"status14\":0,\"status13\":0,\"status16\":0,\"status15\":0,\"status0\":0,\"status1\":0,\"menu8\":0,\"menu7\":0,\"menu6\":0,\"menu5\":0,\"menu4\":0,\"menu3\":0,\"menu2\":0,\"menu1\":0,\"autoTime\":20,\"brightNess\":0,\"logoIndex\":0,\"status20\":0,\"status8\":0,\"status9\":0,\"status2\":0,\"status3\":0,\"brightTime\":10}}\r\n//[Length]:0E [Key]:34 [Value]:80 09 31 32 33 34 35 36 37 38 39 00 00\r\n//{\"numberNamePhoto\":{\"call\":0,\"noCard\":0,\"number\":\"123456789\",\"enable\":1,\"sms\":0,\"name\":\"\",\"headURL\":\"\",\"index\":0}}\r\n// para pruebas en local Contact':\r\n//AB 10 12 00 94 ED 00 00 02 10 34 E0 09 31 32 33 34 35 36 37 38 39 02 79 6F 00\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 phoneNumber = '';\r\nvar numberLength = '00';\r\nvar numberHex = '';\r\nvar nameLength = '00';\r\nvar nameHex = '';\r\nvar value = '02';\r\nvar keyLength = '00';\r\nvar confTel = '';\r\nvar count = 1; // approved contact will be from A2 to A9 - index 1 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 += \"0534\" + 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 phoneNumber = params.ApprovedContacts[contact].Contact;\r\n if (phoneNumber.startsWith(\"+\")) {\r\n phoneNumber = \"00\" + phoneNumber.substring(1);\r\n }\r\n numberHex = ascii_to_hexa(phoneNumber).toUpperCase();\r\n numberLength = ('00' + decimalToHex(phoneNumber.length)).slice(-2).toUpperCase();\r\n nameHex = ascii_to_hexa(params.ApprovedContacts[contact].Name).toUpperCase();\r\n nameLength = ('00' + decimalToHex(params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\r\n keyLength = ('00' + decimalToHex(5 + phoneNumber.length + params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\r\n value += keyLength + \"34\" + confTel + numberLength + numberHex + nameLength + nameHex + '00'; //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 phoneNumber = params.ApprovedContacts[contact].Contact;\r\n if (phoneNumber.startsWith(\"+\")) {\r\n phoneNumber = \"00\" + phoneNumber.substring(1);\r\n }\r\n numberHex = ascii_to_hexa(phoneNumber).toUpperCase();\r\n numberLength = ('00' + decimalToHex(phoneNumber.length)).slice(-2).toUpperCase();\r\n nameHex = ascii_to_hexa(params.ApprovedContacts[contact].Name).toUpperCase();\r\n nameLength = ('00' + decimalToHex(params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\r\n keyLength = ('00' + decimalToHex(5 + phoneNumber.length + params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\r\n value += keyLength + \"34\" + confTel + numberLength + numberHex + nameLength + nameHex + '00'; //no photo\r\n //value += keyLength + \"30\" + confTel + numberHex; //no photo \r\n }\r\n count++;\r\n}\r\ncounter = count; // to check how many contacts are in the lists\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 += \"0534\" + confTel + '000000'; //no number, no name, no photo\r\n}\r\n// watch settings section\r\n// lenght and key\r\nvar messageBody = '1136';\r\n// step count/heart value display\r\n// Watch setting related FACE ID\r\nmessageBody += '00'; // Default FACE ID 0 \r\n// Future\r\n//if (params.WatchFace.SetWatchFace) {\r\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \r\n//} else {\r\n// messageBody += '00'; // Analog Face Default FACE ID 0 \r\n//}\r\n// Watch Display setting related to Step and heart rate settings\r\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\r\n messageBody += '081B0000'; //both displays\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n messageBody += (counter > 1) ? 'E' : '6';\r\n //messageBody += '6'; //menu 1 and 2 \r\n //messageBody += 'E'; //menu 1 and 2 and contact (menu 3) \r\n messageBody += '000000'; // other settings\r\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\r\n messageBody += '080B0000'; // step display\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n //messageBody += '4'; //menu 2 \r\n //messageBody += 'C'; // menu 2 and contact (menu 3) \r\n messageBody += (counter > 1) ? 'C' : '4';\r\n messageBody += '000000'; // other settings\r\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\r\n messageBody += '08130000'; // heart display\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n //messageBody += '2'; //menu 1 no contact (menu 3) \r\n //messageBody += 'A'; //menu 1 and contact (menu 3) \r\n messageBody += (counter > 1) ? 'A' : '2';\r\n messageBody += '000000'; // other settings\r\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\r\n messageBody += '08030000'; // no displays\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n //messageBody += '0000000'; // no menu , //08 only contact\r\n //messageBody += '8'; // //08 only contact\r\n messageBody += (counter > 1) ? '8' : '0';\r\n messageBody += '000000'; // other settings\r\n} else {\r\n messageBody += '08030000'; //no displays\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n messageBody += '0000000'; // no menu..\r\n}\r\n// from autohome page to the end\r\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\r\nvalue += messageBody; //add watchsetting hex to contact hex in value var \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}","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":12361,"Group":{"Id":7416,"Name":"Heartrate Settings","Json":{"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":"Enable Disable Heartrate Settings","Json":"{\"name\":\"Enable Disable Heartrate Settings\",\"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":{"Id":5819,"Protocol":{"Id":297,"Code":"Access TEC Care Watch","Version":"1.6","FirmwareVersion":"V06.8601.2501","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":true},"Name":"setAuthorisedNumbersAndWatchSettings","TemplateSMS":null,"Template":"<>","AckTemplate":null,"Operation":"// Combinated version setAuthorisedNumber with Watch Settings for EV06\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// AB 10 22 00 32 FA 00 00 02 11 36 00 00 00 00 00 00 00 00 00 14 00 00 00 00 0A 00 0E 34 80 09 31 32 33 34 35 36 37 38 39 00 00\r\n// [Length]:11 [Key]:36 [Value]:00 00 00 00 00 00 00 00 00 14 00 00 00 00 0A 00\r\n//{\"watch\":{\"status18\":0,\"status17\":0,\"status19\":0,\"status10\":0,\"flagValue\":0,\"status12\":0,\"faceId\":0,\"status11\":0,\"status14\":0,\"status13\":0,\"status16\":0,\"status15\":0,\"status0\":0,\"status1\":0,\"menu8\":0,\"menu7\":0,\"menu6\":0,\"menu5\":0,\"menu4\":0,\"menu3\":0,\"menu2\":0,\"menu1\":0,\"autoTime\":20,\"brightNess\":0,\"logoIndex\":0,\"status20\":0,\"status8\":0,\"status9\":0,\"status2\":0,\"status3\":0,\"brightTime\":10}}\r\n//[Length]:0E [Key]:34 [Value]:80 09 31 32 33 34 35 36 37 38 39 00 00\r\n//{\"numberNamePhoto\":{\"call\":0,\"noCard\":0,\"number\":\"123456789\",\"enable\":1,\"sms\":0,\"name\":\"\",\"headURL\":\"\",\"index\":0}}\r\n// para pruebas en local Contact':\r\n//AB 10 12 00 94 ED 00 00 02 10 34 E0 09 31 32 33 34 35 36 37 38 39 02 79 6F 00\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 phoneNumber = '';\r\nvar numberLength = '00';\r\nvar numberHex = '';\r\nvar nameLength = '00';\r\nvar nameHex = '';\r\nvar value = '02';\r\nvar keyLength = '00';\r\nvar confTel = '';\r\nvar count = 1; // approved contact will be from A2 to A9 - index 1 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\ncounter = 0; // to check how many contacts are in the lists\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 += \"0534\" + 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 phoneNumber = params.ApprovedContacts[contact].Contact;\r\n if (phoneNumber.startsWith(\"+\")) {\r\n phoneNumber = \"00\" + phoneNumber.substring(1);\r\n }\r\n numberHex = ascii_to_hexa(phoneNumber).toUpperCase();\r\n numberLength = ('00' + decimalToHex(phoneNumber.length)).slice(-2).toUpperCase();\r\n nameHex = ascii_to_hexa(params.ApprovedContacts[contact].Name).toUpperCase();\r\n nameLength = ('00' + decimalToHex(params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\r\n keyLength = ('00' + decimalToHex(5 + phoneNumber.length + params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\r\n value += keyLength + \"34\" + confTel + numberLength + numberHex + nameLength + nameHex + '00'; //no photo\r\n //value += keyLength + \"30\" + confTel + numberHex; //no photo \r\n counter++;\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 phoneNumber = params.ApprovedContacts[contact].Contact;\r\n if (phoneNumber.startsWith(\"+\")) {\r\n phoneNumber = \"00\" + phoneNumber.substring(1);\r\n }\r\n numberHex = ascii_to_hexa(phoneNumber).toUpperCase();\r\n numberLength = ('00' + decimalToHex(phoneNumber.length)).slice(-2).toUpperCase();\r\n nameHex = ascii_to_hexa(params.ApprovedContacts[contact].Name).toUpperCase();\r\n nameLength = ('00' + decimalToHex(params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\r\n keyLength = ('00' + decimalToHex(5 + phoneNumber.length + params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\r\n value += keyLength + \"34\" + confTel + numberLength + numberHex + nameLength + nameHex + '00'; //no photo\r\n //value += keyLength + \"30\" + confTel + numberHex; //no photo \r\n counter++;\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 += \"0534\" + confTel + '000000'; //no number, no name, no photo\r\n}\r\n// watch settings section\r\n// lenght and key\r\nvar messageBody = '1136';\r\n// step count/heart value display\r\n// Watch setting related FACE ID\r\nmessageBody += '00'; // Default FACE ID 0 \r\n// Future\r\n//if (params.WatchFace.SetWatchFace) {\r\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \r\n//} else {\r\n// messageBody += '00'; // Analog Face Default FACE ID 0 \r\n//}\r\n// Watch Display setting related to Step and heart rate settings\r\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\r\n messageBody += '081B0000'; //both displays\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n messageBody += (counter > 0) ? 'E' : '6';\r\n //messageBody += '6'; //menu 1 and 2 \r\n //messageBody += 'E'; //menu 1 and 2 and contact (menu 3) \r\n messageBody += '000000'; // other settings\r\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\r\n messageBody += '080B0000'; // step display\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n //messageBody += '4'; //menu 2 \r\n //messageBody += 'C'; // menu 2 and contact (menu 3) \r\n messageBody += (counter > 0) ? 'C' : '4';\r\n messageBody += '000000'; // other settings\r\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\r\n messageBody += '08130000'; // heart display\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n //messageBody += '2'; //menu 1 no contact (menu 3) \r\n //messageBody += 'A'; //menu 1 and contact (menu 3) \r\n messageBody += (counter > 0) ? 'A' : '2';\r\n messageBody += '000000'; // other settings\r\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\r\n messageBody += '08030000'; // no displays\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n //messageBody += '0000000'; // no menu , //08 only contact\r\n //messageBody += '8'; // //08 only contact\r\n messageBody += (counter > 0) ? '8' : '0';\r\n messageBody += '000000'; // other settings\r\n} else {\r\n messageBody += '08030000'; //no displays\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n messageBody += '0000000'; // no menu..\r\n}\r\n// from autohome page to the end\r\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\r\nvalue += messageBody; //add watchsetting hex to contact hex in value var \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}","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":12362,"Group":{"Id":7416,"Name":"Heartrate Settings","Json":{"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":"Reporting Frequency","Json":"{\"name\":\"Reporting Frequency\",\"default\":\"\",\"description\":null,\"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\":\"720\",\"label\":\"12 hours\"},{\"value\":\"360\",\"label\":\"6 hours\"},{\"value\":\"60\",\"label\":\"1 hour\"},{\"value\":\"30\",\"label\":\"30 min\"}],\"toTranslate\":[\"name\",\"description\",\"helpText\",\"label\"]}","Default":"","Command":{"Id":5819,"Protocol":{"Id":297,"Code":"Access TEC Care Watch","Version":"1.6","FirmwareVersion":"V06.8601.2501","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":true},"Name":"setAuthorisedNumbersAndWatchSettings","TemplateSMS":null,"Template":"<>","AckTemplate":null,"Operation":"// Combinated version setAuthorisedNumber with Watch Settings for EV06\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// AB 10 22 00 32 FA 00 00 02 11 36 00 00 00 00 00 00 00 00 00 14 00 00 00 00 0A 00 0E 34 80 09 31 32 33 34 35 36 37 38 39 00 00\r\n// [Length]:11 [Key]:36 [Value]:00 00 00 00 00 00 00 00 00 14 00 00 00 00 0A 00\r\n//{\"watch\":{\"status18\":0,\"status17\":0,\"status19\":0,\"status10\":0,\"flagValue\":0,\"status12\":0,\"faceId\":0,\"status11\":0,\"status14\":0,\"status13\":0,\"status16\":0,\"status15\":0,\"status0\":0,\"status1\":0,\"menu8\":0,\"menu7\":0,\"menu6\":0,\"menu5\":0,\"menu4\":0,\"menu3\":0,\"menu2\":0,\"menu1\":0,\"autoTime\":20,\"brightNess\":0,\"logoIndex\":0,\"status20\":0,\"status8\":0,\"status9\":0,\"status2\":0,\"status3\":0,\"brightTime\":10}}\r\n//[Length]:0E [Key]:34 [Value]:80 09 31 32 33 34 35 36 37 38 39 00 00\r\n//{\"numberNamePhoto\":{\"call\":0,\"noCard\":0,\"number\":\"123456789\",\"enable\":1,\"sms\":0,\"name\":\"\",\"headURL\":\"\",\"index\":0}}\r\n// para pruebas en local Contact':\r\n//AB 10 12 00 94 ED 00 00 02 10 34 E0 09 31 32 33 34 35 36 37 38 39 02 79 6F 00\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 phoneNumber = '';\r\nvar numberLength = '00';\r\nvar numberHex = '';\r\nvar nameLength = '00';\r\nvar nameHex = '';\r\nvar value = '02';\r\nvar keyLength = '00';\r\nvar confTel = '';\r\nvar count = 1; // approved contact will be from A2 to A9 - index 1 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\ncounter = 0; // to check how many contacts are in the lists\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 += \"0534\" + 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 phoneNumber = params.ApprovedContacts[contact].Contact;\r\n if (phoneNumber.startsWith(\"+\")) {\r\n phoneNumber = \"00\" + phoneNumber.substring(1);\r\n }\r\n numberHex = ascii_to_hexa(phoneNumber).toUpperCase();\r\n numberLength = ('00' + decimalToHex(phoneNumber.length)).slice(-2).toUpperCase();\r\n nameHex = ascii_to_hexa(params.ApprovedContacts[contact].Name).toUpperCase();\r\n nameLength = ('00' + decimalToHex(params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\r\n keyLength = ('00' + decimalToHex(5 + phoneNumber.length + params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\r\n value += keyLength + \"34\" + confTel + numberLength + numberHex + nameLength + nameHex + '00'; //no photo\r\n //value += keyLength + \"30\" + confTel + numberHex; //no photo \r\n counter++;\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 phoneNumber = params.ApprovedContacts[contact].Contact;\r\n if (phoneNumber.startsWith(\"+\")) {\r\n phoneNumber = \"00\" + phoneNumber.substring(1);\r\n }\r\n numberHex = ascii_to_hexa(phoneNumber).toUpperCase();\r\n numberLength = ('00' + decimalToHex(phoneNumber.length)).slice(-2).toUpperCase();\r\n nameHex = ascii_to_hexa(params.ApprovedContacts[contact].Name).toUpperCase();\r\n nameLength = ('00' + decimalToHex(params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\r\n keyLength = ('00' + decimalToHex(5 + phoneNumber.length + params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\r\n value += keyLength + \"34\" + confTel + numberLength + numberHex + nameLength + nameHex + '00'; //no photo\r\n //value += keyLength + \"30\" + confTel + numberHex; //no photo \r\n counter++;\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 += \"0534\" + confTel + '000000'; //no number, no name, no photo\r\n}\r\n// watch settings section\r\n// lenght and key\r\nvar messageBody = '1136';\r\n// step count/heart value display\r\n// Watch setting related FACE ID\r\nmessageBody += '00'; // Default FACE ID 0 \r\n// Future\r\n//if (params.WatchFace.SetWatchFace) {\r\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \r\n//} else {\r\n// messageBody += '00'; // Analog Face Default FACE ID 0 \r\n//}\r\n// Watch Display setting related to Step and heart rate settings\r\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\r\n messageBody += '081B0000'; //both displays\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n messageBody += (counter > 0) ? 'E' : '6';\r\n //messageBody += '6'; //menu 1 and 2 \r\n //messageBody += 'E'; //menu 1 and 2 and contact (menu 3) \r\n messageBody += '000000'; // other settings\r\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\r\n messageBody += '080B0000'; // step display\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n //messageBody += '4'; //menu 2 \r\n //messageBody += 'C'; // menu 2 and contact (menu 3) \r\n messageBody += (counter > 0) ? 'C' : '4';\r\n messageBody += '000000'; // other settings\r\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\r\n messageBody += '08130000'; // heart display\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n //messageBody += '2'; //menu 1 no contact (menu 3) \r\n //messageBody += 'A'; //menu 1 and contact (menu 3) \r\n messageBody += (counter > 0) ? 'A' : '2';\r\n messageBody += '000000'; // other settings\r\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\r\n messageBody += '08030000'; // no displays\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n //messageBody += '0000000'; // no menu , //08 only contact\r\n //messageBody += '8'; // //08 only contact\r\n messageBody += (counter > 0) ? '8' : '0';\r\n messageBody += '000000'; // other settings\r\n} else {\r\n messageBody += '08030000'; //no displays\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n messageBody += '0000000'; // no menu..\r\n}\r\n// from autohome page to the end\r\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\r\nvalue += messageBody; //add watchsetting hex to contact hex in value var \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}","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":12387,"Group":{"Id":7454,"Name":"SPO2 Settings","Json":{"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":"Enable Disable SPO2 Settings","Json":"{\"name\":\"Enable Disable SPO2 Settings\",\"default\":\"false\",\"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":{"Id":5819,"Protocol":{"Id":297,"Code":"Access TEC Care Watch","Version":"1.6","FirmwareVersion":"V06.8601.2501","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":true},"Name":"setAuthorisedNumbersAndWatchSettings","TemplateSMS":null,"Template":"<>","AckTemplate":null,"Operation":"// Combinated version setAuthorisedNumber with Watch Settings for EV06\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// AB 10 22 00 32 FA 00 00 02 11 36 00 00 00 00 00 00 00 00 00 14 00 00 00 00 0A 00 0E 34 80 09 31 32 33 34 35 36 37 38 39 00 00\r\n// [Length]:11 [Key]:36 [Value]:00 00 00 00 00 00 00 00 00 14 00 00 00 00 0A 00\r\n//{\"watch\":{\"status18\":0,\"status17\":0,\"status19\":0,\"status10\":0,\"flagValue\":0,\"status12\":0,\"faceId\":0,\"status11\":0,\"status14\":0,\"status13\":0,\"status16\":0,\"status15\":0,\"status0\":0,\"status1\":0,\"menu8\":0,\"menu7\":0,\"menu6\":0,\"menu5\":0,\"menu4\":0,\"menu3\":0,\"menu2\":0,\"menu1\":0,\"autoTime\":20,\"brightNess\":0,\"logoIndex\":0,\"status20\":0,\"status8\":0,\"status9\":0,\"status2\":0,\"status3\":0,\"brightTime\":10}}\r\n//[Length]:0E [Key]:34 [Value]:80 09 31 32 33 34 35 36 37 38 39 00 00\r\n//{\"numberNamePhoto\":{\"call\":0,\"noCard\":0,\"number\":\"123456789\",\"enable\":1,\"sms\":0,\"name\":\"\",\"headURL\":\"\",\"index\":0}}\r\n// para pruebas en local Contact':\r\n//AB 10 12 00 94 ED 00 00 02 10 34 E0 09 31 32 33 34 35 36 37 38 39 02 79 6F 00\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 phoneNumber = '';\r\nvar numberLength = '00';\r\nvar numberHex = '';\r\nvar nameLength = '00';\r\nvar nameHex = '';\r\nvar value = '02';\r\nvar keyLength = '00';\r\nvar confTel = '';\r\nvar count = 1; // approved contact will be from A2 to A9 - index 1 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\ncounter = 0; // to check how many contacts are in the lists\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 += \"0534\" + 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 phoneNumber = params.ApprovedContacts[contact].Contact;\r\n if (phoneNumber.startsWith(\"+\")) {\r\n phoneNumber = \"00\" + phoneNumber.substring(1);\r\n }\r\n numberHex = ascii_to_hexa(phoneNumber).toUpperCase();\r\n numberLength = ('00' + decimalToHex(phoneNumber.length)).slice(-2).toUpperCase();\r\n nameHex = ascii_to_hexa(params.ApprovedContacts[contact].Name).toUpperCase();\r\n nameLength = ('00' + decimalToHex(params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\r\n keyLength = ('00' + decimalToHex(5 + phoneNumber.length + params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\r\n value += keyLength + \"34\" + confTel + numberLength + numberHex + nameLength + nameHex + '00'; //no photo\r\n //value += keyLength + \"30\" + confTel + numberHex; //no photo \r\n counter++;\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 phoneNumber = params.ApprovedContacts[contact].Contact;\r\n if (phoneNumber.startsWith(\"+\")) {\r\n phoneNumber = \"00\" + phoneNumber.substring(1);\r\n }\r\n numberHex = ascii_to_hexa(phoneNumber).toUpperCase();\r\n numberLength = ('00' + decimalToHex(phoneNumber.length)).slice(-2).toUpperCase();\r\n nameHex = ascii_to_hexa(params.ApprovedContacts[contact].Name).toUpperCase();\r\n nameLength = ('00' + decimalToHex(params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\r\n keyLength = ('00' + decimalToHex(5 + phoneNumber.length + params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\r\n value += keyLength + \"34\" + confTel + numberLength + numberHex + nameLength + nameHex + '00'; //no photo\r\n //value += keyLength + \"30\" + confTel + numberHex; //no photo \r\n counter++;\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 += \"0534\" + confTel + '000000'; //no number, no name, no photo\r\n}\r\n// watch settings section\r\n// lenght and key\r\nvar messageBody = '1136';\r\n// step count/heart value display\r\n// Watch setting related FACE ID\r\nmessageBody += '00'; // Default FACE ID 0 \r\n// Future\r\n//if (params.WatchFace.SetWatchFace) {\r\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \r\n//} else {\r\n// messageBody += '00'; // Analog Face Default FACE ID 0 \r\n//}\r\n// Watch Display setting related to Step and heart rate settings\r\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\r\n messageBody += '081B0000'; //both displays\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n messageBody += (counter > 0) ? 'E' : '6';\r\n //messageBody += '6'; //menu 1 and 2 \r\n //messageBody += 'E'; //menu 1 and 2 and contact (menu 3) \r\n messageBody += '000000'; // other settings\r\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\r\n messageBody += '080B0000'; // step display\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n //messageBody += '4'; //menu 2 \r\n //messageBody += 'C'; // menu 2 and contact (menu 3) \r\n messageBody += (counter > 0) ? 'C' : '4';\r\n messageBody += '000000'; // other settings\r\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\r\n messageBody += '08130000'; // heart display\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n //messageBody += '2'; //menu 1 no contact (menu 3) \r\n //messageBody += 'A'; //menu 1 and contact (menu 3) \r\n messageBody += (counter > 0) ? 'A' : '2';\r\n messageBody += '000000'; // other settings\r\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\r\n messageBody += '08030000'; // no displays\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n //messageBody += '0000000'; // no menu , //08 only contact\r\n //messageBody += '8'; // //08 only contact\r\n messageBody += (counter > 0) ? '8' : '0';\r\n messageBody += '000000'; // other settings\r\n} else {\r\n messageBody += '08030000'; //no displays\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n messageBody += '0000000'; // no menu..\r\n}\r\n// from autohome page to the end\r\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\r\nvalue += messageBody; //add watchsetting hex to contact hex in value var \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}","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":12388,"Group":{"Id":7454,"Name":"SPO2 Settings","Json":{"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":"Reporting Frequency","Json":"{\"name\":\"Reporting Frequency\",\"default\":\"\",\"description\":null,\"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\":\"720\",\"label\":\"12 hours\"},{\"value\":\"360\",\"label\":\"6 hours\"},{\"value\":\"60\",\"label\":\"1 hour\"},{\"value\":\"30\",\"label\":\"30 min\"}],\"toTranslate\":[\"name\",\"description\",\"helpText\",\"label\"]}","Default":"","Command":{"Id":5819,"Protocol":{"Id":297,"Code":"Access TEC Care Watch","Version":"1.6","FirmwareVersion":"V06.8601.2501","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":true},"Name":"setAuthorisedNumbersAndWatchSettings","TemplateSMS":null,"Template":"<>","AckTemplate":null,"Operation":"// Combinated version setAuthorisedNumber with Watch Settings for EV06\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// AB 10 22 00 32 FA 00 00 02 11 36 00 00 00 00 00 00 00 00 00 14 00 00 00 00 0A 00 0E 34 80 09 31 32 33 34 35 36 37 38 39 00 00\r\n// [Length]:11 [Key]:36 [Value]:00 00 00 00 00 00 00 00 00 14 00 00 00 00 0A 00\r\n//{\"watch\":{\"status18\":0,\"status17\":0,\"status19\":0,\"status10\":0,\"flagValue\":0,\"status12\":0,\"faceId\":0,\"status11\":0,\"status14\":0,\"status13\":0,\"status16\":0,\"status15\":0,\"status0\":0,\"status1\":0,\"menu8\":0,\"menu7\":0,\"menu6\":0,\"menu5\":0,\"menu4\":0,\"menu3\":0,\"menu2\":0,\"menu1\":0,\"autoTime\":20,\"brightNess\":0,\"logoIndex\":0,\"status20\":0,\"status8\":0,\"status9\":0,\"status2\":0,\"status3\":0,\"brightTime\":10}}\r\n//[Length]:0E [Key]:34 [Value]:80 09 31 32 33 34 35 36 37 38 39 00 00\r\n//{\"numberNamePhoto\":{\"call\":0,\"noCard\":0,\"number\":\"123456789\",\"enable\":1,\"sms\":0,\"name\":\"\",\"headURL\":\"\",\"index\":0}}\r\n// para pruebas en local Contact':\r\n//AB 10 12 00 94 ED 00 00 02 10 34 E0 09 31 32 33 34 35 36 37 38 39 02 79 6F 00\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 phoneNumber = '';\r\nvar numberLength = '00';\r\nvar numberHex = '';\r\nvar nameLength = '00';\r\nvar nameHex = '';\r\nvar value = '02';\r\nvar keyLength = '00';\r\nvar confTel = '';\r\nvar count = 1; // approved contact will be from A2 to A9 - index 1 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\ncounter = 0; // to check how many contacts are in the lists\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 += \"0534\" + 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 phoneNumber = params.ApprovedContacts[contact].Contact;\r\n if (phoneNumber.startsWith(\"+\")) {\r\n phoneNumber = \"00\" + phoneNumber.substring(1);\r\n }\r\n numberHex = ascii_to_hexa(phoneNumber).toUpperCase();\r\n numberLength = ('00' + decimalToHex(phoneNumber.length)).slice(-2).toUpperCase();\r\n nameHex = ascii_to_hexa(params.ApprovedContacts[contact].Name).toUpperCase();\r\n nameLength = ('00' + decimalToHex(params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\r\n keyLength = ('00' + decimalToHex(5 + phoneNumber.length + params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\r\n value += keyLength + \"34\" + confTel + numberLength + numberHex + nameLength + nameHex + '00'; //no photo\r\n //value += keyLength + \"30\" + confTel + numberHex; //no photo \r\n counter++;\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 phoneNumber = params.ApprovedContacts[contact].Contact;\r\n if (phoneNumber.startsWith(\"+\")) {\r\n phoneNumber = \"00\" + phoneNumber.substring(1);\r\n }\r\n numberHex = ascii_to_hexa(phoneNumber).toUpperCase();\r\n numberLength = ('00' + decimalToHex(phoneNumber.length)).slice(-2).toUpperCase();\r\n nameHex = ascii_to_hexa(params.ApprovedContacts[contact].Name).toUpperCase();\r\n nameLength = ('00' + decimalToHex(params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\r\n keyLength = ('00' + decimalToHex(5 + phoneNumber.length + params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\r\n value += keyLength + \"34\" + confTel + numberLength + numberHex + nameLength + nameHex + '00'; //no photo\r\n //value += keyLength + \"30\" + confTel + numberHex; //no photo \r\n counter++;\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 += \"0534\" + confTel + '000000'; //no number, no name, no photo\r\n}\r\n// watch settings section\r\n// lenght and key\r\nvar messageBody = '1136';\r\n// step count/heart value display\r\n// Watch setting related FACE ID\r\nmessageBody += '00'; // Default FACE ID 0 \r\n// Future\r\n//if (params.WatchFace.SetWatchFace) {\r\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \r\n//} else {\r\n// messageBody += '00'; // Analog Face Default FACE ID 0 \r\n//}\r\n// Watch Display setting related to Step and heart rate settings\r\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\r\n messageBody += '081B0000'; //both displays\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n messageBody += (counter > 0) ? 'E' : '6';\r\n //messageBody += '6'; //menu 1 and 2 \r\n //messageBody += 'E'; //menu 1 and 2 and contact (menu 3) \r\n messageBody += '000000'; // other settings\r\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\r\n messageBody += '080B0000'; // step display\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n //messageBody += '4'; //menu 2 \r\n //messageBody += 'C'; // menu 2 and contact (menu 3) \r\n messageBody += (counter > 0) ? 'C' : '4';\r\n messageBody += '000000'; // other settings\r\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\r\n messageBody += '08130000'; // heart display\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n //messageBody += '2'; //menu 1 no contact (menu 3) \r\n //messageBody += 'A'; //menu 1 and contact (menu 3) \r\n messageBody += (counter > 0) ? 'A' : '2';\r\n messageBody += '000000'; // other settings\r\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\r\n messageBody += '08030000'; // no displays\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n //messageBody += '0000000'; // no menu , //08 only contact\r\n //messageBody += '8'; // //08 only contact\r\n messageBody += (counter > 0) ? '8' : '0';\r\n messageBody += '000000'; // other settings\r\n} else {\r\n messageBody += '08030000'; //no displays\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n messageBody += '0000000'; // no menu..\r\n}\r\n// from autohome page to the end\r\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\r\nvalue += messageBody; //add watchsetting hex to contact hex in value var \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}","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":12359,"Group":{"Id":7415,"Name":"Steps Settings","Json":{"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":"Enable Disable Steps Settings","Json":"{\"name\":\"Enable Disable Steps Settings\",\"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":{"Id":5819,"Protocol":{"Id":297,"Code":"Access TEC Care Watch","Version":"1.6","FirmwareVersion":"V06.8601.2501","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":true},"Name":"setAuthorisedNumbersAndWatchSettings","TemplateSMS":null,"Template":"<>","AckTemplate":null,"Operation":"// Combinated version setAuthorisedNumber with Watch Settings for EV06\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// AB 10 22 00 32 FA 00 00 02 11 36 00 00 00 00 00 00 00 00 00 14 00 00 00 00 0A 00 0E 34 80 09 31 32 33 34 35 36 37 38 39 00 00\r\n// [Length]:11 [Key]:36 [Value]:00 00 00 00 00 00 00 00 00 14 00 00 00 00 0A 00\r\n//{\"watch\":{\"status18\":0,\"status17\":0,\"status19\":0,\"status10\":0,\"flagValue\":0,\"status12\":0,\"faceId\":0,\"status11\":0,\"status14\":0,\"status13\":0,\"status16\":0,\"status15\":0,\"status0\":0,\"status1\":0,\"menu8\":0,\"menu7\":0,\"menu6\":0,\"menu5\":0,\"menu4\":0,\"menu3\":0,\"menu2\":0,\"menu1\":0,\"autoTime\":20,\"brightNess\":0,\"logoIndex\":0,\"status20\":0,\"status8\":0,\"status9\":0,\"status2\":0,\"status3\":0,\"brightTime\":10}}\r\n//[Length]:0E [Key]:34 [Value]:80 09 31 32 33 34 35 36 37 38 39 00 00\r\n//{\"numberNamePhoto\":{\"call\":0,\"noCard\":0,\"number\":\"123456789\",\"enable\":1,\"sms\":0,\"name\":\"\",\"headURL\":\"\",\"index\":0}}\r\n// para pruebas en local Contact':\r\n//AB 10 12 00 94 ED 00 00 02 10 34 E0 09 31 32 33 34 35 36 37 38 39 02 79 6F 00\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 phoneNumber = '';\r\nvar numberLength = '00';\r\nvar numberHex = '';\r\nvar nameLength = '00';\r\nvar nameHex = '';\r\nvar value = '02';\r\nvar keyLength = '00';\r\nvar confTel = '';\r\nvar count = 1; // approved contact will be from A2 to A9 - index 1 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\ncounter = 0; // to check how many contacts are in the lists\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 += \"0534\" + 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 phoneNumber = params.ApprovedContacts[contact].Contact;\r\n if (phoneNumber.startsWith(\"+\")) {\r\n phoneNumber = \"00\" + phoneNumber.substring(1);\r\n }\r\n numberHex = ascii_to_hexa(phoneNumber).toUpperCase();\r\n numberLength = ('00' + decimalToHex(phoneNumber.length)).slice(-2).toUpperCase();\r\n nameHex = ascii_to_hexa(params.ApprovedContacts[contact].Name).toUpperCase();\r\n nameLength = ('00' + decimalToHex(params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\r\n keyLength = ('00' + decimalToHex(5 + phoneNumber.length + params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\r\n value += keyLength + \"34\" + confTel + numberLength + numberHex + nameLength + nameHex + '00'; //no photo\r\n //value += keyLength + \"30\" + confTel + numberHex; //no photo \r\n counter++;\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 phoneNumber = params.ApprovedContacts[contact].Contact;\r\n if (phoneNumber.startsWith(\"+\")) {\r\n phoneNumber = \"00\" + phoneNumber.substring(1);\r\n }\r\n numberHex = ascii_to_hexa(phoneNumber).toUpperCase();\r\n numberLength = ('00' + decimalToHex(phoneNumber.length)).slice(-2).toUpperCase();\r\n nameHex = ascii_to_hexa(params.ApprovedContacts[contact].Name).toUpperCase();\r\n nameLength = ('00' + decimalToHex(params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\r\n keyLength = ('00' + decimalToHex(5 + phoneNumber.length + params.ApprovedContacts[contact].Name.length)).slice(-2).toUpperCase();\r\n value += keyLength + \"34\" + confTel + numberLength + numberHex + nameLength + nameHex + '00'; //no photo\r\n //value += keyLength + \"30\" + confTel + numberHex; //no photo \r\n counter++;\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 += \"0534\" + confTel + '000000'; //no number, no name, no photo\r\n}\r\n// watch settings section\r\n// lenght and key\r\nvar messageBody = '1136';\r\n// step count/heart value display\r\n// Watch setting related FACE ID\r\nmessageBody += '00'; // Default FACE ID 0 \r\n// Future\r\n//if (params.WatchFace.SetWatchFace) {\r\n// messageBody += params.WatchFace.SetWatchFace; // Face ID \r\n//} else {\r\n// messageBody += '00'; // Analog Face Default FACE ID 0 \r\n//}\r\n// Watch Display setting related to Step and heart rate settings\r\nif ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\r\n messageBody += '081B0000'; //both displays\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n messageBody += (counter > 0) ? 'E' : '6';\r\n //messageBody += '6'; //menu 1 and 2 \r\n //messageBody += 'E'; //menu 1 and 2 and contact (menu 3) \r\n messageBody += '000000'; // other settings\r\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'true') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\r\n messageBody += '080B0000'; // step display\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n //messageBody += '4'; //menu 2 \r\n //messageBody += 'C'; // menu 2 and contact (menu 3) \r\n messageBody += (counter > 0) ? 'C' : '4';\r\n messageBody += '000000'; // other settings\r\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'true')) {\r\n messageBody += '08130000'; // heart display\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n //messageBody += '2'; //menu 1 no contact (menu 3) \r\n //messageBody += 'A'; //menu 1 and contact (menu 3) \r\n messageBody += (counter > 0) ? 'A' : '2';\r\n messageBody += '000000'; // other settings\r\n} else if ((params.StepsSettings.EnableDisableStepsSettings == 'false') && (params.HeartrateSettings.EnableDisableHeartrateSettings == 'false')) {\r\n messageBody += '08030000'; // no displays\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n //messageBody += '0000000'; // no menu , //08 only contact\r\n //messageBody += '8'; // //08 only contact\r\n messageBody += (counter > 0) ? '8' : '0';\r\n messageBody += '000000'; // other settings\r\n} else {\r\n messageBody += '08030000'; //no displays\r\n messageBody += (params.SPO2Settings.EnableDisableSPO2Settings === 'true') ? '4' : '0'; // Menu Oxigen\r\n messageBody += '0000000'; // no menu..\r\n}\r\n// from autohome page to the end\r\nmessageBody += '14000000030A01'; //Autohomepagetime, Brightness = 3, Brighttime = 10 seconds (0A), Logo index = 1\r\nvalue += messageBody; //add watchsetting hex to contact hex in value var \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}","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":"Command","Name":"actionFactoryReset","Message":"(Update) (actionFactoryReset) delete SMS Template and disable ACK","Timestamp":1748537885},{"Version":"0.2","UserName":"juanmi","Resource":"Command","Name":"actionFactoryReset","Message":"(Update) (actionFactoryReset) delete SMS template and disable ACK","Timestamp":1748537902},{"Version":"0.2","UserName":"juanmi","Resource":"Command","Name":"actionFactoryReset","Message":"(Update) (actionFactoryReset) delete SMS template and disable ACK","Timestamp":1748537937},{"Version":"0.2","UserName":"juanmi","Resource":"Command","Name":"actionFactoryReset","Message":"(Update) (actionFactoryReset) delete SMS template","Timestamp":1748538097},{"Version":"0.2","UserName":"juanmi","Resource":"Command","Name":"actionFactoryReset","Message":"(Update) (actionFactoryReset) disable ACK","Timestamp":1748538116},{"Version":"0.2","UserName":"Michael_Admin","Resource":"Command","Name":"actionFactoryReset","Message":"(Update) (actionFactoryReset) michael helping out ","Timestamp":1748547976},{"Version":"0.2","UserName":"juanmi","Resource":"Group","Name":"Approved Contacts","Message":"(Update) (Approved Contacts) Now we can have 8 approved contacts","Timestamp":1748619953},{"Version":"0.2","UserName":"juanmi","Resource":"MessageType","Name":"ACK-APN","Message":"(Update) (ACK-APN) test to save","Timestamp":1748619991},{"Version":"0.2","UserName":"juanmi","Resource":"Group","Name":"Approved Contacts","Message":"(Update) (Approved Contacts) Now we can add 8 approved contacts","Timestamp":1748622501},{"Version":"0.2","UserName":"juanmi","Resource":"Command","Name":"setEmergencySettings","Message":"(Update) (setEmergencySettings) Change Emergency contact to \"SOS Info\"","Timestamp":1748622805},{"Version":"0.2","UserName":"juanmi","Resource":"Command","Name":"actionFactoryReset","Message":"(Update) (actionFactoryReset) delete SMS template and disable ACK","Timestamp":1748623419},{"Version":"0.2","UserName":"juanmi","Resource":"Group","Name":"TeleHealth","Message":"(Create) (TeleHealth) Add Telehealth group","Timestamp":1748623706},{"Version":"0.2","UserName":"juanmi","Resource":"Group","Name":"TeleHealth Settings","Message":"(Update) (TeleHealth Settings) modify name","Timestamp":1748623754},{"Version":"0.2","UserName":"juanmi","Resource":"Group","Name":"TeleHealth Settings","Message":"(Update) (TeleHealth Settings) add description","Timestamp":1748623780},{"Version":"0.2","UserName":"juanmi","Resource":"Group","Name":"Read TeleHealth Settings","Message":"(Create) (Read TeleHealth Settings) New group Read TeleHealth Settings","Timestamp":1748623827},{"Version":"0.2","UserName":"juanmi","Resource":"GroupParam","Name":"Enable Disable Steps","Message":"(Create) (Enable Disable Steps) Read Enable/Disable Steps","Timestamp":1748624079},{"Version":"0.2","UserName":"juanmi","Resource":"GroupParam","Name":"Reporting Frequency","Message":"(Create) (Reporting Frequency) Read reporting frequency for Steps","Timestamp":1748624251},{"Version":"0.2","UserName":"juanmi","Resource":"Group","Name":"Read TeleHealth Settings","Message":"(Update) (Read TeleHealth Settings) add description","Timestamp":1748624307},{"Version":"0.2","UserName":"juanmi","Resource":"GroupParam","Name":"Enable Disable Steps","Message":"(Create) (Enable Disable Steps) Add Enable Disable Steps","Timestamp":1748624878},{"Version":"0.2","UserName":"juanmi","Resource":"Group","Name":"Read Steps Settings","Message":"(Create) (Read Steps Settings) Add group for steps","Timestamp":1748625010},{"Version":"0.2","UserName":"juanmi","Resource":"GroupParam","Name":"Enable Disable Read Steps Settings","Message":"(Create) (Enable Disable Read Steps Settings) add enable/disable read steps","Timestamp":1748625076},{"Version":"0.2","UserName":"juanmi","Resource":"GroupParam","Name":"Reporting Frequency","Message":"(Create) (Reporting Frequency) add read freq steps","Timestamp":1748625468},{"Version":"0.2","UserName":"juanmi","Resource":"Group","Name":"Read Heartrate Settings","Message":"(Create) (Read Heartrate Settings) add group Read heartrate","Timestamp":1748625569},{"Version":"0.2","UserName":"juanmi","Resource":"Group","Name":"Read Heartrate Settings","Message":"(Update) (Read Heartrate Settings) Reorder Groups","Timestamp":1748625577},{"Version":"0.2","UserName":"juanmi","Resource":"GroupParam","Name":"Enable Disable Read Heartrate Settings","Message":"(Create) (Enable Disable Read Heartrate Settings) Enable Disable Read Heartrate Settings","Timestamp":1748625605},{"Version":"0.2","UserName":"juanmi","Resource":"GroupParam","Name":"Reporting Frequency","Message":"(Create) (Reporting Frequency) Read freq heartrate","Timestamp":1748625683},{"Version":"0.2","UserName":"juanmi","Resource":"GroupParam","Name":"Reporting Frequency","Message":"(Create) (Reporting Frequency) add freq steps","Timestamp":1748625885},{"Version":"0.2","UserName":"juanmi","Resource":"Group","Name":"Steps Settings","Message":"(Create) (Steps Settings) add steps settings group","Timestamp":1748625950},{"Version":"0.2","UserName":"juanmi","Resource":"Group","Name":"Heartrate Settings","Message":"(Create) (Heartrate Settings) add heartrate settings","Timestamp":1748625984},{"Version":"0.2","UserName":"juanmi","Resource":"GroupParam","Name":"Enable Disable Steps Settings","Message":"(Create) (Enable Disable Steps Settings) add enable disable steps settings","Timestamp":1748626017},{"Version":"0.2","UserName":"juanmi","Resource":"GroupParam","Name":"Reporting Frequency","Message":"(Create) (Reporting Frequency) add freq steps","Timestamp":1748626066},{"Version":"0.2","UserName":"juanmi","Resource":"GroupParam","Name":"Enable Disable Heartrate Settings","Message":"(Create) (Enable Disable Heartrate Settings) add enable disable HR settings","Timestamp":1748626090},{"Version":"0.2","UserName":"juanmi","Resource":"GroupParam","Name":"Reporting Frequency","Message":"(Create) (Reporting Frequency) add freq HR","Timestamp":1748626142},{"Version":"0.2","UserName":"oysta@superadmin.com","Resource":"Command","Name":"getCurrentSettings2","Message":"(Update) (getCurrentSettings2) set parent as getcurrentsetting","Timestamp":1748863939},{"Version":"0.2","UserName":"oysta@superadmin.com","Resource":"Command","Name":"getCurrentSettings3","Message":"(Update) (getCurrentSettings3) set parent as getcurrentsetting","Timestamp":1748863952},{"Version":"0.2","UserName":"oysta@superadmin.com","Resource":"Command","Name":"getCurrentSettings4","Message":"(Update) (getCurrentSettings4) set parent as getcurrentsetting","Timestamp":1748863968},{"Version":"0.2","UserName":"oysta@superadmin.com","Resource":"Command","Name":"getCurrentSettings5","Message":"(Update) (getCurrentSettings5) set parent as getcurrentsetting","Timestamp":1748863982},{"Version":"0.2","UserName":"juanmi","Resource":"Command","Name":"setEmergencySettings","Message":"(Update) (setEmergencySettings) change name contact to \"SOS\"","Timestamp":1748938524},{"Version":"0.2","UserName":"juanmi","Resource":"Operation","Name":"Access TEC Care Watch","Message":"(Update) (Access TEC Care Watch) Minor change to check customID in case=\"24\"","Timestamp":1748968518},{"Version":"0.2","UserName":"juanmi","Resource":"Command","Name":"setHeartRateDetectingInterval","Message":"(Update) (setHeartRateDetectingInterval) Modify params name and fix some bugs","Timestamp":1748971251},{"Version":"0.2","UserName":"juanmi","Resource":"GroupParam","Name":"Enable Disable Heartrate Settings","Message":"(Update) (Enable Disable Heartrate Settings) assign command\n","Timestamp":1748971292},{"Version":"0.2","UserName":"juanmi","Resource":"GroupParam","Name":"Enable Disable Heartrate Settings","Message":"Associate groupParam Enable Disable Heartrate Settings to command setHeartRateDetectingInterval","Timestamp":1748971295},{"Version":"0.2","UserName":"juanmi","Resource":"GroupParam","Name":"Reporting Frequency","Message":"(Update) (Reporting Frequency) assign command and change values","Timestamp":1748971385},{"Version":"0.2","UserName":"juanmi","Resource":"GroupParam","Name":"Reporting Frequency","Message":"Associate groupParam Reporting Frequency to command setHeartRateDetectingInterval","Timestamp":1748971389},{"Version":"0.2","UserName":"juanmi","Resource":"Group","Name":"Read Heartrate Settings","Message":"(Update) (Read Heartrate Settings) Reorder Groups","Timestamp":1748971793},{"Version":"0.2","UserName":"juanmi","Resource":"Group","Name":"Read Steps Settings","Message":"(Update) (Read Steps Settings) Reorder Groups","Timestamp":1748971795},{"Version":"0.2","UserName":"juanmi","Resource":"GroupParam","Name":"Reporting Frequency","Message":"(Update) (Reporting Frequency) change values","Timestamp":1748971849},{"Version":"0.2","UserName":"juanmi","Resource":"GroupParam","Name":"Reporting Frequency","Message":"(Update) (Reporting Frequency) change values","Timestamp":1748971997},{"Version":"0.2","UserName":"juanmi","Resource":"Group","Name":"Steps Settings","Message":"(Update) (Steps Settings) Reorder Groups","Timestamp":1748972021},{"Version":"0.2","UserName":"juanmi","Resource":"GroupParam","Name":"Reporting Frequency","Message":"(Update) (Reporting Frequency) change values","Timestamp":1748972076},{"Version":"0.2","UserName":"juanmi","Resource":"Command","Name":"setStepCollectSettings","Message":"(Update) (setStepCollectSettings) Change params names and modify values","Timestamp":1748972510},{"Version":"0.2","UserName":"juanmi","Resource":"GroupParam","Name":"Enable Disable Steps Settings","Message":"(Update) (Enable Disable Steps Settings) assign command","Timestamp":1748972551},{"Version":"0.2","UserName":"juanmi","Resource":"GroupParam","Name":"Enable Disable Steps Settings","Message":"Associate groupParam Enable Disable Steps Settings to command setStepCollectSettings","Timestamp":1748972555},{"Version":"0.2","UserName":"juanmi","Resource":"GroupParam","Name":"Reporting Frequency","Message":"(Update) (Reporting Frequency) assign command","Timestamp":1748972586},{"Version":"0.2","UserName":"juanmi","Resource":"GroupParam","Name":"Reporting Frequency","Message":"Associate groupParam Reporting Frequency to command setStepCollectSettings","Timestamp":1748972589},{"Version":"0.2","UserName":"juanmi","Resource":"Command","Name":"setWatchSettings","Message":"(Create) (setWatchSettings) new command to set watch Face and HR and step function","Timestamp":1748973730},{"Version":"0.2","UserName":"juanmi","Resource":"GroupParam","Name":"Reporting Frequency","Message":"(Update) (Reporting Frequency) change values","Timestamp":1748974585},{"Version":"0.2","UserName":"juanmi","Resource":"Protocol","Name":null,"Message":"Small changes to version 1 and adding HRT and STEP function","Timestamp":1748974840},{"Version":"0.3","UserName":"juanmi","Resource":"MessageType","Name":"CON-ASSO","Message":"(Update) (CON-ASSO) change type to CON","Timestamp":1749036744},{"Version":"0.3","UserName":"juanmi","Resource":"GroupParam","Name":"Reporting Frequency","Message":"(Update) (Reporting Frequency) Hide param until new firmware version","Timestamp":1749052743},{"Version":"0.3","UserName":"juanmi","Resource":"GroupParam","Name":"Reporting Frequency","Message":"(Update) (Reporting Frequency) hide and unassign until new firmware","Timestamp":1749052795},{"Version":"0.3","UserName":"juanmi","Resource":"GroupParam","Name":"Reporting Frequency","Message":"Dissociate groupParam Reporting Frequency from command setStepCollectSettings","Timestamp":1749052799},{"Version":"0.3","UserName":"juanmi","Resource":"Operation","Name":"Access TEC Care Watch","Message":"(Update) (Access TEC Care Watch) create long connection it it is needed for command 01 and 03","Timestamp":1749057260},{"Version":"0.3","UserName":"juanmi","Resource":"Command","Name":"setStepCollectSettings","Message":"(Update) (setStepCollectSettings) multiply reporting time *60; //in seconds","Timestamp":1749057591},{"Version":"0.3","UserName":"juanmi","Resource":"Command","Name":"setHeartRateDetectingInterval","Message":"(Update) (setHeartRateDetectingInterval) multiply *60; reporting interval //in seconds","Timestamp":1749057629},{"Version":"0.3","UserName":"juanmi","Resource":"GroupParam","Name":"Reporting Frequency","Message":"(Update) (Reporting Frequency) add 30 minutes","Timestamp":1749057954},{"Version":"0.3","UserName":"juanmi","Resource":"Command","Name":"setEnableStep","Message":"(Create) (setEnableStep) new command for step enable","Timestamp":1749059198},{"Version":"0.3","UserName":"juanmi","Resource":"Operation","Name":"Access TEC Care Watch","Message":"(Update) (Access TEC Care Watch) comment //return to create long connection","Timestamp":1749108422},{"Version":"0.3","UserName":"juanmi","Resource":"Command","Name":"actionFactoryReset","Message":"(Update) (actionFactoryReset) add SMS command version","Timestamp":1749193448},{"Version":"0.3","UserName":"juanmi","Resource":"Command","Name":"actionFactoryReset","Message":"(Update) (actionFactoryReset) enable ACK and force by SMS","Timestamp":1749211988},{"Version":"0.3","UserName":"Michael_Admin","Resource":"GroupParam","Name":"Factory Reset","Message":"(Update) (Factory Reset) Michael taking off only via sms help text now we have SMS and is the default ","Timestamp":1749472684},{"Version":"0.3","UserName":"juanmi","Resource":"GroupParam","Name":"Enable Disable Steps Settings","Message":"(Update) (Enable Disable Steps Settings) change command to enable/disable Step","Timestamp":1749574292},{"Version":"0.3","UserName":"juanmi","Resource":"GroupParam","Name":"Enable Disable Steps Settings","Message":"Associate groupParam Enable Disable Steps Settings to command setEnableStep","Timestamp":1749574296},{"Version":"0.3","UserName":"juanmi","Resource":"GroupParam","Name":"Enable Disable Steps Settings","Message":"Dissociate groupParam Enable Disable Steps Settings from command setStepCollectSettings","Timestamp":1749574299},{"Version":"0.3","UserName":"juanmi","Resource":"GroupParam","Name":"Enable Disable Heartrate Settings","Message":"(Update) (Enable Disable Heartrate Settings) add setWatchSetting command to change display","Timestamp":1749574458},{"Version":"0.3","UserName":"juanmi","Resource":"GroupParam","Name":"Enable Disable Heartrate Settings","Message":"Associate groupParam Enable Disable Heartrate Settings to command setWatchSettings","Timestamp":1749574461},{"Version":"0.3","UserName":"juanmi","Resource":"GroupParam","Name":"Enable Disable Steps Settings","Message":"(Update) (Enable Disable Steps Settings) add setWatchSetting command to change display","Timestamp":1749574476},{"Version":"0.3","UserName":"juanmi","Resource":"GroupParam","Name":"Enable Disable Steps Settings","Message":"Associate groupParam Enable Disable Steps Settings to command setWatchSettings","Timestamp":1749574479},{"Version":"0.3","UserName":"juanmi","Resource":"Command","Name":"setWatchSettings","Message":"(Update) (setWatchSettings) modify params' names","Timestamp":1749574591},{"Version":"0.3","UserName":"juanmi","Resource":"Command","Name":"setWatchSettings","Message":"(Update) (setWatchSettings) disable SMS version","Timestamp":1749575829},{"Version":"0.3","UserName":"juanmi","Resource":"Command","Name":"setWatchSettings","Message":"(Update) (setWatchSettings) change settings to follow ticket definition","Timestamp":1749576611},{"Version":"0.3","UserName":"juanmi","Resource":"Command","Name":"getCurrentSettings","Message":"(Update) (getCurrentSettings) add step and HRate settings","Timestamp":1749577720},{"Version":"0.3","UserName":"juanmi","Resource":"Operation","Name":"Access TEC Care Watch","Message":"(Update) (Access TEC Care Watch) add Get HeartRate","Timestamp":1749579157},{"Version":"0.3","UserName":"juanmi","Resource":"Operation","Name":"Access TEC Care Watch","Message":"(Update) (Access TEC Care Watch) detecting interval Hrate to minutes","Timestamp":1749579352},{"Version":"0.3","UserName":"juanmi","Resource":"Operation","Name":"Access TEC Care Watch","Message":"(Update) (Access TEC Care Watch) add get Step Settings Status","Timestamp":1749580364},{"Version":"0.3","UserName":"juanmi","Resource":"Protocol","Name":null,"Message":"Add Heartrate and Steps","Timestamp":1749580597},{"Version":"0.4","UserName":"juanmi","Resource":"GroupParam","Name":"Reporting Frequency","Message":"(Delete) (Reporting Frequency)","Timestamp":1749655876},{"Version":"0.4","UserName":"juanmi","Resource":"GroupParam","Name":"Enable Disable Steps","Message":"(Delete) (Enable Disable Steps)","Timestamp":1749655895},{"Version":"0.4","UserName":"juanmi","Resource":"GroupParam","Name":"Enable Disable Steps","Message":"(Delete) (Enable Disable Steps)","Timestamp":1749656285},{"Version":"0.4","UserName":"juanmi","Resource":"GroupParam","Name":"Reporting Frequency","Message":"(Delete) (Reporting Frequency)","Timestamp":1749656300},{"Version":"0.4","UserName":"juanmi","Resource":"Protocol","Name":null,"Message":"Removed duplicated params from groups (Steps and Hrate)","Timestamp":1749656455},{"Version":"0.5","UserName":"juanmi","Resource":"Group","Name":"TeleHealth Settings","Message":"(Update) (TeleHealth Settings) Modify description of the group","Timestamp":1749657024},{"Version":"0.5","UserName":"juanmi","Resource":"Protocol","Name":null,"Message":"(TeleHealth Settings) Modify description of the group","Timestamp":1749657173},{"Version":"0.6","UserName":"Michael_Admin","Resource":"GroupParam","Name":"Find Device","Message":"(Update) (Find Device) Reorder Group Params","Timestamp":1750165349},{"Version":"0.6","UserName":"Michael_Admin","Resource":"GroupParam","Name":"Power Off","Message":"(Update) (Power Off) Reorder Group Params","Timestamp":1750165353},{"Version":"0.6","UserName":"Michael_Admin","Resource":"GroupParam","Name":"Reboot","Message":"(Update) (Reboot) Reorder Group Params","Timestamp":1750165357},{"Version":"0.6","UserName":"Michael_Admin","Resource":"GroupParam","Name":"Firmware Upgrade","Message":"(Update) (Firmware Upgrade) Reorder Group Params","Timestamp":1750165361},{"Version":"0.6","UserName":"Michael_Admin","Resource":"GroupParam","Name":"Factory Reset","Message":"(Update) (Factory Reset) Reorder Group Params","Timestamp":1750165365},{"Version":"0.6","UserName":"Michael_Admin","Resource":"GroupParam","Name":"Get Alert Settings","Message":"(Update) (Get Alert Settings) Reorder Group Params","Timestamp":1750165370},{"Version":"0.6","UserName":"Michael_Admin","Resource":"GroupParam","Name":"Get Firmware Version","Message":"(Update) (Get Firmware Version) Reorder Group Params","Timestamp":1750165375},{"Version":"0.6","UserName":"Michael_Admin","Resource":"GroupParam","Name":"Get Language / Performance","Message":"(Update) (Get Language / Performance) Reorder Group Params","Timestamp":1750165379},{"Version":"0.6","UserName":"juanmi","Resource":"GroupParam","Name":"SystemLanguage","Message":"(Update) (SystemLanguage) ticket: 1709297 EV06: Language support","Timestamp":1750272360},{"Version":"0.6","UserName":"Michael_Admin","Resource":"GroupParam","Name":"SystemLanguage","Message":"(Update) (SystemLanguage) removed Polish and German is eview confirm no support ","Timestamp":1750348556},{"Version":"0.6","UserName":"juanmi","Resource":"GroupParam","Name":"Enable Disable Non Movement Settings","Message":"(Update) (Enable Disable Non Movement Settings) hide until feature is implemented by Eview","Timestamp":1750696525},{"Version":"0.6","UserName":"juanmi","Resource":"GroupParam","Name":"Time","Message":"(Update) (Time) hide until feature is implemented by Eview","Timestamp":1750696539},{"Version":"0.6","UserName":"juanmi","Resource":"GroupParam","Name":"Enable Disable Non Movement Settings","Message":"(Update) (Enable Disable Non Movement Settings) hide until feature is implemented by Eview","Timestamp":1750696557},{"Version":"0.6","UserName":"juanmi","Resource":"GroupParam","Name":"Time","Message":"(Update) (Time) hide until feature is implemented by Eview","Timestamp":1750696570},{"Version":"0.6","UserName":"juanmi","Resource":"Operation","Name":"Access TEC Care Watch","Message":"(Update) (Access TEC Care Watch) customID can be \"3036\" or \"06\"","Timestamp":1750698902},{"Version":"0.6","UserName":"juanmi","Resource":"Protocol","Name":null,"Message":"customID can be \"3036\" or \"06\". Hide \"no motion alarm\", define new languages","Timestamp":1750700358},{"Version":"0.7","UserName":"juanmi","Resource":"GroupParam","Name":"Enable Disable Non Movement Settings","Message":"(Delete) (Enable Disable Non Movement Settings)","Timestamp":1751039678},{"Version":"0.7","UserName":"juanmi","Resource":"GroupParam","Name":"Time","Message":"(Delete) (Time)","Timestamp":1751039709},{"Version":"0.7","UserName":"juanmi","Resource":"Group","Name":"Read Non Movement Settings","Message":"(Delete) (Read Non Movement Settings)","Timestamp":1751039724},{"Version":"0.7","UserName":"juanmi","Resource":"GroupParam","Name":"Enable Disable Non Movement Settings","Message":"(Delete) (Enable Disable Non Movement Settings)","Timestamp":1751039756},{"Version":"0.7","UserName":"juanmi","Resource":"GroupParam","Name":"Time","Message":"(Delete) (Time)","Timestamp":1751039803},{"Version":"0.7","UserName":"juanmi","Resource":"Group","Name":"Non Movement Settings","Message":"(Delete) (Non Movement Settings)","Timestamp":1751039819},{"Version":"0.7","UserName":"juanmi","Resource":"Command","Name":"setWatchSettings","Message":"(Update) (setWatchSettings) no contact (menu 3) ticket 1735474","Timestamp":1751040656},{"Version":"0.7","UserName":"juanmi","Resource":"Protocol","Name":null,"Message":"Delete \"Non movement settings\" and hide Contacts Menu in watch screen","Timestamp":1751098416},{"Version":"0.8","UserName":"juanmi","Resource":"Operation","Name":"Access TEC Care Watch","Message":"(Update) (Access TEC Care Watch) ticket 1737797: fix get current config, commented \"no motion alert\"","Timestamp":1751358168},{"Version":"0.8","UserName":"juanmi","Resource":"Protocol","Name":null,"Message":" ticket 1737797: fix get current config, commented \"no motion alert\"","Timestamp":1751358450},{"Version":"0.9","UserName":"juanmi","Resource":"GroupParam","Name":"SystemLanguage","Message":"(Update) (SystemLanguage) Define new labels and values for languages","Timestamp":1751442394},{"Version":"0.9","UserName":"juanmi","Resource":"Protocol","Name":null,"Message":"Add new languages for voice","Timestamp":1751443647},{"Version":"1.0","UserName":"Sean-Admin","Resource":"Operation","Name":"Access TEC Care Watch","Message":"(Update) (Access TEC Care Watch) move allowedCID initialisation","Timestamp":1751886283},{"Version":"1.0","UserName":"Sean-Admin","Resource":"Protocol","Name":null,"Message":"Deploy allowedCID fix","Timestamp":1751886339},{"Version":"1.1","UserName":"juanmi","Resource":"Command","Name":"setEmergencySettings","Message":"(Update) (setEmergencySettings) ticket 1765817: change \"+\" by \"00\" in international number","Timestamp":1752596355},{"Version":"1.1","UserName":"juanmi","Resource":"Command","Name":"setAuthorisedNumbers","Message":"(Update) (setAuthorisedNumbers) ticket 1765817: match number with country code","Timestamp":1752596927},{"Version":"1.1","UserName":"juanmi","Resource":"Command","Name":"setAuthorisedNumbers","Message":"(Update) (setAuthorisedNumbers) ticket 1765817: fix phoneNumber lenght","Timestamp":1752597287},{"Version":"1.1","UserName":"juanmi","Resource":"Operation","Name":"Access TEC Care Watch","Message":"(Update) (Access TEC Care Watch) ticket 1796516: include location data in alarm msg","Timestamp":1754555071},{"Version":"1.1","UserName":"juanmi","Resource":"MessageType","Name":"ALA-F","Message":"(Create) (ALA-F) define Msg Type ALA-F Alarm finished","Timestamp":1758220159},{"Version":"1.1","UserName":"juanmi","Resource":"MessageType","Name":"ALA-F","Message":"(Update) (ALA-F) define as Warning","Timestamp":1758220240},{"Version":"1.1","UserName":"juanmi","Resource":"MessageType","Name":"ALA-TLT","Message":"(Create) (ALA-TLT) define msg type ALA Tilt","Timestamp":1758220352},{"Version":"1.1","UserName":"juanmi","Resource":"Operation","Name":"Access TEC Care Watch","Message":"(Update) (Access TEC Care Watch) Pull Request 393658: Ticket 1822799: AGPS bug location time and 1823723: Split msg and 1796516: In...","Timestamp":1758223135},{"Version":"1.1","UserName":"juanmi","Resource":"Protocol","Name":null,"Message":"Ticket 1822799: AGPS bug location time and 1823723: Split msg and 1796516: In...","Timestamp":1758223695},{"Version":"1.2","UserName":"Sean-Admin","Resource":"Operation","Name":"Access TEC Care Watch","Message":"(Update) (Access TEC Care Watch) fix hex_to_ascii","Timestamp":1758638721},{"Version":"1.2","UserName":"Sean-Admin","Resource":"Protocol","Name":null,"Message":"get config fix","Timestamp":1758639147},{"Version":"1.3","UserName":"juanmi","Resource":"Operation","Name":"Access TEC Care Watch","Message":"(Update) (Access TEC Care Watch) Ticket 1875500: Add GPS Location on SOS Alarm msg","Timestamp":1762887514},{"Version":"1.3","UserName":"juanmi","Resource":"Protocol","Name":null,"Message":"Ticket 1875500: Add GPS Location on SOS Alarm msg","Timestamp":1762890211},{"Version":"1.4","UserName":"juanmi","Resource":"Command","Name":"setSPOInterval","Message":"(Create) (setSPOInterval) create command to setSPOInterval","Timestamp":1762892227},{"Version":"1.4","UserName":"juanmi","Resource":"Group","Name":"SPO2 Settings","Message":"(Create) (SPO2 Settings) create group for SPO2 Settings","Timestamp":1762892832},{"Version":"1.4","UserName":"juanmi","Resource":"GroupParam","Name":"Enable Disable SPO2 Settings","Message":"(Create) (Enable Disable SPO2 Settings) Add Enable Disable SPO Settings","Timestamp":1762892924},{"Version":"1.4","UserName":"juanmi","Resource":"GroupParam","Name":"Enable Disable SPO2 Settings","Message":"Associate groupParam Enable Disable SPO2 Settings to command setSPOInterval","Timestamp":1762892927},{"Version":"1.4","UserName":"juanmi","Resource":"GroupParam","Name":"Enable Disable SPO2 Settings","Message":"Associate groupParam Enable Disable SPO2 Settings to command setWatchSettings","Timestamp":1762892929},{"Version":"1.4","UserName":"juanmi","Resource":"GroupParam","Name":"Reporting Frequency","Message":"(Create) (Reporting Frequency) Add Reporting Frequency param","Timestamp":1762893055},{"Version":"1.4","UserName":"juanmi","Resource":"GroupParam","Name":"Reporting Frequency","Message":"Associate groupParam Reporting Frequency to command setSPOInterval","Timestamp":1762893058},{"Version":"1.4","UserName":"juanmi","Resource":"Command","Name":"setSPOInterval","Message":"(Update) (setSPOInterval) modify command to set SPO2","Timestamp":1762893497},{"Version":"1.4","UserName":"juanmi","Resource":"Group","Name":"Read SPO2 Settings","Message":"(Create) (Read SPO2 Settings) Create group Read SPO2 Settings","Timestamp":1763059210},{"Version":"1.4","UserName":"juanmi","Resource":"GroupParam","Name":"Enable Disable Read SPO2 Settings","Message":"(Create) (Enable Disable Read SPO2 Settings) Enable Disable Read SPO2 Settings","Timestamp":1763059280},{"Version":"1.4","UserName":"juanmi","Resource":"GroupParam","Name":"Reporting Frequency","Message":"(Create) (Reporting Frequency) Reporting Frequency for Read SPO2 Settings","Timestamp":1763059374},{"Version":"1.4","UserName":"juanmi","Resource":"GroupParam","Name":"Reporting Frequency","Message":"(Update) (Reporting Frequency) modify value","Timestamp":1763059448},{"Version":"1.4","UserName":"juanmi","Resource":"Command","Name":"setWatchSettings","Message":"(Update) (setWatchSettings) add enable//disable menu for SPO2","Timestamp":1763060987},{"Version":"1.4","UserName":"juanmi","Resource":"Command","Name":"setWatchSettings","Message":"(Update) (setWatchSettings) fix small typo","Timestamp":1763107860},{"Version":"1.4","UserName":"juanmi","Resource":"Command","Name":"setWatchSettings","Message":"(Update) (setWatchSettings) small typo error","Timestamp":1763108274},{"Version":"1.4","UserName":"juanmi","Resource":"Command","Name":"setEnableStep","Message":"(Update) (setEnableStep) ticket 1946312","Timestamp":1763456936},{"Version":"1.4","UserName":"juanmi","Resource":"Protocol","Name":null,"Message":"ticket 1946312: Set Steps switches ON TCP Fast and half ticket 1913728:\nadd command and settings for SPO2","Timestamp":1763457055},{"Version":"1.5","UserName":"juanmi","Resource":"MessageType","Name":"HBP","Message":"(Create) (HBP) Create Msg Type for SPO2 data","Timestamp":1763492881},{"Version":"1.5","UserName":"juanmi","Resource":"MessageType","Name":"HBP","Message":"(Update) (HBP) change name","Timestamp":1763493293},{"Version":"1.5","UserName":"juanmi","Resource":"Operation","Name":"Access TEC Care Watch","Message":"(Update) (Access TEC Care Watch) Add parsering SPO2 data received from the device","Timestamp":1763493459},{"Version":"1.5","UserName":"juanmi","Resource":"MessageType","Name":"SPO2","Message":"(Update) (SPO2) change msg code to SPO2","Timestamp":1763494978},{"Version":"1.5","UserName":"juanmi","Resource":"MessageType","Name":"SPO2","Message":"(Update) (SPO2) add trust level","Timestamp":1763495262},{"Version":"1.5","UserName":"juanmi","Resource":"Operation","Name":"Access TEC Care Watch","Message":"(Update) (Access TEC Care Watch) add trust level on SPO2 data","Timestamp":1763495297},{"Version":"1.5","UserName":"juanmi","Resource":"Command","Name":"getCurrentSettings","Message":"(Update) (getCurrentSettings) Add Read SPO2 interval","Timestamp":1763495958},{"Version":"1.5","UserName":"juanmi","Resource":"Operation","Name":"Access TEC Care Watch","Message":"(Update) (Access TEC Care Watch) add parsering Read SPO2 settings from the device","Timestamp":1763496553},{"Version":"1.5","UserName":"juanmi","Resource":"Protocol","Name":null,"Message":"ticket 1913728:\nshow SPO2 values on Events and read settings for SPO2","Timestamp":1763557322},{"Version":"1.6","UserName":"juanmi","Resource":"Command","Name":"setWatchSettings","Message":"(Update) (setWatchSettings) enable always contact menu","Timestamp":1764099175},{"Version":"1.6","UserName":"juanmi","Resource":"Command","Name":"setWatchSettings","Message":"(Update) (setWatchSettings) Consulting the quantity of contacts in the whitelist to enable disable the contact menu","Timestamp":1764100032},{"Version":"1.6","UserName":"juanmi","Resource":"GroupParam","Name":"Contact","Message":"(Update) (Contact) Add setWatchSettings to enable//disable contact menu","Timestamp":1764100128},{"Version":"1.6","UserName":"juanmi","Resource":"GroupParam","Name":"Contact","Message":"Associate groupParam Contact to command setWatchSettings","Timestamp":1764100131},{"Version":"1.6","UserName":"juanmi","Resource":"Command","Name":"setWatchSettings","Message":"(Update) (setWatchSettings) obtain quantity with params.ApprovedContacts.length","Timestamp":1764100744},{"Version":"1.6","UserName":"juanmi","Resource":"Command","Name":"setWatchSettings","Message":"(Update) (setWatchSettings) fix counter > 0","Timestamp":1764101454},{"Version":"1.6","UserName":"juanmi","Resource":"GroupParam","Name":"Contact","Message":"(Update) (Contact) unselect setWatchSettings","Timestamp":1764101901},{"Version":"1.6","UserName":"juanmi","Resource":"GroupParam","Name":"Contact","Message":"Dissociate groupParam Contact from command setWatchSettings","Timestamp":1764101904},{"Version":"1.6","UserName":"juanmi","Resource":"GroupParam","Name":"Contact","Message":"(Update) (Contact) Associate command setWatchSettings to enable Contact Menu on watch screen","Timestamp":1764837345},{"Version":"1.6","UserName":"juanmi","Resource":"GroupParam","Name":"Contact","Message":"Associate groupParam Contact to command setWatchSettings","Timestamp":1764837349},{"Version":"1.6","UserName":"juanmi","Resource":"Command","Name":"setWatchSettings","Message":"(Update) (setWatchSettings) provide idToUpdate in the script","Timestamp":1764837636},{"Version":"1.6","UserName":"juanmi","Resource":"Command","Name":"setWatchSettings","Message":"(Update) (setWatchSettings) var notSend = false;","Timestamp":1764837717},{"Version":"1.6","UserName":"juanmi","Resource":"Command","Name":"setWatchSettings","Message":"(Update) (setWatchSettings) check if a number was deleted, and remove it from the list","Timestamp":1764838121},{"Version":"1.6","UserName":"juanmi","Resource":"Command","Name":"setWatchSettings","Message":"(Update) (setWatchSettings) remove changes","Timestamp":1764838305},{"Version":"1.6","UserName":"juanmi","Resource":"GroupParam","Name":"Contact","Message":"(Update) (Contact) unassing setWatchSettings","Timestamp":1764838452},{"Version":"1.6","UserName":"juanmi","Resource":"GroupParam","Name":"Contact","Message":"Dissociate groupParam Contact from command setWatchSettings","Timestamp":1764838456},{"Version":"1.6","UserName":"juanmi","Resource":"GroupParam","Name":"Reporting Frequency","Message":"(Update) (Reporting Frequency) add setwatchsettings","Timestamp":1764839109},{"Version":"1.6","UserName":"juanmi","Resource":"GroupParam","Name":"Reporting Frequency","Message":"Associate groupParam Reporting Frequency to command setWatchSettings","Timestamp":1764839113},{"Version":"1.6","UserName":"juanmi","Resource":"GroupParam","Name":"Reporting Frequency","Message":"(Update) (Reporting Frequency) add setwatchsettings","Timestamp":1764839130},{"Version":"1.6","UserName":"juanmi","Resource":"GroupParam","Name":"Reporting Frequency","Message":"Associate groupParam Reporting Frequency to command setWatchSettings","Timestamp":1764839134},{"Version":"1.6","UserName":"juanmi","Resource":"Command","Name":"setWatchSettings","Message":"(Update) (setWatchSettings) small fix","Timestamp":1764839274},{"Version":"1.6","UserName":"juanmi","Resource":"Command","Name":"setWatchSettings","Message":"(Update) (setWatchSettings) count the number or approved contacts","Timestamp":1764840000},{"Version":"1.6","UserName":"juanmi","Resource":"Command","Name":"setWatchSettings","Message":"(Update) (setWatchSettings) small fix","Timestamp":1764840561},{"Version":"1.6","UserName":"juanmi","Resource":"Command","Name":"setWatchSettings","Message":"(Update) (setWatchSettings) test","Timestamp":1764840793},{"Version":"1.6","UserName":"juanmi","Resource":"Command","Name":"setWatchSettings","Message":"(Update) (setWatchSettings) test","Timestamp":1764841065},{"Version":"1.6","UserName":"juanmi","Resource":"Command","Name":"setWatchSettings","Message":"(Update) (setWatchSettings) Count number of approved contacts","Timestamp":1764842271},{"Version":"1.6","UserName":"juanmi","Resource":"Command","Name":"setWatchSettings","Message":"(Update) (setWatchSettings) test","Timestamp":1764842718},{"Version":"1.6","UserName":"juanmi","Resource":"Command","Name":"setAuthorisedNumbersAndWatchSettings","Message":"(Create) (setAuthorisedNumbersAndWatchSettings) create setAuthorisedNumbersAndWatchSettings","Timestamp":1765217764},{"Version":"1.6","UserName":"juanmi","Resource":"Command","Name":"setWatchSettings","Message":"(Update) (setWatchSettings) small test","Timestamp":1765218047},{"Version":"1.6","UserName":"juanmi","Resource":"Command","Name":"setAuthorisedNumbersAndWatchSettings","Message":"(Update) (setAuthorisedNumbersAndWatchSettings) modified code to the command","Timestamp":1765219303},{"Version":"1.6","UserName":"juanmi","Resource":"GroupParam","Name":"Contact","Message":"(Update) (Contact) change command to setAuthorisedNumbersAndWatchSettings","Timestamp":1765219387},{"Version":"1.6","UserName":"juanmi","Resource":"GroupParam","Name":"Contact","Message":"Associate groupParam Contact to command setAuthorisedNumbersAndWatchSettings","Timestamp":1765219390},{"Version":"1.6","UserName":"juanmi","Resource":"GroupParam","Name":"Contact","Message":"Dissociate groupParam Contact from command setAuthorisedNumbers","Timestamp":1765219392},{"Version":"1.6","UserName":"juanmi","Resource":"Command","Name":"setAuthorisedNumbersAndWatchSettings","Message":"(Update) (setAuthorisedNumbersAndWatchSettings) compare count>2","Timestamp":1765219826},{"Version":"1.6","UserName":"juanmi","Resource":"Command","Name":"setAuthorisedNumbersAndWatchSettings","Message":"(Update) (setAuthorisedNumbersAndWatchSettings) insert code to count valid contacts","Timestamp":1765220298},{"Version":"1.6","UserName":"juanmi","Resource":"GroupParam","Name":"Enable Disable Heartrate Settings","Message":"(Update) (Enable Disable Heartrate Settings) modify commands: add new setAuthorisedNumbersAndWatchSettings","Timestamp":1765220584},{"Version":"1.6","UserName":"juanmi","Resource":"GroupParam","Name":"Enable Disable Heartrate Settings","Message":"Associate groupParam Enable Disable Heartrate Settings to command setAuthorisedNumbersAndWatchSettings","Timestamp":1765220587},{"Version":"1.6","UserName":"juanmi","Resource":"GroupParam","Name":"Enable Disable Heartrate Settings","Message":"Dissociate groupParam Enable Disable Heartrate Settings from command setWatchSettings","Timestamp":1765220589},{"Version":"1.6","UserName":"juanmi","Resource":"GroupParam","Name":"Reporting Frequency","Message":"(Update) (Reporting Frequency) modify commands: add new setAuthorisedNumbersAndWatchSettings","Timestamp":1765220655},{"Version":"1.6","UserName":"juanmi","Resource":"GroupParam","Name":"Reporting Frequency","Message":"Associate groupParam Reporting Frequency to command setAuthorisedNumbersAndWatchSettings","Timestamp":1765220658},{"Version":"1.6","UserName":"juanmi","Resource":"GroupParam","Name":"Reporting Frequency","Message":"Dissociate groupParam Reporting Frequency from command setWatchSettings","Timestamp":1765220661},{"Version":"1.6","UserName":"juanmi","Resource":"GroupParam","Name":"Enable Disable SPO2 Settings","Message":"(Update) (Enable Disable SPO2 Settings) modify commands: add new setAuthorisedNumbersAndWatchSettings","Timestamp":1765220695},{"Version":"1.6","UserName":"juanmi","Resource":"GroupParam","Name":"Enable Disable SPO2 Settings","Message":"Associate groupParam Enable Disable SPO2 Settings to command setAuthorisedNumbersAndWatchSettings","Timestamp":1765220698},{"Version":"1.6","UserName":"juanmi","Resource":"GroupParam","Name":"Enable Disable SPO2 Settings","Message":"Dissociate groupParam Enable Disable SPO2 Settings from command setWatchSettings","Timestamp":1765220701},{"Version":"1.6","UserName":"juanmi","Resource":"GroupParam","Name":"Reporting Frequency","Message":"(Update) (Reporting Frequency) modify commands: add new setAuthorisedNumbersAndWatchSettings","Timestamp":1765220728},{"Version":"1.6","UserName":"juanmi","Resource":"GroupParam","Name":"Reporting Frequency","Message":"Associate groupParam Reporting Frequency to command setAuthorisedNumbersAndWatchSettings","Timestamp":1765220731},{"Version":"1.6","UserName":"juanmi","Resource":"GroupParam","Name":"Reporting Frequency","Message":"Dissociate groupParam Reporting Frequency from command setWatchSettings","Timestamp":1765220733},{"Version":"1.6","UserName":"juanmi","Resource":"GroupParam","Name":"Enable Disable Steps Settings","Message":"(Update) (Enable Disable Steps Settings) modify commands: add new setAuthorisedNumbersAndWatchSettings","Timestamp":1765220760},{"Version":"1.6","UserName":"juanmi","Resource":"GroupParam","Name":"Enable Disable Steps Settings","Message":"Associate groupParam Enable Disable Steps Settings to command setAuthorisedNumbersAndWatchSettings","Timestamp":1765220764},{"Version":"1.6","UserName":"juanmi","Resource":"GroupParam","Name":"Enable Disable Steps Settings","Message":"Dissociate groupParam Enable Disable Steps Settings from command setWatchSettings","Timestamp":1765220766},{"Version":"1.6","UserName":"juanmi","Resource":"MessageType","Name":"STP","Message":"(Update) (STP) change <> for <>","Timestamp":1765478967},{"Version":"1.6","UserName":"juanmi","Resource":"MessageType","Name":"SPO2","Message":"(Update) (SPO2) change <> for <>","Timestamp":1765478989},{"Version":"1.6","UserName":"juanmi","Resource":"MessageType","Name":"HRT","Message":"(Update) (HRT) change <> for <>","Timestamp":1765479010},{"Version":"1.6","UserName":"juanmi","Resource":"Operation","Name":"Access TEC Care Watch","Message":"(Update) (Access TEC Care Watch) ticket 1819052: solving STEPS label","Timestamp":1765479698},{"Version":"1.6","UserName":"juanmi","Resource":"Operation","Name":"Access TEC Care Watch","Message":"(Update) (Access TEC Care Watch) solving HRT and SPO labels","Timestamp":1765479872},{"Version":"1.6","UserName":"juanmi","Resource":"Operation","Name":"Access TEC Care Watch","Message":"(Update) (Access TEC Care Watch) define labels as array","Timestamp":1765480260},{"Version":"1.6","UserName":"juanmi","Resource":"Operation","Name":"Access TEC Care Watch","Message":"(Update) (Access TEC Care Watch) create function normalizeLabels to output labels as array","Timestamp":1765480978},{"Version":"1.6","UserName":"juanmi","Resource":"Operation","Name":"Access TEC Care Watch","Message":"(Update) (Access TEC Care Watch) AddValue(codeValues, 'oysta_labels', labels);","Timestamp":1765481426},{"Version":"1.6","UserName":"juanmi","Resource":"Operation","Name":"Access TEC Care Watch","Message":"(Update) (Access TEC Care Watch) AddValue(codeValues, 'oysta_labels', params.rawlabel);","Timestamp":1765482205},{"Version":"1.6","UserName":"juanmi","Resource":"Operation","Name":"Access TEC Care Watch","Message":"(Update) (Access TEC Care Watch) AddValue(codeValues, 'oysta_labels', `['${params.rawlabel}]'`);","Timestamp":1765483605},{"Version":"1.6","UserName":"juanmi","Resource":"Operation","Name":"Access TEC Care Watch","Message":"(Update) (Access TEC Care Watch) small fix","Timestamp":1765483826},{"Version":"1.6","UserName":"juanmi","Resource":"Operation","Name":"Access TEC Care Watch","Message":"(Update) (Access TEC Care Watch) //console.log(dataToReceiver);","Timestamp":1765485094},{"Version":"1.6","UserName":"juanmi","Resource":"Operation","Name":"Access TEC Care Watch","Message":"(Update) (Access TEC Care Watch) uncomment console.log()","Timestamp":1765485476},{"Version":"1.6","UserName":"juanmi","Resource":"Operation","Name":"Access TEC Care Watch","Message":"(Update) (Access TEC Care Watch) change ' ' to \" \"","Timestamp":1765486097},{"Version":"1.6","UserName":"juanmi","Resource":"Operation","Name":"Access TEC Care Watch","Message":"(Update) (Access TEC Care Watch) console.log(JSON.stringify(dataToReceiver));","Timestamp":1765522431},{"Version":"1.6","UserName":"juanmi","Resource":"Operation","Name":"Access TEC Care Watch","Message":"(Update) (Access TEC Care Watch) maps as an array","Timestamp":1765522901},{"Version":"1.6","UserName":"juanmi","Resource":"Operation","Name":"Access TEC Care Watch","Message":"(Update) (Access TEC Care Watch) map labels as a string","Timestamp":1765523333}],"ProtocolActionObjects":[],"Tags":[{"Id":2220,"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}]} \ No newline at end of file